3124cf4ba204f7956b0d0bcd57db095cf0edee83
[iot2.git] / benchmarks / drivers / Cpp / LabRoom / Room_Skeleton.cpp
1 #include <iostream>
2 #include "Room_Skeleton.hpp"
3
4 using namespace std;
5
6 Room_Skeleton::Room_Skeleton(Room *_mainObj, int _portSend, int _portRecv) {
7         // Logging
8         int i=0;
9         string file = "Room_Skeleton_cpp" + to_string(i) + ".log";
10         while (ifstream(file.c_str())) {
11                 i++;
12                 file = "Room_Skeleton_cpp" + to_string(i) + ".log";
13         }
14         log.open(file);
15         log << "Port send: " << _portSend << endl;
16         log << "Port receive: " << _portRecv << endl;
17         bool _bResult = false;
18         mainObj = _mainObj;
19         rmiComm = new IoTRMICommServer(_portSend, _portRecv, &_bResult);
20         log << "Established connection with slave! Wait request invoke now..." << endl;
21         IoTRMIUtil::mapSkel->insert(make_pair(_mainObj, this));
22         IoTRMIUtil::mapSkelId->insert(make_pair(_mainObj, objectId));
23         rmiComm->registerSkeleton(objectId, &methodReceived);
24         thread th1 (&Room_Skeleton::___waitRequestInvokeMethod, this, this);
25         th1.join();
26 }
27
28 Room_Skeleton::Room_Skeleton(Room *_mainObj, IoTRMIComm *_rmiComm, int _objectId) {
29         bool _bResult = false;
30         mainObj = _mainObj;
31         rmiComm = _rmiComm;
32         objectId = _objectId;
33         rmiComm->registerSkeleton(objectId, &methodReceived);
34 }
35
36 Room_Skeleton::~Room_Skeleton() {
37         if (rmiComm != NULL) {
38                 delete rmiComm;
39                 rmiComm = NULL;
40         }
41 }
42
43 bool Room_Skeleton::didInitWaitInvoke() {
44         return didAlreadyInitWaitInvoke;
45 }
46
47 int Room_Skeleton::getRoomID() {
48         return mainObj->getRoomID();
49 }
50
51 void Room_Skeleton::___getRoomID(Room_Skeleton* skel) {
52         char* localMethodBytes = new char[methodLen];
53         memcpy(localMethodBytes, skel->methodBytes, methodLen);
54         didGetMethodBytes.exchange(true);
55         string paramCls[] = {  };
56         int numParam = 0;
57         void* paramObj[] = {  };
58         rmiComm->getMethodParams(paramCls, numParam, paramObj, localMethodBytes);
59         int retVal = getRoomID();
60         void* retObj = &retVal;
61         rmiComm->sendReturnObj(retObj, "int", localMethodBytes);
62         delete[] localMethodBytes;
63 }
64
65 void Room_Skeleton::___waitRequestInvokeMethod(Room_Skeleton* skel) {
66         skel->didAlreadyInitWaitInvoke = true;
67         while (true) {
68                 if (!methodReceived) {
69                         continue;
70                 }
71                 skel->methodBytes = skel->rmiComm->getMethodBytes();
72                 skel->methodLen = skel->rmiComm->getMethodLength();
73                 methodReceived = false;
74                 int _objectId = skel->rmiComm->getObjectId(skel->methodBytes);
75                 int methodId = skel->rmiComm->getMethodId(skel->methodBytes);
76                 if (_objectId == objectId) {
77                         if (set0Allowed.find(methodId) == set0Allowed.end()) {
78                                 cerr << "Object with object Id: " << _objectId << "  is not allowed to access method: " << methodId << endl;
79                                 return;
80                         }
81                 }
82                 else {
83                         continue;
84                 }
85                 switch (methodId) {
86                         case 0: {
87                                 thread th0 (&Room_Skeleton::___getRoomID, skel, skel);
88                                 th0.detach(); break;
89                         }
90                         default: 
91                         cerr << "Method Id " << methodId << " not recognized!" << endl;
92                         return;
93                 }
94         }
95 }
96
97 extern "C" void* createRoom_Skeleton(void** params) {
98         // Args: *_mainObj, int _portSend, int _portRecv
99         return new Room_Skeleton((Room*) params[0], *((int*) params[1]), *((int*) params[2]));
100 }
101
102 extern "C" void destroyRoom_Skeleton(void* t) {
103         Room_Skeleton* obj = (Room_Skeleton*) t;
104         delete obj;
105 }
106
107 extern "C" void initRoom_Skeleton(void* t) {
108 }
109
110 int main() {
111         return 0;
112 }