+ if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+ println("rmiObj->sendReturnObj(retObj, retCls, numRetObj);");
+ else
+ println("rmiObj->sendReturnObj(retObj, \"" + getEnumType(checkAndGetCplusArrayType(retTypeC)) + "\");");
+ }
+ }
+
+
+ /**
+ * HELPER: writeStructMembersCplusSkeleton() writes 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;
+ if (isArrayOrList(param, paramType)) { // An array or list
+ println("for(int i = 0; i < " + counter + "; i++) {");
+ }
+ // Set up variables
+ if (isArrayOrList(param, paramType)) { // 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" + 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" + i + ";");
+ }
+ }
+ println("int pos = 0;");
+ if (isArrayOrList(param, paramType)) { // An array or list
+ println("for(int i = 0; i < retLen; i++) {");
+ for (int i = 0; i < members.size(); i++) {
+ String prmTypeC = checkAndGetCplusType(memTypes.get(i));
+ String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
+ println("paramCls[pos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+ println("paramObj[pos++] = ¶m" + i + "[i];");
+ }
+ println("}");
+ } 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("paramCls[pos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+ println("paramObj[pos++] = ¶m" + i + ";");
+ }
+ }
+ }
+
+
+ /**
+ * HELPER: writeStructMembersInitCplusSkeleton() writes parameters 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(param, paramType)) { // An array or list
+ println("vector<" + simpleType + "> paramStruct" + i + ";");
+ } 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(param, paramType)) { // 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" + 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" + j + ";");
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * HELPER: writeStructReturnCplusSkeleton() writes parameters if struct is present
+ */
+ 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("rmiObj->sendReturnObj(retLenObj, \"int\");");
+ 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 paramTypeC = checkAndGetCplusType(memTypes.get(i));
+ String prmType = checkAndGetCplusArrayType(paramTypeC, members.get(i));
+ println("retCls[retPos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+ 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 paramTypeC = checkAndGetCplusType(memTypes.get(i));
+ String prmType = checkAndGetCplusArrayType(paramTypeC, members.get(i));
+ println("retCls[retPos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+ 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;
+ String callbackType = null;
+ print("int numParam = ");
+ writeLengthStructParamClassSkeleton(methParams, methPrmTypes, method, intDecl);
+ println(";");
+ println("string paramCls[numParam];");
+ println("void* paramObj[numParam];");
+ // 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 = paramType;
+ writeCallbackCplusNumStubs(methParams, methPrmTypes, callbackType);
+ println("paramCls[pos] = \"int\";");
+ println("paramObj[pos++] = &numStubs" + i + ";");
+ } else { // Generate normal classes if it's not a callback object
+ String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
+ String prmTypeC = checkAndGetCplusArrayType(paramTypeC, methParams.get(i));
+ if (isEnumClass(getSimpleType(paramTypeC))) { // Check if this is enum type
+ println("vector<int> paramEnumInt" + i + ";");
+ } else {
+ String methParamComplete = checkAndGetCplusArray(paramTypeC, methParams.get(i));
+ println(methParamComplete + ";");
+ }
+ println("paramCls[pos] = \"" + getEnumType(prmTypeC) + "\";");
+ if (isEnumClass(getSimpleType(paramType))) // Check if this is enum type
+ println("paramObj[pos++] = ¶mEnumInt" + i);
+ else
+ println("paramObj[pos++] = &" + getSimpleIdentifier(methParams.get(i)) + ";");
+ }
+ }
+ }
+ println("rmiObj->getMethodParams(paramCls, numParam, paramObj);");
+ if (isCallbackMethod)
+ writeCallbackCplusStubGeneration(methParams, methPrmTypes, callbackType);
+ checkAndWriteEnumTypeCplusSkeleton(methParams, methPrmTypes);
+ writeStructMembersInitCplusSkeleton(intDecl, methParams, methPrmTypes, method);
+ // Check if this is "void"
+ String retType = intDecl.getMethodType(method);
+ // Check if this is "void"
+ if (retType.equals("void")) {
+ print(methodId + "(");
+ for (int i = 0; i < methParams.size(); i++) {
+ String paramType = returnGenericCallbackType(methPrmTypes.get(i));
+ if (callbackClasses.contains(paramType))
+ print("stub" + i);
+ else if (isEnumClass(getSimpleType(paramType))) // Check if this is enum type
+ print("paramEnum" + i);
+ else if (isStructClass(getSimpleType(paramType))) // Struct type
+ print("paramStruct" + i);
+ else
+ print(getSimpleIdentifier(methParams.get(i)));
+ if (i != methParams.size() - 1) {
+ print(", ");
+ }
+ }
+ println(");");
+ } else { // We do have a return value
+ if (isEnumClass(getSimpleArrayType(getSimpleType(retType)))) // Enum type
+ print(checkAndGetCplusType(retType) + " retEnum = ");
+ else if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+ print(checkAndGetCplusType(retType) + " retStruct = ");
+ else
+ print(checkAndGetCplusType(retType) + " retVal = ");
+ print(methodId + "(");
+ for (int i = 0; i < methParams.size(); i++) {
+ String paramType = returnGenericCallbackType(methPrmTypes.get(i));
+ if (callbackClasses.contains(paramType))
+ print("stub" + i);
+ else if (isEnumClass(getSimpleType(paramType))) // Check if this is enum type
+ print("paramEnum" + i);
+ else if (isStructClass(getSimpleType(paramType))) // Struct type
+ print("paramStruct" + i);
+ else
+ print(getSimpleIdentifier(methParams.get(i)));
+ if (i != methParams.size() - 1) {
+ print(", ");
+ }
+ }
+ println(");");
+ checkAndWriteEnumRetTypeCplusSkeleton(retType);
+ if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+ writeStructReturnCplusSkeleton(getSimpleArrayType(getSimpleType(retType)), retType);
+ if (isEnumClass(getSimpleArrayType(getSimpleType(retType)))) // Enum type
+ println("void* retObj = &retEnumInt;");
+ else
+ if (!isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+ println("void* retObj = &retVal;");
+ String retTypeC = checkAndGetCplusType(retType);
+ if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+ println("rmiObj->sendReturnObj(retObj, retCls, numRetObj);");
+ else
+ println("rmiObj->sendReturnObj(retObj, \"" + getEnumType(checkAndGetCplusArrayType(retTypeC)) + "\");");