Update snapshot(2018-01-17)
[platform/upstream/iotivity.git] / service / easy-setup / enrollee / src / easysetup.c
1 //******************************************************************
2 //
3 // Copyright 2015 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  * @file
23  *
24  * This file contains the implementation for EasySetup Enrollee device
25  */
26
27 #include "easysetup.h"
28 #include "logger.h"
29 #include "resourcehandler.h"
30 #include "oic_string.h"
31
32 /**
33  * @var ES_ENROLLEE_TAG
34  * @brief Logging tag for module name.
35  */
36 #define ES_ENROLLEE_TAG "ES"
37
38 //-----------------------------------------------------------------------------
39 // Private variables
40 //-----------------------------------------------------------------------------
41
42 static bool gIsSecured = false;
43
44 static ESProvisioningCallbacks gESProvisioningCb;
45 static ESDeviceProperty gESDeviceProperty;
46
47 void ESConnectRequestCallback(ESResult esResult, ESConnectRequest *eventData)
48 {
49     OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "ESConnectRequestCallback IN");
50
51     if(esResult != ES_OK)
52     {
53         OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "ESConnectRequestCallback Error Occured");
54         return;
55     }
56
57     if(gESProvisioningCb.ConnectRequestCb != NULL)
58     {
59         gESProvisioningCb.ConnectRequestCb(eventData);
60     }
61     else
62     {
63         OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "ConnectRequestCb is NULL");
64         return;
65     }
66
67     OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "ESConnectRequestCallback OUT");
68 }
69
70 void ESWiFiConfRsrcCallback(ESResult esResult, ESWiFiConfData *eventData)
71 {
72     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESWiFiConfRsrcCallback IN");
73
74     if(esResult != ES_OK)
75     {
76         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESWiFiConfRsrcCallback Error Occured");
77         return;
78     }
79
80     // deliver data to ESProvisioningCallbacks
81     if(gESProvisioningCb.WiFiConfProvCb != NULL)
82     {
83         gESProvisioningCb.WiFiConfProvCb(eventData);
84     }
85     else
86     {
87         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "WiFiConfProvCb is NULL");
88         return;
89     }
90     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESWiFiConfRsrcCallback OUT");
91 }
92
93 void ESCoapCloudConfRsrcCallback(ESResult esResult, ESCoapCloudConfData *eventData)
94 {
95     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESCoapCloudConfRsrcCallback IN");
96
97     if(esResult != ES_OK)
98     {
99         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESCoapCloudConfRsrcCallback Error Occured");
100         return;
101     }
102
103     if(gESProvisioningCb.CoapCloudConfProvCb != NULL)
104     {
105         gESProvisioningCb.CoapCloudConfProvCb(eventData);
106     }
107     else
108     {
109         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "CoapCloudConfProvCb is NULL");
110         return;
111     }
112     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESCoapCloudConfRsrcCallback OUT");
113 }
114
115 void ESDevConfRsrcallback(ESResult esResult, ESDevConfData *eventData)
116 {
117     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESDevConfRsrcallback IN");
118
119     if(esResult != ES_OK)
120     {
121         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESDevConfRsrcallback Error Occured");
122         return;
123     }
124
125     if(gESProvisioningCb.DevConfProvCb != NULL)
126     {
127         gESProvisioningCb.DevConfProvCb(eventData);
128     }
129     else
130     {
131         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "DevConfProvCb is NULL");
132         return;
133     }
134     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESDevConfRsrcallback OUT");
135 }
136
137 ESResult ESInitEnrollee(bool isSecured, ESResourceMask resourceMask, ESProvisioningCallbacks callbacks)
138 {
139     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitEnrollee IN");
140
141     gIsSecured = isSecured;
142
143     if((resourceMask & ES_WIFICONF_RESOURCE) == ES_WIFICONF_RESOURCE)
144     {
145         if(callbacks.WiFiConfProvCb != NULL)
146         {
147             gESProvisioningCb.WiFiConfProvCb = callbacks.WiFiConfProvCb;
148             RegisterWifiRsrcEventCallBack(ESWiFiConfRsrcCallback);
149         }
150         else
151         {
152             OIC_LOG(ERROR, ES_ENROLLEE_TAG, "WiFiConfProvCb NULL");
153             return ES_ERROR;
154         }
155     }
156     if((resourceMask & ES_DEVCONF_RESOURCE) == ES_DEVCONF_RESOURCE)
157     {
158         if(callbacks.DevConfProvCb != NULL)
159         {
160             gESProvisioningCb.DevConfProvCb = callbacks.DevConfProvCb;
161             RegisterDevConfRsrcEventCallBack(ESDevConfRsrcallback);
162         }
163         else
164         {
165             OIC_LOG(ERROR, ES_ENROLLEE_TAG, "DevConfProvCb NULL");
166             return ES_ERROR;
167         }
168     }
169     if((resourceMask & ES_COAPCLOUDCONF_RESOURCE) == ES_COAPCLOUDCONF_RESOURCE)
170     {
171         if(callbacks.CoapCloudConfProvCb != NULL)
172         {
173             gESProvisioningCb.CoapCloudConfProvCb = callbacks.CoapCloudConfProvCb;
174             RegisterCloudRsrcEventCallBack(ESCoapCloudConfRsrcCallback);
175         }
176         else
177         {
178             OIC_LOG(ERROR, ES_ENROLLEE_TAG, "CoapCloudConfProvCb NULL");
179             return ES_ERROR;
180         }
181     }
182
183     // TODO: if EasySetupProvCb is NULL, we should return an error at this moment.
184     if(callbacks.ConnectRequestCb != NULL)
185     {
186         gESProvisioningCb.ConnectRequestCb = callbacks.ConnectRequestCb;
187         RegisterConnectRequestEventCallBack(ESConnectRequestCallback);
188     }
189
190     if(CreateEasySetupResources(gIsSecured, resourceMask) != OC_STACK_OK)
191     {
192         UnRegisterResourceEventCallBack();
193
194         if (DeleteEasySetupResources() != OC_STACK_OK)
195         {
196             OIC_LOG(ERROR, ES_ENROLLEE_TAG, "Deleting prov resource error!!");
197         }
198
199         return ES_ERROR;
200     }
201
202     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitEnrollee OUT");
203     return ES_OK;
204 }
205
206 ESResult ESSetDeviceProperty(ESDeviceProperty *deviceProperty)
207 {
208     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetDeviceProperty IN");
209
210     if(SetDeviceProperty(deviceProperty) != OC_STACK_OK)
211     {
212         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESSetDeviceProperty Error");
213         return ES_ERROR;
214     }
215
216     int modeIdx = 0;
217     while((deviceProperty->WiFi).mode[modeIdx] != WiFi_EOF)
218     {
219         (gESDeviceProperty.WiFi).mode[modeIdx] = (deviceProperty->WiFi).mode[modeIdx];
220         OIC_LOG_V(INFO_PRIVATE, ES_ENROLLEE_TAG, "WiFi Mode : %d", (gESDeviceProperty.WiFi).mode[modeIdx]);
221         modeIdx ++;
222     }
223     (gESDeviceProperty.WiFi).freq = (deviceProperty->WiFi).freq;
224     OIC_LOG_V(INFO_PRIVATE, ES_ENROLLEE_TAG, "WiFi Freq : %d", (gESDeviceProperty.WiFi).freq);
225
226     OICStrcpy((gESDeviceProperty.DevConf).deviceName, OIC_STRING_MAX_VALUE, (deviceProperty->DevConf).deviceName);
227     OIC_LOG_V(INFO_PRIVATE, ES_ENROLLEE_TAG, "Device Name : %s", (gESDeviceProperty.DevConf).deviceName);
228
229     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetDeviceProperty OUT");
230     return ES_OK;
231 }
232
233 ESResult ESSetState(ESEnrolleeState esState)
234 {
235     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetState IN");
236
237     if(esState < ES_STATE_INIT || esState >= ES_STATE_EOF)
238     {
239         OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "Invalid ESEnrolleeState : %d", esState);
240         return ES_ERROR;
241     }
242
243     if(SetEnrolleeState(esState) != OC_STACK_OK)
244     {
245         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESSetState ES_ERROR");
246         return ES_ERROR;
247     }
248
249     OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "Set ESState succesfully : %d", esState);
250     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetState OUT");
251     return ES_OK;
252 }
253
254 ESResult ESSetErrorCode(ESErrorCode esErrCode)
255 {
256     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetErrorCode IN");
257
258     if(esErrCode < ES_ERRCODE_NO_ERROR || esErrCode > ES_ERRCODE_UNKNOWN)
259     {
260         OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "Invalid ESSetErrorCode : %d", esErrCode);
261             return ES_ERROR;
262     }
263
264     if(SetEnrolleeErrCode(esErrCode) != OC_STACK_OK)
265     {
266         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESSetErrorCode ES_ERROR");
267         return ES_ERROR;
268     }
269
270     OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "Set ESErrorCode succesfully : %d", esErrCode);
271     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetErrorCode OUT");
272     return ES_OK;
273 }
274
275 ESResult ESTerminateEnrollee()
276 {
277     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESTerminateEnrollee IN");
278
279     UnRegisterResourceEventCallBack();
280
281     //Delete Prov resource
282     if (DeleteEasySetupResources() != OC_STACK_OK)
283     {
284         OIC_LOG(ERROR, ES_ENROLLEE_TAG, "Deleting prov resource error!!");
285         return ES_ERROR;
286     }
287
288     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESTerminateEnrollee success");
289     return ES_OK;
290 }
291
292 ESResult ESSetCallbackForUserdata(ESReadUserdataCb readCb, ESWriteUserdataCb writeCb)
293 {
294     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetCallbackForUserdata IN");
295
296     if(!readCb && !writeCb)
297     {
298         OIC_LOG(INFO, ES_ENROLLEE_TAG, "Both of callbacks for user data are null");
299         return ES_ERROR;
300     }
301
302     SetCallbackForUserData(readCb, writeCb);
303     OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetCallbackForUserdata OUT");
304     return ES_OK;
305 }