+ // Write the init callback helper method
+ if (isCallbackMethod) {
+ writeInitCallbackCplusStub(callbackType, intDecl);
+ writeInitCallbackSendInfoCplusStub(intDecl);
+ }
+ }
+ }
+
+
+ /**
+ * HELPER: writeCallbackMethodBodyCplusStub() writes the callback method of the stub class
+ */
+ private void writeCallbackMethodBodyCplusStub(InterfaceDecl intDecl, List<String> methParams,
+ List<String> methPrmTypes, String method, String callbackType) {
+
+ // Check if this is single object, array, or list of objects
+ boolean isArrayOrList = false;
+ String callbackParam = null;
+ for (int i = 0; i < methParams.size(); i++) {
+
+ String paramType = methPrmTypes.get(i);
+ if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
+ String param = methParams.get(i);
+ if (isArrayOrList(paramType, param)) { // Generate loop
+ println("for (" + paramType + "* cb : " + getSimpleIdentifier(param) + ") {");
+ println(callbackType + "_CallbackSkeleton* skel = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
+ isArrayOrList = true;
+ callbackParam = getSimpleIdentifier(param);
+ } else
+ println(callbackType + "_CallbackSkeleton* skel = new " + callbackType + "_CallbackSkeleton(" +
+ getSimpleIdentifier(param) + ", objIdCnt++);");
+ println("vecCallbackObj.push_back(skel);");
+ if (isArrayOrList(paramType, param))
+ println("}");
+ }
+ }
+ println("int numParam = " + methParams.size() + ";");
+ println("int methodId = " + intDecl.getMethodNumId(method) + ";");
+ String retType = intDecl.getMethodType(method);
+ String retTypeC = checkAndGetCplusType(retType);
+ println("string retType = \"" + checkAndGetCplusArrayType(retTypeC) + "\";");
+ // Generate array of parameter types
+ print("string paramCls[] = { ");
+ for (int i = 0; i < methParams.size(); i++) {
+ String paramType = methPrmTypes.get(i);
+ if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
+ print("\"int\"");
+ } else { // Generate normal classes if it's not a callback object
+ String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
+ String prmType = checkAndGetCplusArrayType(paramTypeC, methParams.get(i));
+ print("\"" + prmType + "\"");
+ }
+ if (i != methParams.size() - 1) // Check if this is the last element
+ print(", ");
+ }
+ println(" };");
+ print("int ___paramCB = ");
+ if (isArrayOrList)
+ println(callbackParam + ".size();");
+ else
+ println("1;");
+ // Generate array of parameter objects
+ print("void* paramObj[] = { ");
+ for (int i = 0; i < methParams.size(); i++) {
+ String paramType = methPrmTypes.get(i);
+ if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
+ print("&___paramCB");
+ } else
+ print(getSimpleIdentifier(methParams.get(i)));
+ if (i != methParams.size() - 1)
+ print(", ");
+ }
+ println(" };");
+ // Check if this is "void"
+ if (retType.equals("void")) {
+ println("void* retObj = NULL;");
+ println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
+ } else { // We do have a return value
+ if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
+ println(checkAndGetCplusType(retType) + " retVal;");
+ else
+ println(checkAndGetCplusType(retType) + " retVal = " + generateCplusInitializer(retType) + ";");
+ println("void* retObj = &retVal;");
+ println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
+ println("return retVal;");