mkdir -p $(BIN_DIR)/iotrmi/C++
#$(G++) iotrmi/C++/IoTSocketServer.cpp -o $(BIN_DIR)/iotrmi/C++/IoTSocketServer.out
#$(G++) iotrmi/C++/IoTSocketClient.cpp -o $(BIN_DIR)/iotrmi/C++/IoTSocketClient.out
- #$(G++) iotrmi/C++/IoTRMICall.cpp -o $(BIN_DIR)/iotrmi/C++/IoTRMICall.out --std=c++11
- #$(G++) iotrmi/C++/IoTRMIObject.cpp -o $(BIN_DIR)/iotrmi/C++/IoTRMIObject.out --std=c++11
+ $(G++) iotrmi/C++/IoTRMICall.cpp -o $(BIN_DIR)/iotrmi/C++/IoTRMICall.out --std=c++11
+ $(G++) iotrmi/C++/IoTRMIObject.cpp -o $(BIN_DIR)/iotrmi/C++/IoTRMIObject.out --std=c++11
mkdir -p $(BIN_DIR)/iotrmi/C++/sample
- #$(G++) iotrmi/C++/sample/TestClass.cpp -o $(BIN_DIR)/iotrmi/C++/sample/TestClass.out --std=c++11
- #$(G++) iotrmi/C++/sample/TestClass_Stub.cpp -o $(BIN_DIR)/iotrmi/C++/sample/TestClass_Stub.out --std=c++11
- #$(G++) iotrmi/C++/sample/TestClass_Skeleton.cpp -o $(BIN_DIR)/iotrmi/C++/sample/TestClass_Skeleton.out --std=c++11
+ $(G++) iotrmi/C++/sample/TestClass.cpp -o $(BIN_DIR)/iotrmi/C++/sample/TestClass.out --std=c++11
+ $(G++) iotrmi/C++/sample/TestClass_Stub.cpp -o $(BIN_DIR)/iotrmi/C++/sample/TestClass_Stub.out --std=c++11
+ $(G++) iotrmi/C++/sample/TestClass_Skeleton.cpp -o $(BIN_DIR)/iotrmi/C++/sample/TestClass_Skeleton.out --std=c++11
PHONY += run-rmiserver
run-rmiserver:
class IoTRMICall {
public:
- IoTRMICall(int _port, const char* _address, int _rev, bool* _bResult);
+ IoTRMICall(int _port, const char* _address, int _rev, bool* _bResult, string _methodSign[], int _size);
~IoTRMICall();
// Public methods
int methodLength(string paramCls[], void* paramObj[], int numParam);
void* paramObj[], int numParam, void* retObj);
private:
- IoTRMIUtil *rmiUtil;
- IoTSocketClient *rmiClient;
+ map<string,int> mapSign2MethodId;
+ IoTRMIUtil *rmiUtil;
+ IoTSocketClient *rmiClient;
+
+ // Private methods
+ void getMethodIds(string methodSign[], int size);
};
// Constructor
-IoTRMICall::IoTRMICall(int _port, const char* _address, int _rev, bool* _bResult) {
+IoTRMICall::IoTRMICall(int _port, const char* _address, int _rev, bool* _bResult, string _methodSign[], int _size) {
+ getMethodIds(_methodSign, _size);
rmiUtil = new IoTRMIUtil();
if (rmiUtil == NULL) {
perror("IoTRMICall: IoTRMIUtil isn't initialized!");
// Get method ID in bytes
char methodId[IoTRMIUtil::METHOD_ID_LEN];
- IoTRMIUtil::getHashCodeBytes(methodSign, methodId);
+ int methId = mapSign2MethodId.find(methodSign)->second;
+ IoTRMIUtil::intToByteArray(methId, methodId);
memcpy(method, methodId, IoTRMIUtil::METHOD_ID_LEN);
int pos = IoTRMIUtil::METHOD_ID_LEN;
// Get byte arrays and calculate method bytes length
}
+// *************
+// Helpers
+// *************
+void IoTRMICall::getMethodIds(string methodSign[], int size) {
+
+ for(int i = 0; i < size; i++) {
+ mapSign2MethodId[methodSign[i]] = i;
+ }
+}
+
+
+
#endif
void** getMethodParams(string paramCls[], int numParam, void* paramObj[]);
private:
- map<int,string> mapHash2Sign;
+ map<int,string> mapMethodId2Sign;
IoTRMIUtil *rmiUtil;
IoTSocketServer *rmiServer;
char* methodBytes;
int methodId = 0;
IoTRMIUtil::byteArrayToInt(&methodId, methodIdBytes);
- return mapHash2Sign.find(methodId)->second;
+ return mapMethodId2Sign.find(methodId)->second;
}
void IoTRMIObject::getMethodIds(string methodSign[], int size) {
for(int i = 0; i < size; i++) {
- int methodId = IoTRMIUtil::hashCode(methodSign[i]);
- mapHash2Sign[methodId] = methodSign[i];
+ mapMethodId2Sign[i] = methodSign[i];
}
}
IoTRMICall *rmiCall;
string address;
//vector<int> ports;
+
+ const static int size = 8;
+ string methodSignatures[size] = {
+
+ "voidsetA(int)",
+ "voidsetB(float)",
+ "voidsetC(string)",
+ "sumArray(string[])",
+ //"sumArray(int[])",
+ "intsetAndGetA(int)",
+ "intsetACAndGetA(string,int)",
+ "intcallBack()",
+ "voidregisterCallBack(CallBackInterface)"
+ };
};
TestClass_Stub::TestClass_Stub(int _port, const char* _address, int _rev, bool* _bResult) {
address = _address;
- rmiCall = new IoTRMICall(_port, _address, _rev, _bResult);
+ rmiCall = new IoTRMICall(_port, _address, _rev, _bResult, methodSignatures, size);
}
*/
private IoTRMIUtil rmiUtil;
private IoTSocketClient rmiClient;
+ private List<String> listMethodId; // Map from method ID to signature
/**
* Constructors
*/
- public IoTRMICall(int _port, String _address, int _rev) throws IOException {
+ public IoTRMICall(int _port, String _address, int _rev, String[] _methodSign) throws IOException {
rmiUtil = new IoTRMIUtil();
rmiClient = new IoTSocketClient(_port, _address, _rev);
+ listMethodId = Arrays.asList(_methodSign); // Initialize the method ID map
}
public byte[] methodToBytes(String methodSign, Class<?>[] paramCls, Object[] paramObj) {
// Get method ID in bytes
- byte[] methodId = IoTRMIUtil.getHashCodeBytes(methodSign);
+ int methId = listMethodId.indexOf(methodSign);
+ byte[] methodId = IoTRMIUtil.intToByteArray(methId);
// Get byte arrays and calculate method bytes length
int numbParam = paramObj.length;
return method;
}
-
+
public static void main(String[] args) throws Exception {
String[] test = { "123", "456", "789" };
/**
* Class Properties
*/
- private Map<Integer,String> mapHash2Sign; // Map from hashcode(method ID) to signature
+ private List<String> listMethodId2Sign; // List of method signature (we use list index as method Id)
private IoTRMIUtil rmiUtil;
private IoTSocketServer rmiServer;
private byte[] methodBytes;
IllegalAccessException, IOException {
rmiUtil = new IoTRMIUtil();
- mapHash2Sign = new HashMap<Integer,String>();
+ listMethodId2Sign = Arrays.asList(_methodSign); // Initialize the method ID list
methodBytes = null;
- getMethodIds(_methodSign); // Initialize the method ID map
rmiServer = new IoTSocketServer(_port);
rmiServer.connect();
}
System.arraycopy(methodBytes, 0, methodIdBytes, 0, IoTRMIUtil.METHOD_ID_LEN);
// Get method Id
int methodId = IoTRMIUtil.byteArrayToInt(methodIdBytes);
- // Get method signature from the Map
- return mapHash2Sign.get(methodId);
+ // Get method signature from the list
+ return listMethodId2Sign.get(methodId);
}
return paramObj;
}
-
-
- /**
- * getMethodIds() gets methods identifiers (hash code) and store them in the Map
- */
- private void getMethodIds(String[] methodSign) {
-
- for (String sign : methodSign) {
- byte[] hashCode = IoTRMIUtil.getHashCodeBytes(sign);
- int methodId = IoTRMIUtil.byteArrayToInt(hashCode);
- mapHash2Sign.put(methodId, sign);
- }
- }
}
retObj = getParamObjectArray(type, paramBytes);
// Set
// e.g. Set<String> - type = Set.class, genTypeVal = String.class
- } else if (type == Set.class) {
- retObj = getParamSetObject(genTypeVal, paramBytes);
+ /*} else if (type == Set.class) {
+ retObj = getParamSetObject(genTypeVal, paramBytes);*/
// List
} else if (type == List.class) {
retObj = getParamListObject(genTypeVal, paramBytes);
// Map
// e.g. Map<String,Integer> - type = Map.class, genTypeKey = String.class, genTypeVal = Integer.class
- } else if (type == Map.class) {
- retObj = getParamMapObject(genTypeKey, genTypeVal, paramBytes);
+ /*} else if (type == Map.class) {
+ retObj = getParamMapObject(genTypeKey, genTypeVal, paramBytes);*/
} else
throw new Error("IoTRMIUtil: Unrecognizable type: " + type.getName());
} else if ( (type == String[].class) ||
(type == String.class)) {
retObj = (Object) byteArrayToStringArray(paramBytes);
+ } else if (type.isArray()) {
+ // This is an array but it's more than 1 dimension, e.g. 2-dimensional,
+ // 3-dimensional, etc.
+ // for loop to check inner array perhaps using object
+ // then call this function recursively
+ // combine the result altogether
+
} else
throw new Error("IoTRMIUtil: Unrecognizable type: " + type.getName());
} else if (obj.getClass().isArray()) {
retObjBytes = getArrayObjectBytes(obj);
// Set and its implementations
- } else if (obj instanceof Set<?>) {
- retObjBytes = setToByteArray((Set<?>) obj);
+ /*} else if (obj instanceof Set<?>) {
+ retObjBytes = setToByteArray((Set<?>) obj);*/
// List and its implementations
} else if (obj instanceof List<?>) {
retObjBytes = listToByteArray((List<?>) obj);
// Map and its implementations
- } else if (obj instanceof Map<?,?>) {
- retObjBytes = mapToByteArray((Map<?,?>) obj);
+ /*} else if (obj instanceof Map<?,?>) {
+ retObjBytes = mapToByteArray((Map<?,?>) obj);*/
} else
throw new Error("IoTRMIUtil: Unrecognizable object: " + obj.getClass());
// Collection data structures
- public static byte[] setToByteArray(Set<?> set) {
+ /*public static byte[] setToByteArray(Set<?> set) {
// Find out the class of the type
Iterator<?> it = set.iterator();
byte[] arrObjBytes = getArrayObjectBytes(arrObj);
return arrObjBytes;
- }
+ }*/
public static byte[] listToByteArray(List<?> list) {
// Convert keySet of a Map
- public static byte[] mapKeyToByteArray(Map<?,?> map) {
+ /*public static byte[] mapKeyToByteArray(Map<?,?> map) {
// Map<K,V>
// Find out the class of the type for K
throw new Error("IoTRMIUtil: Unrecognizable object: " + genericType.getSimpleName());
return retSet;
- }
+ }*/
// Get a List object from bytes
// Get a Key array for Map object from bytes
- public static Object getParamMapObject(Class<?> genTypeKey, Class<?> genTypeVal, byte[] paramBytes) {
+ /*public static Object getParamMapObject(Class<?> genTypeKey, Class<?> genTypeVal, byte[] paramBytes) {
// The complete set of bytes always consists of all keys followed by all values - <K,V> pairs
// Calculate number of elements
IoTRMITypes.arraysToMap(retMap, retObjKey, retObjVal);
return retMap;
- }
+ }*/
/**
//boolean data = false;
//char data = 'c';
- float data = 1234.123f;
+// float data = 1234.123f;
//double data = 12.51231234;
//long data = 1234l;
//short data = 1234;
//int data = 12345678;
- byte[] result = floatToByteArray(data);
- System.out.println("Result: " + Arrays.toString(result));
- System.out.println("Converted back: " + byteArrayToFloat(result));
+// byte[] result = floatToByteArray(data);
+// System.out.println("Result: " + Arrays.toString(result));
+// System.out.println("Converted back: " + byteArrayToFloat(result));
+
+ //String str = "methodA(int,string,float,double,double)";
+ //int hash = str.hashCode();
+ //System.out.println("Hash value: " + hash);
+
+ int[][] multi = new int[][] {
+ { 1, 2, 3 },
+ { 6, 5, 4},
+ { 11, 17, 13}
+ };
+
+ for (int[] inner : multi ) {
+ System.out.println("New row!");
+ for (Object i : inner) {
+ System.out.println("Element i: " + i);
+ }
+ System.out.println("Change row!\n");
+ }
+
+ int[] int1 = { 1, 2, 3 };
+ int[] int2 = { 6, 5, 4 };
+ int[] result = new int[int1.length + int2.length];
+ System.arraycopy(int1, 0, result, 0, int1.length);
+ System.arraycopy(int2, 0, result, int1.length, int2.length);
- String str = "methodA(int,string,float,double,double)";
- int hash = str.hashCode();
- System.out.println("Hash value: " + hash);
+ System.out.println("Combined array: " + Arrays.toString(result));
}
}
*/
private IoTRMICall rmiCall;
+ private String[] methodSignatures = {
+
+ "intprintInt()",
+ "voidsetInt(int)"
+ };
+
/**
* Constructors
*/
public CallBack_Stub(int _port, String _address, int _rev) throws IOException {
- rmiCall = new IoTRMICall(_port, _address, _rev);
+ rmiCall = new IoTRMICall(_port, _address, _rev, methodSignatures);
}
*/
private final static int NUM_CB_OBJ = 1;
+ private String[] methodSignatures = {
+
+ "voidsetA(int)",
+ "voidsetB(float)",
+ "voidsetC(string)",
+ "sumArray(string[])",
+ "intsetAndGetA(int)",
+ "intsetACAndGetA(string,int)",
+ "intcallBack()",
+ "voidregisterCallBack(CallBackInterface)"
+ };
+
/**
* Constructors
*/
address = _address;
ports = _ports;
- rmiCall = new IoTRMICall(_port, _address, _rev);
+ rmiCall = new IoTRMICall(_port, _address, _rev, methodSignatures);
}