Working C++ IoTSlave for both IoTSet and IoTRelation; threading works for C++ LifxLig...
[iot2.git] / iotjava / iotruntime / cpp / iotslave / IoTSlave.cpp
index 82e53bd08e9d474ca1452c8e53efe305539398e8..38dcf721e8e56f59a461a8e39992cbabed2e76de 100644 (file)
@@ -7,7 +7,7 @@
 
 IoTSlave::IoTSlave(string _serverAddress, int _serverPort, string _objectName) {
 
-       isDriverObject = false;         // Default to false
+       //isDriverObject = false;               // Default to false
        serverAddress = _serverAddress;
        serverPort = _serverPort;
        objectName = _objectName;
@@ -269,7 +269,7 @@ void IoTSlave::instantiateStubObject() {
        params[3] = &rev;
        bool result = false;
        params[4] = &result;
-       params[5] = &ports;
+       params[5] = ports;
        writeToFile("Stub Object " + objectStubClass + " created for " + objectClassName);
        objStubCls = create_object(params);
 }
@@ -311,6 +311,7 @@ int IoTSlave::recvInteger() {
        char recvInt[sizeof(int)];                      // Normally 4 bytes
 
        // Receive and iterate until complete
+       //writeToFile("Receiving Integer! Size: " + to_string(toBeReceived));
        recvIter(recvInt, toBeReceived);
 
        int retVal = 0;
@@ -343,6 +344,7 @@ string IoTSlave::recvString() {
        char* recvStr = new char[strLen];
 
        // Receive and iterate until complete
+       //writeToFile("Receiving String! Size: " + to_string(strLen));
        recvIter(recvStr, strLen);
 
        string retVal(recvStr, strLen);
@@ -417,6 +419,7 @@ void IoTSlave::createObject() {
        objectStubPort = recvInteger(); sendAck();
        writeToFile("=> Driver object stub port: " + to_string(objectStubPort));
        int numOfArgs = recvInteger(); sendAck();
+       writeToFile("=> Number of args: " + to_string(numOfArgs));
        for (int i = 0; i < numOfArgs; i++) {
                string arg = recvString(); sendAck();
                args.push_back(arg);
@@ -465,7 +468,7 @@ void IoTSlave::getDeviceIoTSetObject() {
        writeToFile("=> Inserting IoTDeviceAddress into set...");
        writeToFile("==> Now we have " + to_string(isetObject->size()) + " object(s)!");
        // Set flag to true;
-       isDriverObject = true;
+       //isDriverObject = true;
 }
 
 
@@ -481,6 +484,8 @@ void IoTSlave::createStub() {
                instantiateStubObject();
                mapObjNameStub.insert(make_pair(objectName,objStubCls));
                writeToFile("=> Map has: " + to_string(mapObjNameStub.size()) + " members");
+               // vector<int> for ports has been copied - now delete it
+               delete ports;
        }
 }
 
@@ -509,14 +514,26 @@ void IoTSlave::reinitializeIoTSetField() {
 
        // Create object if this is for driver object
        // Right now we assume that this needs only one object per device
-       if (isDriverObject) {
+       /*if (isDriverObject) {
                // Instantiate driver object
                getObjectHandler(objectClassName);
                instantiateDriverObject();
                // Instantiate skeleton object
                getObjectHandler(objectSkelClass);
                instantiateSkelObject();
-       }
+       }*/
+}
+
+
+// Instantiate driver object
+void IoTSlave::createDriverObject() {
+
+       // Instantiate driver object
+       getObjectHandler(objectClassName);
+       instantiateDriverObject();
+       // Instantiate skeleton object
+       getObjectHandler(objectSkelClass);
+       instantiateSkelObject();
 }
 
 
@@ -526,7 +543,7 @@ void IoTSlave::createNewIoTRelation() {
        objectFieldName = recvString(); sendAck();
        // Instantiating new IoTSet object
        irelObject = new unordered_multimap<void*,void*>();
-       writeToFile("Creating new IoTSet for field: " + objectFieldName);
+       writeToFile("Creating new IoTRelation for field: " + objectFieldName);
 }
 
 
@@ -548,9 +565,10 @@ void IoTSlave::getIoTSetRelationObject() {
        objectStubPort = recvInteger(); sendAck();
        writeToFile("=> Driver object stub port: " + to_string(objectStubPort));
        int numOfPorts = recvInteger(); sendAck();
+       ports = new vector<int>();
        for (int i = 0; i < numOfPorts; i++) {
                int port = recvInteger(); sendAck();
-               ports.push_back(port);
+               ports->push_back(port);
                writeToFile("==> Got a new port: " + to_string(port));
        }
 }
@@ -578,6 +596,7 @@ void IoTSlave::getIoTRelationSecondObject() {
        irelSecondObject = objStubCls;
        writeToFile("=> Holding second stub object...");
        pair<void*,void*>* iotrelPair = new pair<void*,void*>(irelFirstObject, irelSecondObject);
+       writeToFile("=> Creating a pair of stub objects and inserting into IoTRelation object...");
        irelObject->insert(*iotrelPair);
 }
 
@@ -697,6 +716,10 @@ void IoTSlave::commIoTMaster() {
                                invokeInitMethod();
                                break;
 
+                       case CREATE_DRIVER_OBJECT:
+                               createDriverObject();
+                               break;
+
                        case END_SESSION:
                                // END of session
                                goto ENDLOOP;