+ // Write the return value part
+ writeMethodHelperReturnCplusSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod,
+ callbackType, methodId, callbackClasses);
+ }
+
+
+ /**
+ * HELPER: writeStructMembersCplusSkeleton() writes member parameters of struct
+ */
+ private void writeStructMembersCplusSkeleton(String simpleType, String paramType,
+ String param, String method, InterfaceDecl intDecl, int iVar) {
+
+ // Get the struct declaration for this struct and generate initialization code
+ StructDecl structDecl = getStructDecl(simpleType);
+ List<String> memTypes = structDecl.getMemberTypes(simpleType);
+ List<String> members = structDecl.getMembers(simpleType);
+ int methodNumId = intDecl.getMethodNumId(method);
+ String counter = "struct" + methodNumId + "Size" + iVar;
+ // Set up variables
+ if (isArrayOrList(paramType, param)) { // An array or list
+ for (int i = 0; i < members.size(); i++) {
+ String prmTypeC = checkAndGetCplusType(memTypes.get(i));
+ String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
+ println(getSimpleType(getEnumType(prmType)) + " param" + iVar + i + "[" + counter + "];");
+ }
+ } else { // Just one struct element
+ for (int i = 0; i < members.size(); i++) {
+ String prmTypeC = checkAndGetCplusType(memTypes.get(i));
+ String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
+ println(getSimpleType(getEnumType(prmType)) + " param" + iVar + i + ";");
+ }
+ }
+ if (isArrayOrList(paramType, param)) { // An array or list
+ println("for(int i = 0; i < " + counter + "; i++) {");
+ }
+ if (isArrayOrList(paramType, param)) { // An array or list
+ for (int i = 0; i < members.size(); i++) {
+ String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+ println("paramCls[pos] = \"" + prmTypeC + "\";");
+ println("paramObj[pos++] = ¶m" + iVar + i + "[i];");
+ }
+ println("}");
+ } else { // Just one struct element
+ for (int i = 0; i < members.size(); i++) {
+ String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+ println("paramCls[pos] = \"" + prmTypeC + "\";");
+ println("paramObj[pos++] = ¶m" + iVar + i + ";");
+ }
+ }
+ }
+
+
+ /**
+ * HELPER: writeStructMembersInitCplusSkeleton() writes member parameters initialization of struct
+ */
+ private void writeStructMembersInitCplusSkeleton(InterfaceDecl intDecl, List<String> methParams,
+ List<String> methPrmTypes, String method) {
+
+ for (int i = 0; i < methParams.size(); i++) {
+ String paramType = methPrmTypes.get(i);
+ String param = methParams.get(i);
+ String simpleType = getGenericType(paramType);
+ if (isStructClass(simpleType)) {
+ int methodNumId = intDecl.getMethodNumId(method);
+ String counter = "struct" + methodNumId + "Size" + i;
+ // Declaration
+ if (isArrayOrList(paramType, param)) { // An array or list
+ println("vector<" + simpleType + "> paramStruct" + i + "(" + counter + ");");
+ } else
+ println(simpleType + " paramStruct" + i + ";");
+ // Initialize members
+ StructDecl structDecl = getStructDecl(simpleType);
+ List<String> members = structDecl.getMembers(simpleType);
+ List<String> memTypes = structDecl.getMemberTypes(simpleType);
+ if (isArrayOrList(paramType, param)) { // An array or list
+ println("for(int i = 0; i < " + counter + "; i++) {");
+ for (int j = 0; j < members.size(); j++) {
+ print("paramStruct" + i + "[i]." + getSimpleIdentifier(members.get(j)));
+ println(" = param" + i + j + "[i];");
+ }
+ println("}");
+ } else { // Just one struct element
+ for (int j = 0; j < members.size(); j++) {
+ print("paramStruct" + i + "." + getSimpleIdentifier(members.get(j)));
+ println(" = param" + i + j + ";");
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * HELPER: writeStructReturnCplusSkeleton() writes parameters of struct for return statement
+ */
+ private void writeStructReturnCplusSkeleton(String simpleType, String retType) {
+
+ // Minimum retLen is 1 if this is a single struct object
+ if (isArrayOrList(retType, retType))
+ println("int retLen = retStruct.size();");
+ else // Just single struct object
+ println("int retLen = 1;");
+ println("void* retLenObj = &retLen;");
+ println("rmiComm->sendReturnObj(retLenObj, \"int\", localMethodBytes);");
+ int numMem = getNumOfMembers(simpleType);
+ println("int numRetObj = " + numMem + "*retLen;");
+ println("string retCls[numRetObj];");
+ println("void* retObj[numRetObj];");
+ println("int retPos = 0;");
+ // Get the struct declaration for this struct and generate initialization code
+ StructDecl structDecl = getStructDecl(simpleType);
+ List<String> memTypes = structDecl.getMemberTypes(simpleType);
+ List<String> members = structDecl.getMembers(simpleType);
+ if (isArrayOrList(retType, retType)) { // An array or list
+ println("for(int i = 0; i < retLen; i++) {");
+ for (int i = 0; i < members.size(); i++) {
+ String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+ println("retCls[retPos] = \"" + prmTypeC + "\";");
+ print("retObj[retPos++] = &retStruct[i].");
+ print(getEnumParam(memTypes.get(i), getSimpleIdentifier(members.get(i)), i));
+ println(";");
+ }
+ println("}");
+ } else { // Just one struct element
+ for (int i = 0; i < members.size(); i++) {
+ String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+ println("retCls[retPos] = \"" + prmTypeC + "\";");
+ print("retObj[retPos++] = &retStruct.");
+ print(getEnumParam(memTypes.get(i), getSimpleIdentifier(members.get(i)), i));
+ println(";");
+ }
+ }
+
+ }
+
+
+ /**
+ * HELPER: writeMethodHelperStructCplusSkeleton() writes the struct in skeleton
+ */
+ private void writeMethodHelperStructCplusSkeleton(InterfaceDecl intDecl, List<String> methParams,
+ List<String> methPrmTypes, String method, String methodId, Set<String> callbackClasses) {
+
+ // Generate array of parameter objects
+ boolean isCallbackMethod = false;
+ Set<String> callbackType = new HashSet<String>();
+ print("int numParam = ");
+ writeLengthStructParamClassSkeleton(methParams, methPrmTypes, method, intDecl);
+ println(";");
+ println("string paramCls[numParam];");
+ println("void* paramObj[numParam];");
+ println("int pos = 0;");
+ // Iterate again over the parameters
+ for (int i = 0; i < methParams.size(); i++) {
+ String paramType = methPrmTypes.get(i);
+ String param = methParams.get(i);
+ String simpleType = getGenericType(paramType);
+ if (isStructClass(simpleType)) {
+ writeStructMembersCplusSkeleton(simpleType, paramType, param, method, intDecl, i);
+ } else {
+ String prmType = returnGenericCallbackType(methPrmTypes.get(i));
+ if (callbackClasses.contains(prmType)) {
+ isCallbackMethod = true;
+ //callbackType = prmType;
+ callbackType.add(prmType);
+ //println("int numStubs" + i + " = 0;");
+ println("vector<int> numStubIdArray" + i + ";");
+ println("paramCls[pos] = \"int*\";");
+ println("paramObj[pos++] = &numStubIdArray" + i + ";");
+ } else { // Generate normal classes if it's not a callback object
+ String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
+ if (isEnumClass(getGenericType(paramTypeC))) { // Check if this is enum type
+ println("vector<int> paramEnumInt" + i + ";");
+ } else {
+ String methParamComplete = checkAndGetCplusArray(paramTypeC, methParams.get(i));
+ println(methParamComplete + ";");
+ }
+ String prmTypeC = checkAndGetCplusArgClsType(methPrmTypes.get(i), methParams.get(i));
+ println("paramCls[pos] = \"" + prmTypeC + "\";");
+ if (isEnumClass(getGenericType(paramType))) // Check if this is enum type
+ println("paramObj[pos++] = ¶mEnumInt" + i + ";");
+ else
+ println("paramObj[pos++] = &" + getSimpleIdentifier(methParams.get(i)) + ";");
+ }
+ }
+ }
+ // Write the return value part
+ writeMethodHelperReturnCplusSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod,
+ callbackType, methodId, callbackClasses);
+ }
+
+
+ /**
+ * HELPER: writeMethodHelperDeclCplusSkeleton() writes the method helper declarations of the skeleton class
+ */
+ private void writeMethodHelperDeclCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, String newSkelClass) {
+
+ // Use this set to handle two same methodIds
+ Set<String> uniqueMethodIds = new HashSet<String>();
+ for (String method : methods) {
+
+ List<String> methParams = intDecl.getMethodParams(method);
+ List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+ if (isStructPresent(methParams, methPrmTypes)) { // Treat struct differently
+ String methodId = intDecl.getMethodId(method);
+ print("void ___");
+ String helperMethod = methodId;
+ if (uniqueMethodIds.contains(methodId))
+ helperMethod = helperMethod + intDecl.getMethodNumId(method);
+ else
+ uniqueMethodIds.add(methodId);
+ String retType = intDecl.getMethodType(method);
+ print(helperMethod + "(");
+ boolean begin = true;
+ for (int i = 0; i < methParams.size(); i++) { // Print size variables
+ String paramType = methPrmTypes.get(i);
+ String param = methParams.get(i);
+ String simpleType = getGenericType(paramType);
+ if (isStructClass(simpleType)) {
+ if (!begin) // Generate comma for not the beginning variable
+ print(", ");
+ else
+ begin = false;
+ int methodNumId = intDecl.getMethodNumId(method);
+ print("int struct" + methodNumId + "Size" + i);
+ }
+ }
+ println(", " + newSkelClass + "* skel);");
+ } else {
+ String methodId = intDecl.getMethodId(method);
+ print("void ___");
+ String helperMethod = methodId;
+ if (uniqueMethodIds.contains(methodId))
+ helperMethod = helperMethod + intDecl.getMethodNumId(method);
+ else
+ uniqueMethodIds.add(methodId);
+ // Check if this is "void"
+ String retType = intDecl.getMethodType(method);
+ println(helperMethod + "(" + newSkelClass + "* skel);");
+ }
+ }
+ // Write method helper for structs
+ writeMethodHelperStructDeclSetupCplusSkeleton(methods, intDecl, newSkelClass);
+ }
+
+
+ /**
+ * HELPER: writeMethodHelperStructDeclSetupCplusSkeleton() writes the struct method helper declaration in skeleton class
+ */
+ private void writeMethodHelperStructDeclSetupCplusSkeleton(Collection<String> methods,
+ InterfaceDecl intDecl, String newSkelClass) {
+
+ // Use this set to handle two same methodIds
+ for (String method : methods) {
+
+ List<String> methParams = intDecl.getMethodParams(method);
+ List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+ // Check for params with structs