Completing parser to parse generic/template return types; adding standard method...
[iot2.git] / iotjava / iotrmi / C++ / sample / TestClass_Stub.hpp
1 #ifndef _TESTCLASS_STUB_HPP__
2 #define _TESTCLASS_STUB_HPP__
3
4 #include <iostream>
5 #include <thread>
6 #include "../IoTRMICall.hpp"
7 #include "../IoTRMIObject.hpp"
8 #include "TestClassInterface.hpp"
9 #include "CallBack_CBSkeleton.hpp"
10 #include "StructC.hpp"
11
12 using namespace std;
13
14 class TestClass_Stub : public TestClassInterface {
15         public:
16                 TestClass_Stub();
17                 TestClass_Stub(int _port, const char* _address, int _rev, bool* _bResult, vector<int> _ports);
18                 ~TestClass_Stub();
19
20                 void                            setA(int _int);
21                 void                            setB(float _float);
22                 void                            setC(string _string);
23                 string                          sumArray(vector<string> newA);
24                 //int64_t                               sumArray(vector<int> newA);
25                 int                                     setAndGetA(int newA);
26                 int                                     setACAndGetA(string newC, int newA);
27                 void                            registerCallback(CallBackInterface* _cb);
28                 void                            registerCallback(vector<CallBackInterface*>_cb);
29                 int                                     callBack();
30                 vector<data>            handleStruct(vector<data> vecData);
31                 vector<EnumC>           handleEnum(vector<EnumC> vecEn);
32                 void                            ____init_CallBack();    // thread
33                 void                            ____registerCallBack(); // tell the other side that we are ready
34
35         private:                
36                 int                                                     intA;
37                 float                                           floatB;
38                 string                                          stringC;
39                 //CallBackInterface                     cb;
40                 IoTRMICall                                      *rmiCall;
41                 string                                          address;
42                 vector<int>                                     ports;
43                 const static int                        objectId = 0;   // Default value is 0
44
45                 // Specific for callbacks
46                 IoTRMIObject                            *rmiObj;
47                 vector<CallBackInterface*>      vecCBObj;
48                 static int      objIdCnt;
49 };
50
51
52 int TestClass_Stub::objIdCnt = 0;
53
54
55 TestClass_Stub::TestClass_Stub() {
56
57         address = "";
58         rmiCall = NULL;
59 }
60
61
62 TestClass_Stub::TestClass_Stub(int _port, const char* _address, int _rev, bool* _bResult, vector<int> _ports) {
63
64         address = _address;
65         rmiCall = new IoTRMICall(_port, _address, _rev, _bResult);
66         ports = _ports;
67         // Start thread
68 //      thread th1 (&TestClass_Stub::____init_CallBack, this);
69 //      th1.detach();
70         //th1.join();
71 //      ____registerCallBack();
72 }
73
74
75 TestClass_Stub::~TestClass_Stub() {
76
77         if (rmiCall != NULL) {
78                 delete rmiCall;
79                 rmiCall = NULL;
80         }
81         if (rmiObj != NULL) {
82                 delete rmiObj;
83                 rmiObj = NULL;
84         }
85         // Special for callbacks!!!
86         for(CallBackInterface* cb : vecCBObj) {
87                 delete cb;
88                 cb = NULL;
89         }
90 }
91
92
93 // Callback handler thread
94 void TestClass_Stub::____init_CallBack() {
95
96         bool bResult = false;
97         rmiObj = new IoTRMIObject(ports[0], &bResult);
98         while (true) {
99                 char* method = rmiObj->getMethodBytes();
100                 int objId = IoTRMIObject::getObjectId(method);
101                 if (objId < vecCBObj.size()) {  // Check if still within range
102                         CallBack_CBSkeleton* skel = 
103                                 dynamic_cast<CallBack_CBSkeleton*> (vecCBObj.at(objId));
104                         skel->invokeMethod(rmiObj);
105                 } else {
106                         string error = "TestClass_Stub: Illegal object Id: " + to_string(objId);
107                         throw error;
108                 }
109         }
110 }
111
112
113 // Notify that callback thread is ready
114 void TestClass_Stub::____registerCallBack() {
115
116         int numParam = 3;
117         int methodId = 9;
118         string retType = "void";
119         string paramCls[] = { "int", "string", "int" };
120         int rev = 0;
121         void* paramObj[] = { &ports[0], &address, &rev };
122         void* retObj = NULL;
123         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
124 }
125
126
127 void TestClass_Stub::setA(int _int) {
128
129         int numParam = 1;
130         int methodId = 0;
131         string retType = "void";
132         string paramCls[] = { "int" };
133         void* paramObj[] = { &_int };
134         void* retObj = NULL;
135         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
136 }
137
138
139 void TestClass_Stub::setB(float _float) {
140
141         int numParam = 1;
142         int methodId = 1;
143         string retType = "void";
144         string paramCls[] = { "float" };
145         void* paramObj[] = { &_float };
146         void* retObj = NULL;
147         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
148 }
149
150
151 void TestClass_Stub::setC(string _string) {
152
153         int numParam = 1;
154         int methodId = 2;
155         string retType = "void";
156         string paramCls[] = { "string" };
157         void* paramObj[] = { &_string };
158         void* retObj = NULL;
159         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
160 }
161
162
163 string TestClass_Stub::sumArray(vector<string> newA) {
164
165         int numParam = 1;
166         int methodId = 3;
167         string retType = "string";
168         string paramCls[] = { "string[]" };
169         void* paramObj[] = { &newA };
170         string retVal = "";
171         void* retObj = &retVal;
172         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
173         return retVal;
174 }
175
176
177 /*int64_t TestClass_Stub::sumArray(vector<int> newA) {
178
179         int numParam = 1;
180         string sign = "sumArray(int[])";
181         string retType = "long";
182         string paramCls[] = { "int[]" };
183         void* paramObj[] = { &newA };
184         int64_t retVal = 0;
185         void* retObj = &retVal;
186         rmiCall->remoteCall(objectId, sign, retType, paramCls, paramObj, numParam, retObj);
187         return retVal;
188 }*/
189
190
191
192 int TestClass_Stub::setAndGetA(int newA) {
193
194         int numParam = 1;
195         int methodId = 4;
196         string retType = "int";
197         string paramCls[] = { "int" };
198         void* paramObj[] = { &newA };
199         int retVal = 0;
200         void* retObj = &retVal;
201         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
202         return retVal;
203 }
204
205
206 int TestClass_Stub::setACAndGetA(string newC, int newA) {
207
208         int numParam = 2;
209         int methodId = 5;
210         string retType = "int";
211         string paramCls[] = { "string", "int" };
212         void* paramObj[] = { &newC, &newA };
213         int retVal = 0;
214         void* retObj = &retVal;
215         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
216         return retVal;
217 }
218
219
220 void TestClass_Stub::registerCallback(CallBackInterface* _cb) {
221
222         //Should implement the callback here
223 }
224
225
226 void TestClass_Stub::registerCallback(vector<CallBackInterface*> _cb) {
227
228         for (CallBackInterface* cb: _cb) {
229                 CallBack_CBSkeleton* skel = new CallBack_CBSkeleton(cb, objIdCnt++);
230                 vecCBObj.push_back(skel);
231         }
232
233         int numParam = 1;
234         int methodId = 8;
235         string retType = "void";
236         string paramCls[] = { "int" };
237         int param1 = _cb.size();
238         void* paramObj[] = { &param1 };
239         void* retObj = NULL;
240         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
241 }
242
243
244 int TestClass_Stub::callBack() {
245
246         int numParam = 0;
247         int methodId = 6;
248         string retType = "int";
249         string paramCls[] = { };
250         void* paramObj[] = { };
251         int retVal = 0;
252         void* retObj = &retVal;
253         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
254         return retVal;
255 }
256
257
258 vector<data> TestClass_Stub::handleStruct(vector<data> vecData) {
259
260         int numParam = 1;
261         int methodId = 11;
262         string retType = "void";
263         string paramCls[] = { "int" };
264         int structsize = vecData.size();
265         void* paramObj[] = { &structsize };
266         void* retObj = NULL;
267         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
268
269         int numParam2 = 3*vecData.size();
270         int methodId2 = 10;
271         string retType2 = "int";
272         string paramCls2[numParam2];
273         void* paramObj2[numParam2];
274         int pos = 0;
275         for(int i = 0; i < vecData.size(); i++) {
276                 paramCls2[pos] = "string";
277                 paramObj2[pos] = &vecData[i].name; pos++;
278                 paramCls2[pos] = "float";
279                 paramObj2[pos] = &vecData[i].value; pos++;
280                 paramCls2[pos] = "int";
281                 paramObj2[pos] = &vecData[i].year; pos++;
282         }
283         // RETURN STRUCT OBJECT
284         // Get length of struct array
285         int structsize1 = 0;
286         void* retObj2 = { &structsize1 };
287         // IF we don't have returned struct objects, then it's just "void* retObj2 = NULL;"
288         rmiCall->remoteCall(objectId, methodId2, retType2, paramCls2, paramObj2, numParam2, retObj2);
289         cout << "Struct length: " << structsize1 << endl;
290
291         // Get the returned objects
292         string retCls[3*structsize1];
293         void* retObj3[3*structsize1];
294         int numRet = 3*structsize1;
295         // define array of everything
296         string param1[structsize1];
297         float param2[structsize1];
298         int param3[structsize1];
299         pos = 0;
300         for(int i=0; i < structsize1; i++) {
301                 retCls[pos] = "string";
302                 retObj3[pos++] = &param1[i];
303                 retCls[pos] = "float";
304                 retObj3[pos++] = &param2[i];
305                 retCls[pos] = "int";
306                 retObj3[pos++] = &param3[i];
307         }
308         rmiCall->getStructObjects(retCls, numRet, retObj3);
309         vector<data> dat(structsize1);
310         pos = 0;
311         for (int i=0; i < structsize1; i++) {
312                 dat[i].name = param1[i];
313                 dat[i].value = param2[i];
314                 dat[i].year = param3[i];
315         }
316
317         return dat;
318 }
319
320
321 vector<EnumC> TestClass_Stub::handleEnum(vector<EnumC> vecEn) {
322
323         int numParam = 1;
324         int numEl = vecEn.size();
325         int methodId = 12;
326         string retType = "int[]";
327         string paramCls[] = { "int[]" };
328         // Need to define this container for integer version of enum
329         vector<int> paramInt(numEl);
330         for(int i = 0; i < numEl; i++) {
331                 paramInt[i] = (int) vecEn[i]; // cast enum to integer
332         }
333         void* paramObj[] = { &paramInt };
334         // if no return value just
335         // void* retObj2 = NULL;
336         // This is with return value:
337         vector<int> retEnumInt;
338         void* retObj = &retEnumInt;
339         rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);
340         int enumsize1 = retEnumInt.size();
341         vector<EnumC> retVal(enumsize1);
342         for (int i=0; i < enumsize1; i++) {
343                 retVal[i] = (EnumC) retEnumInt[i];
344         }
345         return retVal;
346 }
347
348
349
350 #endif