Merge branch 'cloud-interface'
[platform/upstream/iotivity.git] / service / easy-setup / sampleapp / enrollee / tizen-sdb / EnrolleeSample / enrolleewifi.cpp
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21
22 #include "easysetup.h"
23 #include "easysetup_wifi_conn.h"
24
25 #include <unistd.h>
26 #include <string.h>
27 #include <iostream>
28 #include <pthread.h>
29 #include <glib.h>
30 #include <limits>
31 #include <unistd.h>
32 #define TAG "TIZEN_ES"
33
34 using namespace std;
35
36 gboolean mainThread(GIOChannel *source, GIOCondition condition, gpointer data);
37 void *listeningFunc(void *);
38
39 GMainLoop *gMainloop;
40 static pthread_t gThreadHandle = 0;
41
42
43 /**
44  * Secure Virtual Resource database for Iotivity Server
45  * It contains Server's Identity and the PSK credentials
46  * of other devices which the server trusts
47  */
48 static char CRED_FILE[] = "oic_svr_db_server.dat";
49
50 OCPersistentStorage ps;
51
52 /**
53  * @var gIsSecured
54  * @brief Variable to check if secure mode is enabled or not.
55  */
56 static bool gIsSecured = false;
57 static bool gWiFiCBflag = false;
58 static char gSSID[OIC_STRING_MAX_VALUE];
59 static char gPasswd[OIC_STRING_MAX_VALUE];
60
61 void WiFiProvCbInApp(ESWiFiProvData *eventData)
62 {
63     cout << "WiFiProvCbInApp IN" << endl;
64     gWiFiCBflag = true;
65
66     ESSetState(ES_STATE_CONNECTING_TO_ENROLLER);
67
68     if(eventData == NULL)
69     {
70         cout << "ESWiFiProvData is NULL" << endl;
71         return ;
72     }
73
74     cout << "SSID : " << eventData->ssid << endl;
75     cout << "Password : " << eventData->pwd << endl;
76     cout << "AuthType : " << eventData->authtype << endl;
77     cout << "EncType : " << eventData->enctype << endl;
78
79     memset(gSSID, 0, OIC_STRING_MAX_VALUE);
80     memset(gPasswd, 0, OIC_STRING_MAX_VALUE);
81     if(eventData->ssid != NULL)
82     {
83         strncpy(gSSID, eventData->ssid, strlen(eventData->ssid));
84     }
85
86     if(eventData->pwd != NULL)
87     {
88         strncpy(gPasswd, eventData->pwd, strlen(eventData->pwd));
89     }
90
91     cout << "WiFiProvCbInApp OUT" << endl;
92 }
93
94 void DevConfProvCbInApp(ESDevConfProvData *eventData)
95 {
96     cout << "DevConfProvCbInApp IN" << endl;
97
98     if(eventData == NULL)
99     {
100         cout << "ESDevConfProvData is NULL" << endl;
101         return ;
102     }
103
104     cout << "Language : " << eventData->language << endl;
105     cout << "Country : " << eventData->country << endl;
106
107     cout << "DevConfProvCbInApp OUT" << endl;
108 }
109
110 void CloudDataProvCbInApp(ESCloudProvData *eventData)
111 {
112     cout << "CloudDataProvCbInApp IN" << endl;
113
114     if(eventData == NULL)
115     {
116         cout << "ESCloudProvData is NULL" << endl;
117         return ;
118     }
119
120     cout << "AuthCode : " << eventData->authCode << endl;
121     cout << "AuthProvider : " << eventData->authProvider << endl;
122     cout << "CI Server : " << eventData->ciServer << endl;
123
124     cout << "CloudDataProvCbInApp OUT" << endl;
125
126 }
127
128 ESProvisioningCallbacks gCallbacks = {
129     .WiFiProvCb = &WiFiProvCbInApp,
130     .DevConfProvCb = &DevConfProvCbInApp,
131     .CloudDataProvCb = &CloudDataProvCbInApp
132 };
133
134 void PrintMenu()
135 {
136     cout << "========================" << endl;
137     cout << "A: Enabled Security" << endl;
138     cout << "B: Init & Start EasySetup" << endl;
139     cout << "C: Set DeviceInfo" << endl;
140     cout << "D: Connect to TargetAP" << endl;
141     cout << "Q: Terminate" << endl;
142     cout << "ENTER : Show Menu......." << endl;
143     cout << "========================" << endl;
144 }
145
146 FILE* server_fopen(const char *path, const char *mode)
147 {
148     (void) path;
149     return fopen(CRED_FILE, mode);
150 }
151
152 void EnableSecurity()
153 {
154     printf("Inside EnableSecurity API..\n");
155
156     gIsSecured = true;
157
158     // Initialize Persistent Storage for SVR database
159     ps = (OCPersistentStorage){ server_fopen, fread, fwrite, fclose, unlink };
160     OCRegisterPersistentStorageHandler(&ps);
161 }
162
163 void StartEasySetup()
164 {
165     cout << "StartEasySetup IN" << endl;
166
167     if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK)
168     {
169         cout << "OCStack init error!!" << endl;
170         return;
171     }
172
173     ESResourceMask resourcemMask = (ESResourceMask) (ES_WIFI_RESOURCE | ES_CLOUD_RESOURCE | ES_DEVCONF_RESOURCE);
174     cout << "resourcemMask : " << resourcemMask << endl;
175     if(ESInitEnrollee(gIsSecured, resourcemMask, gCallbacks) != ES_OK)
176     {
177         cout << "OCStack init error!!" << endl;
178         return;
179     }
180
181     cout << "ESInitEnrollee Success" << endl;
182
183     if(gThreadHandle == 0) {
184
185         if (pthread_create(&gThreadHandle, NULL, listeningFunc, NULL)) {
186             cout << "Thread creation failed" << endl;
187             return;
188         }
189
190     }
191
192     ESSetState(ES_STATE_INIT);
193     ESSetErrorCode(ES_ERRCODE_NO_ERROR);
194
195     int ret = 0;
196
197     ret = TizenWiFiInit();
198     if(ret != WIFI_NO_ERROR) {
199         cout << "WiFi Init Error" << endl;
200     }
201     else
202         cout << "WiFi Init Success" << endl;
203
204     ret = TizenWiFiScanStart();
205     if(ret != WIFI_NO_ERROR) {
206         cout << "WiFi Scan Error" << endl;
207     }
208     else
209         cout << "WiFi Scan Success" << endl;
210
211     cout << "StartEasySetup OUT" << endl;
212 }
213
214 void SetDeviceInfo()
215 {
216     cout << "SetDeviceInfo IN" << endl;
217
218     ESDeviceProperty deviceProperty = {
219         {{WIFI_11G, WIFI_11N, WIFI_11AC, WiFi_EOF}, WIFI_5G}, {"Tizen Device"}
220     };
221
222     if(ESSetDeviceProperty(&deviceProperty) == ES_ERROR)
223     {
224         cout << "ESSetDeviceProperty Error" << endl;
225     }
226
227     // Set user properties if needed
228
229     cout << "SetDeviceInfo OUT" << endl;
230 }
231
232 void StopEasySetup()
233 {
234     cout << "StopEasySetup IN" << endl;
235     if (ESTerminateEnrollee() == ES_ERROR)
236     {
237         cout << "ESTerminateEnrollee Failed!!" << endl;
238         return;
239     }
240
241     // Deinit Tizen Wifi
242     TizenWiFiDeinit();
243
244     // Stop OC Stack
245     if (OCStop() != OC_STACK_OK)
246     {
247         cout << "OCStack stop failed!!" << endl;
248         return;
249     }
250
251     if(gThreadHandle != 0) {
252         pthread_cancel(gThreadHandle);
253         pthread_join(gThreadHandle, NULL);
254     }
255
256     cout << "StopEasySetup OUT" << endl;
257 }
258
259 void ConnectToTargetAP()
260 {
261     if(!gWiFiCBflag){
262         cout << "WiFi Provisioning is needed to be preceded" << endl;
263         return;
264     }
265
266     WiFiConnErrCode ret = WIFI_NO_ERROR;
267     ret = TizenWiFiScanStart();
268     if(ret != WIFI_NO_ERROR){
269         ESSetState(ES_STATE_CONNECTED_FAIL_TO_ENROLLER);
270         ESSetErrorCode(ES_ERRCODE_UNKNOWN);
271         cout << "WiFi Scan Error" << endl;
272         return;
273     }
274     else{
275         cout << "WiFi Scan Succss" << endl;
276     }
277
278     ret = TizenWiFiConn(gSSID, gPasswd);
279     if(ret != WIFI_NO_ERROR) {
280         ESSetState(ES_STATE_CONNECTED_FAIL_TO_ENROLLER);
281
282         if(ret == WIFI_NOTFOUND_SSID_ERROR) {
283             ESSetErrorCode(ES_ERRCODE_SSID_NOT_FOUND);
284         }
285         else if(ret == WIFI_WRONG_PWD_ERROR) {
286             ESSetErrorCode(ES_ERRCODE_PW_WRONG);
287         }
288         else {
289             ESSetErrorCode(ES_ERRCODE_TIMEOUT);
290         }
291         cout << "WiFi Connection Error" << endl;
292         return;
293     }
294     else {
295         cout << "WIFI Connection Success" << endl;
296         ESSetState(ES_STATE_CONNECTED_TO_ENROLLER);
297         ESSetErrorCode(ES_ERRCODE_NO_ERROR);
298     }
299 }
300
301 gboolean mainThread(GIOChannel *source, GIOCondition condition, gpointer data)
302 {
303     char entered;
304     cin >> entered;
305     cin.ignore(numeric_limits<streamsize>::max(), '\n');
306
307     switch (entered) {
308         case 'Q': // quit
309         case 'q':
310             StopEasySetup();
311             break;
312
313         case 'A': // Enable Security
314         case 'a':
315             //EnableSecurity();
316             PrintMenu();
317             break;
318
319         case 'B': // Init EasySetup
320         case 'b':
321             StartEasySetup();
322             PrintMenu();
323             break;
324
325         case 'C': // Set Device Info
326         case 'c':
327             SetDeviceInfo();
328             PrintMenu();
329             break;
330
331         case 'D': // Start to connect target AP
332         case 'd':
333             ConnectToTargetAP();
334             PrintMenu();
335             break;
336
337         default:
338             cout << "Wrong option" << endl;
339             PrintMenu();
340             break;
341     }
342
343     if(entered == 'q' || entered == 'Q'){
344         g_main_loop_quit(gMainloop);
345     }
346
347     return TRUE;
348 }
349
350 int main()
351 {
352     cout << "#########################" << endl;
353     cout << "EasySetup Enrollee SAMPLE" << endl;
354     cout << "#########################" << endl;
355     PrintMenu();
356
357     gMainloop = g_main_loop_new (NULL, FALSE);
358     if(gMainloop == NULL) {
359         cout << "Create Min Loop Error" << endl;
360         return 0;
361     }
362
363     GIOChannel *channel = g_io_channel_unix_new(0);
364     g_io_add_watch(channel, (GIOCondition)(G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL), mainThread, NULL);
365
366     g_main_loop_run (gMainloop);
367
368     cout << "#########################" << endl;
369     cout << "Terminate Enrollee SAMPLE" << endl;
370     cout << "#########################" << endl;
371
372     return 0;
373 }
374
375 void *listeningFunc(void*)
376 {
377     OCStackResult result;
378
379     while (true)
380     {
381         result = OCProcess();
382         if (result != OC_STACK_OK)
383         {
384            cout<<"OCStack stop error";
385         }
386     }
387     return NULL;
388 }
389