c51102f4fef2ddbdfdcaad07eb77df05d0797cdc
[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         bool _bResult = false;
8         mainObj = _mainObj;
9         rmiComm = new IoTRMICommServer(_portSend, _portRecv, &_bResult);
10         IoTRMIUtil::mapSkel->insert(make_pair(_mainObj, this));
11         IoTRMIUtil::mapSkelId->insert(make_pair(_mainObj, objectId));
12         rmiComm->registerSkeleton(objectId, &methodReceived);
13         thread th1 (&Room_Skeleton::___waitRequestInvokeMethod, this, this);
14         th1.join();
15 }
16
17 Room_Skeleton::Room_Skeleton(Room *_mainObj, IoTRMIComm *_rmiComm, int _objectId) {
18         bool _bResult = false;
19         mainObj = _mainObj;
20         rmiComm = _rmiComm;
21         objectId = _objectId;
22         rmiComm->registerSkeleton(objectId, &methodReceived);
23 }
24
25 Room_Skeleton::~Room_Skeleton() {
26         if (rmiComm != NULL) {
27                 delete rmiComm;
28                 rmiComm = NULL;
29         }
30 }
31
32 bool Room_Skeleton::didInitWaitInvoke() {
33         return didAlreadyInitWaitInvoke;
34 }
35
36 int Room_Skeleton::getRoomID() {
37         return mainObj->getRoomID();
38 }
39
40 void Room_Skeleton::___getRoomID(Room_Skeleton* skel) {
41         char* localMethodBytes = new char[methodLen];
42         memcpy(localMethodBytes, skel->methodBytes, methodLen);
43         didGetMethodBytes.exchange(true);
44         string paramCls[] = {  };
45         int numParam = 0;
46         void* paramObj[] = {  };
47         rmiComm->getMethodParams(paramCls, numParam, paramObj, localMethodBytes);
48         int retVal = getRoomID();
49         void* retObj = &retVal;
50         rmiComm->sendReturnObj(retObj, "int", localMethodBytes);
51         delete[] localMethodBytes;
52 }
53
54 void Room_Skeleton::___waitRequestInvokeMethod(Room_Skeleton* skel) {
55         skel->didAlreadyInitWaitInvoke = true;
56         while (true) {
57                 if (!methodReceived) {
58                         continue;
59                 }
60                 skel->methodBytes = skel->rmiComm->getMethodBytes();
61                 skel->methodLen = skel->rmiComm->getMethodLength();
62                 methodReceived = false;
63                 int _objectId = skel->rmiComm->getObjectId(skel->methodBytes);
64                 int methodId = skel->rmiComm->getMethodId(skel->methodBytes);
65                 if (_objectId == objectId) {
66                         if (set0Allowed.find(methodId) == set0Allowed.end()) {
67                                 cerr << "Object with object Id: " << _objectId << "  is not allowed to access method: " << methodId << endl;
68                                 return;
69                         }
70                 }
71                 else {
72                         continue;
73                 }
74                 switch (methodId) {
75                         case 0: {
76                                 thread th0 (&Room_Skeleton::___getRoomID, skel, skel);
77                                 th0.detach(); break;
78                         }
79                         default: 
80                         cerr << "Method Id " << methodId << " not recognized!" << endl;
81                         return;
82                 }
83         }
84 }
85
86 extern "C" void* createRoom_Skeleton(void** params) {
87         // Args: *_mainObj, int _portSend, int _portRecv
88         return new Room_Skeleton((Room*) params[0], *((int*) params[1]), *((int*) params[2]));
89 }
90
91 extern "C" void destroyRoom_Skeleton(void* t) {
92         Room_Skeleton* obj = (Room_Skeleton*) t;
93         delete obj;
94 }
95
96 extern "C" void initRoom_Skeleton(void* t) {
97 }
98
99
100 int main() {
101         return 0;
102 }