1 //******************************************************************
3 // Copyright 2015 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
11 // http://www.apache.org/licenses/LICENSE-2.0
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.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
27 #include "provisioninghandler.h"
32 #include "cathreadpool.h"
34 #include "oic_malloc.h"
38 * @var g_provisioningMutex
39 * @brief Mutex to synchronize access to g_caDtlsContext.
41 static ca_mutex g_provisioningMutex = NULL;
42 static ca_cond g_provisioningCond = NULL;
43 bool g_provisioningCondFlag = false;
45 static EnrolleeNWProvInfo_t* netProvInfo;
49 * @brief Callback for providing provisioning status callback to application
51 static OCProvisioningStatusCB cbData = NULL;
52 static ca_thread_pool_t g_threadPoolHandle = NULL;
54 OCStackResult InitProvisioningHandler() {
55 OCStackResult ret = OC_STACK_ERROR;
56 /* Initialize OCStack*/
57 if (OCInit(NULL, 0, OC_CLIENT) != OC_STACK_OK) {
58 OIC_LOG(ERROR, TAG, "OCStack init error");
62 g_provisioningMutex = ca_mutex_new();
64 OIC_LOG(DEBUG, TAG, "ca_thread_pool_init initializing");
66 if (CA_STATUS_OK != ca_thread_pool_init(2, &g_threadPoolHandle)) {
67 OIC_LOG(DEBUG, TAG, "thread_pool_init failed");
68 return OC_STACK_ERROR;
71 g_provisioningCond = ca_cond_new();
72 if (NULL == g_provisioningCond) {
73 OIC_LOG(DEBUG, TAG, "Failed to create condition");
74 ca_mutex_free(g_provisioningMutex);
75 ca_thread_pool_free(g_threadPoolHandle);
76 return OC_STACK_ERROR;
79 char *string = "listeningFunc invoked in a thread";
81 != ca_thread_pool_add_task(g_threadPoolHandle, listeningFunc,
83 OIC_LOG(DEBUG, TAG, "thread_pool_add_task failed");
84 ca_thread_pool_free(g_threadPoolHandle);
85 ca_mutex_unlock(g_provisioningMutex);
86 ca_mutex_free(g_provisioningMutex);
87 ca_cond_free(g_provisioningCond);
88 return OC_STACK_ERROR;
93 OCStackResult TerminateProvisioningHandler() {
94 OCStackResult ret = OC_STACK_ERROR;
95 if (OCStop() != OC_STACK_OK) {
96 OIC_LOG(ERROR, TAG, "OCStack stop error");
99 ca_mutex_lock(g_provisioningMutex);
100 g_provisioningCondFlag = true;
101 //ca_cond_signal(g_provisioningCond);
102 ca_mutex_unlock(g_provisioningMutex);
104 ca_mutex_free(g_provisioningMutex);
105 g_provisioningMutex = NULL;
107 ca_thread_pool_free(g_threadPoolHandle);
108 g_threadPoolHandle = NULL;
114 void listeningFunc(void *data) {
115 while (!g_provisioningCondFlag) {
116 OCStackResult result;
118 ca_mutex_lock(g_provisioningMutex);
119 result = OCProcess();
120 ca_mutex_unlock(g_provisioningMutex);
122 if (result != OC_STACK_OK) {
123 OIC_LOG(ERROR, TAG, "OCStack stop error");
126 // To minimize CPU utilization we may wish to do this with sleep
131 OCStackApplicationResult ProvisionEnrolleeResponse(void* ctx, OCDoHandle handle,
132 OCClientResponse * clientResponse) {
133 ProvisioningInfo *provInfo;
135 if (clientResponse) {
136 OIC_LOG_V(INFO, TAG, "Put Response JSON = %s",
137 clientResponse->resJSONPayload);
140 "ProvisionEnrolleeResponse received Null clientResponse");
141 provInfo = PrepareProvisioingStatusCB(clientResponse,
142 DEVICE_NOT_PROVISIONED);
144 return OC_STACK_DELETE_TRANSACTION;
147 OIC_LOG_V(DEBUG, TAG, "ProvisionEnrolleeResponse %s ",
148 clientResponse->resJSONPayload);
150 if (clientResponse->resJSONPayload) {
151 cJSON *observeJson = cJSON_CreateObject();
152 observeJson = cJSON_Parse(clientResponse->resJSONPayload);
154 cJSON *ocArray = cJSON_GetObjectItem(observeJson, OC_RSRVD_OC);
155 cJSON *ocArray_sub = cJSON_GetArrayItem(ocArray, 0);
157 cJSON *representationArray = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_REPRESENTATION);
158 char *ocArray_str = cJSON_PrintUnformatted(representationArray);
160 if (strstr(ocArray_str, "[{}") == ocArray_str) {
161 OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
162 cJSON_Delete(observeJson);
163 return OC_STACK_DELETE_TRANSACTION;
166 int countofrep = cJSON_GetArraySize(representationArray);
168 for (int i = 0; i < countofrep; ++i) {
169 cJSON *arrayJSON = cJSON_GetArrayItem(representationArray, i);
170 OIC_LOG_V(DEBUG, TAG, "rep#%d's name : %s", i, arrayJSON->string);
172 if (!strcmp(arrayJSON->string, OC_RSRVD_ES_PS))
174 if(arrayJSON->valueint == 1)
176 OIC_LOG_V(DEBUG, TAG, "PS is proper");
180 OIC_LOG_V(DEBUG, TAG, "PS is NOT proper");
181 provInfo = PrepareProvisioingStatusCB(clientResponse,
182 DEVICE_NOT_PROVISIONED);
187 if (!strcmp(arrayJSON->string, OC_RSRVD_ES_TNN))
189 if(!strcmp(arrayJSON->valuestring, netProvInfo->netAddressInfo.WIFI.ssid))
191 OIC_LOG_V(DEBUG, TAG, "SSID is proper");
195 OIC_LOG_V(DEBUG, TAG, "SSID is NOT proper");
196 provInfo = PrepareProvisioingStatusCB(clientResponse,
197 DEVICE_NOT_PROVISIONED);
202 if (!strcmp(arrayJSON->string, OC_RSRVD_ES_CD))
204 if(!strcmp(arrayJSON->valuestring, netProvInfo->netAddressInfo.WIFI.pwd))
206 OIC_LOG_V(DEBUG, TAG, "Password is proper");
210 OIC_LOG_V(DEBUG, TAG, "Password is NOT proper");
211 provInfo = PrepareProvisioingStatusCB(clientResponse,
212 DEVICE_NOT_PROVISIONED);
217 switch (arrayJSON->type) {
220 OIC_LOG_V(DEBUG, TAG, "rep#%d's int value : %d", i,
221 arrayJSON->valueint);
224 OIC_LOG_V(DEBUG, TAG, "rep#%d's double value : %f", i,
225 arrayJSON->valuedouble);
228 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %s", i,
229 arrayJSON->valuestring);
233 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : NULL", i);
238 cJSON_Delete(observeJson);
240 provInfo = PrepareProvisioingStatusCB(clientResponse,
244 return OC_STACK_KEEP_TRANSACTION;
247 "ProvisionEnrolleeResponse received NULL clientResponse. \
248 Invoking Provisioing Status Callback");
249 provInfo = PrepareProvisioingStatusCB(clientResponse,
250 DEVICE_NOT_PROVISIONED);
252 return OC_STACK_DELETE_TRANSACTION;
256 OCStackResult ProvisionEnrollee(OCQualityOfService qos, const char* query, const char* resUri) {
257 OIC_LOG_V(INFO, TAG, "\n\nExecuting ProvisionEnrollee%s", __func__);
259 cJSON *jsonFinal = cJSON_CreateObject();
260 cJSON *json = cJSON_CreateObject();
263 char* payload = NULL;
265 cJSON_AddStringToObject(json, OC_RSRVD_HREF, resUri);
266 cJSON_AddItemToObject(json, OC_RSRVD_REPRESENTATION, format = cJSON_CreateObject());
267 cJSON_AddStringToObject(format, OC_RSRVD_ES_TNN, netProvInfo->netAddressInfo.WIFI.ssid);
268 cJSON_AddStringToObject(format, OC_RSRVD_ES_CD, netProvInfo->netAddressInfo.WIFI.pwd);
269 cJSON_AddItemToObject(jsonFinal, OC_RSRVD_OC, jsonArray = cJSON_CreateArray());
270 cJSON_AddItemToArray(jsonArray, json);
272 OIC_LOG_V(DEBUG, TAG, "ProvisionEnrollee : %s",
273 cJSON_PrintUnformatted(jsonFinal));
274 payload = cJSON_Print(jsonFinal);
275 OIC_LOG_V(DEBUG, TAG, "Payload : %s", payload);
277 OCStackResult ret = InvokeOCDoResource(query, OC_REST_PUT, OC_HIGH_QOS,
278 ProvisionEnrolleeResponse, payload, NULL, 0);
284 OCStackApplicationResult GetProvisioningStatusResponse(void* ctx,
285 OCDoHandle handle, OCClientResponse * clientResponse) {
286 ProvisioningInfo *provInfo;
288 if (clientResponse == NULL) {
290 "getReqCB received NULL clientResponse. \
291 Invoking Provisioing Status Callback");
292 provInfo = PrepareProvisioingStatusCB(clientResponse,
293 DEVICE_NOT_PROVISIONED);
295 return OC_STACK_DELETE_TRANSACTION;
298 if (clientResponse->rcvdVendorSpecificHeaderOptions
299 && clientResponse->numRcvdVendorSpecificHeaderOptions) {
300 OIC_LOG(INFO, TAG, "Received vendor specific options");
302 OCHeaderOption * rcvdOptions =
303 clientResponse->rcvdVendorSpecificHeaderOptions;
304 for (i = 0; i < clientResponse->numRcvdVendorSpecificHeaderOptions;
306 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID) {
308 "Received option with OC_COAP_ID and ID %u with",
309 ((OCHeaderOption) rcvdOptions[i]).optionID);
311 OIC_LOG_BUFFER(INFO, TAG,
312 ((OCHeaderOption) rcvdOptions[i]).optionData,
313 MAX_HEADER_OPTION_DATA_LENGTH);
318 char query[OIC_STRING_MAX_VALUE] = { '\0' };
321 if (clientResponse->resJSONPayload) {
322 cJSON *observeJson = cJSON_CreateObject();
323 observeJson = cJSON_Parse(clientResponse->resJSONPayload);
325 cJSON *ocArray = cJSON_GetObjectItem(observeJson, OC_RSRVD_OC);
326 cJSON *ocArray_sub = cJSON_GetArrayItem(ocArray, 0);
328 cJSON *resUriObj = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_HREF);
330 OIC_LOG_V(DEBUG, TAG, "resUriObj = %s, valueString = %s",
331 resUriObj->string, resUriObj->valuestring);
333 char resURI[MAX_URI_LENGTH]={'\0'};
335 strncpy(resURI, resUriObj->valuestring, sizeof(resURI));
337 snprintf(query, sizeof(query), UNICAST_PROV_STATUS_QUERY,
338 clientResponse->addr->addr,
341 cJSON *representationArray = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_REPRESENTATION);
342 char *ocArray_str = cJSON_PrintUnformatted(representationArray);
344 if (strstr(ocArray_str, "[{}") == ocArray_str) {
345 OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
346 cJSON_Delete(observeJson);
347 return OC_STACK_DELETE_TRANSACTION;
350 int countofrep = cJSON_GetArraySize(representationArray);
352 for (int i = 0; i < countofrep; ++i) {
353 cJSON *arrayJSON = cJSON_GetArrayItem(representationArray, i);
354 OIC_LOG_V(DEBUG, TAG, "rep#%d's name : %s", i, arrayJSON->string);
356 switch (arrayJSON->type) {
359 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %d", i,
360 arrayJSON->valueint);
363 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %f", i,
364 arrayJSON->valuedouble);
367 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %s", i,
368 arrayJSON->valuestring);
372 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : NULL", i);
376 cJSON_Delete(observeJson);
378 if (ProvisionEnrollee(OC_HIGH_QOS, query, resURI) != OC_STACK_OK) {
380 "GetProvisioningStatusResponse received NULL clientResponse. \
381 Invoking Provisioing Status Callback");
382 provInfo = PrepareProvisioingStatusCB(clientResponse,
383 DEVICE_NOT_PROVISIONED);
386 return OC_STACK_DELETE_TRANSACTION;
390 "GetProvisioningStatusResponse received NULL clientResponse. \
391 Invoking Provisioing Status Callback");
392 provInfo = PrepareProvisioingStatusCB(clientResponse,
393 DEVICE_NOT_PROVISIONED);
395 return OC_STACK_DELETE_TRANSACTION;
397 return OC_STACK_DELETE_TRANSACTION;
400 OCStackResult InvokeOCDoResource(const char* query, OCMethod method,
401 OCQualityOfService qos, OCClientResponseHandler cb, const char* request,
402 OCHeaderOption * options, uint8_t numOptions) {
404 OCCallbackData cbData;
407 cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
410 ret = OCDoResource(NULL, method, query, 0, request, OC_CONNTYPE, qos,
411 &cbData, options, numOptions);
413 if (ret != OC_STACK_OK) {
414 OIC_LOG_V(ERROR, TAG, "OCDoResource returns error %d with method %d",
421 OCStackResult GetProvisioningStatus(OCQualityOfService qos, const char* query) {
422 OCStackResult ret = OC_STACK_ERROR;
423 OCHeaderOption options[MAX_HEADER_OPTIONS];
425 OIC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__);
427 uint8_t option0[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
428 uint8_t option1[] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
429 memset(options, 0, sizeof(OCHeaderOption) * MAX_HEADER_OPTIONS);
430 options[0].protocolID = OC_COAP_ID;
431 options[0].optionID = 2048;
432 memcpy(options[0].optionData, option0, sizeof(option0));
433 options[0].optionLength = 10;
434 options[1].protocolID = OC_COAP_ID;
435 options[1].optionID = 3000;
436 memcpy(options[1].optionData, option1, sizeof(option1));
437 options[1].optionLength = 10;
439 ret = InvokeOCDoResource(query, OC_REST_GET, OC_HIGH_QOS,
440 GetProvisioningStatusResponse, NULL, options, 2);
444 OCStackResult StartProvisioningProcess(const EnrolleeNWProvInfo_t *netInfo,
445 OCProvisioningStatusCB provisioningStatusCallback) {
446 OCStackResult result = OC_STACK_ERROR;
448 if (netInfo->netAddressInfo.WIFI.ipAddress == NULL) {
449 OIC_LOG(ERROR, TAG, "Request URI is NULL");
453 if (provisioningStatusCallback == NULL) {
454 OIC_LOG(ERROR, TAG, "ProvisioningStatusCallback is NULL");
458 cbData = provisioningStatusCallback;
460 //Copy Network Provisioning Information
461 netProvInfo = (EnrolleeNWProvInfo_t *)OICCalloc(1, sizeof(EnrolleeNWProvInfo_t));
463 if (NULL == netProvInfo)
465 OIC_LOG(ERROR, TAG, "Invalid input..");
466 return OC_STACK_ERROR;
468 memcpy(netProvInfo, netInfo, sizeof(EnrolleeNWProvInfo_t));
470 OIC_LOG_V(DEBUG, TAG, "Network Provisioning Info. SSID = %s",
471 netProvInfo->netAddressInfo.WIFI.ssid);
473 OIC_LOG_V(DEBUG, TAG, "Network Provisioning Info. PWD = %s",
474 netProvInfo->netAddressInfo.WIFI.pwd);
478 != ca_thread_pool_add_task(g_threadPoolHandle, FindProvisioningResource,
480 OIC_LOG(DEBUG, TAG, "thread_pool_add_task of FindProvisioningResource failed");
481 ca_thread_pool_free(g_threadPoolHandle);
482 ca_mutex_unlock(g_provisioningMutex);
483 ca_mutex_free(g_provisioningMutex);
484 ca_cond_free(g_provisioningCond);
485 return OC_STACK_ERROR;
490 void StopProvisioningProcess() {
494 // This is a function called back when a device is discovered
495 OCStackApplicationResult FindProvisioningResourceResponse(void* ctx,
496 OCDoHandle handle, OCClientResponse * clientResponse) {
497 OIC_LOG(INFO, TAG, PCF("Entering FindProvisioningResourceResponse"));
499 OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;
501 ProvisioningInfo *provInfo;
503 if (clientResponse->result != OC_STACK_OK) {
505 "OCStack stop error. Calling Provisioing Status Callback");
507 provInfo = PrepareProvisioingStatusCB(clientResponse,
508 DEVICE_NOT_PROVISIONED);
514 if (clientResponse) {
515 cJSON *discoveryJson = cJSON_CreateObject();
516 discoveryJson = cJSON_Parse((char *) clientResponse->resJSONPayload);
518 cJSON *ocArray = cJSON_GetObjectItem(discoveryJson, OC_RSRVD_OC);
519 char *ocArray_str = cJSON_PrintUnformatted(ocArray);
521 if (strstr(ocArray_str, "[{}") == ocArray_str) {
522 OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
523 cJSON_Delete(discoveryJson);
525 provInfo = PrepareProvisioingStatusCB(clientResponse,
526 DEVICE_NOT_PROVISIONED);
531 cJSON *ocArray_sub = cJSON_GetArrayItem(ocArray, 0);
532 cJSON *resUriObj = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_HREF);
534 OIC_LOG_V(DEBUG, TAG, "resUriObj = %s, valueString = %s",
535 resUriObj->string, resUriObj->valuestring);
538 char szQueryUri[64] = { 0 };
540 snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROV_STATUS_QUERY,
541 clientResponse->devAddr.addr, IP_PORT, resUriObj->valuestring);
542 OIC_LOG_V(DEBUG, TAG, "query before GetProvisioningStatus call = %s", szQueryUri);
544 if (GetProvisioningStatus(OC_HIGH_QOS, szQueryUri) != OC_STACK_OK) {
546 "GetProvisioningStatus returned error. \
547 Invoking Provisioing Status Callback");
548 provInfo = PrepareProvisioingStatusCB(clientResponse,
549 DEVICE_NOT_PROVISIONED);
552 return OC_STACK_DELETE_TRANSACTION;
555 // clientResponse is invalid
557 "Invalid response for Provisioning Discovery request. \
558 Invoking Provisioing Status Callback");
559 provInfo = PrepareProvisioingStatusCB(clientResponse,
560 DEVICE_NOT_PROVISIONED);
564 return OC_STACK_KEEP_TRANSACTION;
567 void FindProvisioningResource(void *data)
569 OCStackResult ret = OC_STACK_ERROR;
571 /* Start a discovery query*/
572 char szQueryUri[64] = { 0 };
574 snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY,
575 netProvInfo->netAddressInfo.WIFI.ipAddress, IP_PORT);
577 OIC_LOG_V(DEBUG, TAG, "szQueryUri = %s", szQueryUri);
579 OCCallbackData ocCBData;
581 ocCBData.cb = FindProvisioningResourceResponse;
582 ocCBData.context = (void*) DEFAULT_CONTEXT_VALUE;
585 ret = OCDoResource(NULL, OC_REST_GET, szQueryUri, 0, 0, OC_CONNTYPE,
586 OC_LOW_QOS, &ocCBData, NULL, 0);
588 if (ret != OC_STACK_OK) {
589 OIC_LOG(ERROR, TAG, "OCStack resource error");
592 "FindProvisioningResource failed. \
593 Invoking Provisioing Status Callback");
595 ProvisioningInfo *provInfo;
596 provInfo = (ProvisioningInfo *) OICCalloc(1, sizeof(ProvisioningInfo));
600 OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");
604 OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr));
608 OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");
612 strncpy(devAddr->addr, netProvInfo->netAddressInfo.WIFI.ipAddress, sizeof(devAddr->addr));
613 devAddr->port= IP_PORT;
614 provInfo->provDeviceInfo.addr = devAddr;
615 provInfo->provStatus = DEVICE_NOT_PROVISIONED;
622 OCStackApplicationResult SubscribeProvPresenceCallback(void* ctx, OCDoHandle handle,
623 OCClientResponse* clientResponse) {
624 OIC_LOG(INFO, TAG, PCF("Entering SubscribeProvPresenceCallback"));
626 OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;
628 if (clientResponse->result != OC_STACK_OK) {
629 OIC_LOG(ERROR, TAG, "OCStack stop error");
633 if (clientResponse) {
634 OIC_LOG(INFO, TAG, PCF("Client Response exists"));
636 cJSON *discoveryJson = cJSON_CreateObject();
637 discoveryJson = cJSON_Parse((char *) clientResponse->resJSONPayload);
639 cJSON *ocArray = cJSON_GetObjectItem(discoveryJson, OC_RSRVD_OC);
640 char *ocArray_str = cJSON_PrintUnformatted(ocArray);
642 if (strstr(ocArray_str, "[{}") == ocArray_str) {
643 OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
644 cJSON_Delete(discoveryJson);
648 char sourceIPAddr[OIC_STRING_MAX_VALUE] = { '\0' };
649 snprintf(sourceIPAddr, sizeof(sourceIPAddr), "%s", clientResponse->addr->addr);
651 OIC_LOG_V(DEBUG, TAG, "Discovered %s @ %s",
652 clientResponse->resJSONPayload, sourceIPAddr);
654 /* Start a discovery query*/
655 char szQueryUri[64] = { 0 };
657 snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY,
658 sourceIPAddr, IP_PORT);
660 /*if (FindProvisioningResource(qos, szQueryUri) != OC_STACK_OK) {
661 OIC_LOG(ERROR, TAG, "FindProvisioningResource failed");
662 return OC_STACK_KEEP_TRANSACTION;
665 // clientResponse is invalid
666 OIC_LOG(ERROR, TAG, PCF("Client Response is NULL!"));
668 return OC_STACK_KEEP_TRANSACTION;
671 OCStackResult SubscribeProvPresence(OCQualityOfService qos,
672 const char* requestURI) {
673 OCStackResult ret = OC_STACK_ERROR;
675 OCCallbackData cbData;
677 cbData.cb = &SubscribeProvPresenceCallback;
678 cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
681 ret = OCDoResource(NULL, OC_REST_PRESENCE, requestURI, 0, 0, OC_CONNTYPE,
682 OC_LOW_QOS, &cbData, NULL, 0);
684 if (ret != OC_STACK_OK) {
685 OIC_LOG(ERROR, TAG, "OCStack resource error");
691 OCStackResult FindNetworkResource() {
692 OCStackResult ret = OC_STACK_ERROR;
693 if (OCStop() != OC_STACK_OK) {
694 OIC_LOG(ERROR, TAG, "OCStack stop error");
700 ProvisioningInfo* PrepareProvisioingStatusCB(OCClientResponse * clientResponse, ProvStatus provStatus) {
702 ProvisioningInfo *provInfo = (ProvisioningInfo *) OICCalloc(1, sizeof(ProvisioningInfo));
706 OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");
710 OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr));
714 OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");
718 strncpy(devAddr->addr, clientResponse->addr->addr, sizeof(devAddr->addr));
719 devAddr->port= clientResponse->addr->port;
721 provInfo->provDeviceInfo.addr = devAddr;
723 provInfo->provStatus = provStatus;