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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 // NOTE : Keeping Ble provisioning in this file to have adaptability while doing OOPs refactoring
32 #include "ocpayload.h"
33 #include "provisioning.h"
38 #include "oic_malloc.h"
40 static bool sent_provision_request = false;
42 static EnrolleeNWProvInfo_t *netProvInfo;
46 * @brief Callback for providing provisioning status callback to application
48 static OCProvisioningStatusCB cbData = NULL;
51 OCStackApplicationResult GetProvisioningStatusResponse(void *ctx, OCDoHandle handle,
52 OCClientResponse *clientResponse) {
54 OIC_LOG_V(DEBUG, TAG, "INside GetProvisioningStatusResponse");
56 // If user stopped the process then return from this function;
57 if (IsSetupStopped()) {
58 ErrorCallback(DEVICE_NOT_PROVISIONED);
60 return OC_STACK_DELETE_TRANSACTION;
63 if (sent_provision_request == true)
64 return OC_STACK_DELETE_TRANSACTION;
65 sent_provision_request = true;
67 ProvisioningInfo *provInfo;
69 if (!ValidateEnrolleResponse(clientResponse)) {
70 ErrorCallback(DEVICE_NOT_PROVISIONED);
72 return OC_STACK_DELETE_TRANSACTION;
75 OCRepPayload *input = (OCRepPayload * )(clientResponse->payload);
77 char query[OIC_STRING_MAX_VALUE] =
79 char resURI[MAX_URI_LENGTH] =
82 OIC_LOG_V(DEBUG, TAG, "resUri = %s", input->uri);
84 strncpy(resURI, input->uri, sizeof(resURI) - 1);
86 snprintf(query, sizeof(query), UNICAST_PROVISIONING_QUERY_BLE, clientResponse->addr->addr);
88 OIC_LOG_V(DEBUG, TAG, "query = %s", query);
90 OCDevAddr *devaddress = &clientResponse->devAddr;
91 devaddress->adapter = OC_ADAPTER_GATT_BTLE;
93 //OCPayloadLogRep(DEBUG,TAG,input);
95 if (ProvisionEnrollee(OC_HIGH_QOS, query, OC_RSRVD_ES_URI_PROV, devaddress,
96 5 /* 5s delay to avoid packet drop*/) != OC_STACK_OK) {
98 "GetProvisioningStatusResponse received NULL clientResponse.Invoking Provisioing Status Callback");
100 ErrorCallback(DEVICE_NOT_PROVISIONED);
102 return OC_STACK_DELETE_TRANSACTION;
105 return OC_STACK_KEEP_TRANSACTION;
109 OCStackResult GetProvisioningStatus(OCQualityOfService qos, const char *query,
110 const OCDevAddr *destination) {
111 OCStackResult ret = OC_STACK_ERROR;
112 OIC_LOG_V(INFO, TAG, "\n\nExecuting %s %d", __func__, destination->adapter);
113 ret = InvokeOCDoResource(query, OC_REST_GET, destination, OC_HIGH_QOS,
114 GetProvisioningStatusResponse, NULL, NULL, 0);
119 // This is a function called back when a device is discovered
120 OCStackApplicationResult FindProvisioningResourceResponse(void *ctx, OCDoHandle handle,
121 OCClientResponse *clientResponse) {
123 OIC_LOG(INFO, TAG, PCF("Entering FindProvisioningResourceResponse"));
125 // If user stopped the process then return from this function;
126 if (IsSetupStopped()) {
127 ErrorCallback(DEVICE_NOT_PROVISIONED);
129 return OC_STACK_DELETE_TRANSACTION;
132 if (!ValidateFinddResourceResponse(clientResponse)) {
133 ErrorCallback(DEVICE_NOT_PROVISIONED);
134 return OC_STACK_DELETE_TRANSACTION;
137 OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;
139 ProvisioningInfo *provInfo;
140 char szQueryUri[64] =
143 OCDiscoveryPayload *discoveryPayload = (OCDiscoveryPayload * )(clientResponse->payload);
145 // Need to conform if below check is required or not. As Null check of clientResponse->payload is already performed above
146 if (!discoveryPayload) {
147 OIC_LOG_V(DEBUG, TAG, "Failed To parse");
148 ErrorCallback(DEVICE_NOT_PROVISIONED);
149 return OC_STACK_DELETE_TRANSACTION;
152 OIC_LOG_V(DEBUG, TAG, "resUri = %s", discoveryPayload->resources->uri);
154 snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY_BLE,
155 clientResponse->addr->addr);
157 OCDevAddr *devaddress = &clientResponse->devAddr;
158 devaddress->adapter = OC_ADAPTER_GATT_BTLE;
160 if (strcmp(netProvInfo->netAddressInfo.WIFI.ipAddress, clientResponse->devAddr.addr))
161 OIC_LOG_V(INFO, TAG, "unequal %s %s", netProvInfo->netAddressInfo.WIFI.ipAddress,
162 clientResponse->devAddr.addr);
164 OIC_LOG_V(INFO, TAG, "unequal %s %s", netProvInfo->netAddressInfo.WIFI.ipAddress,
165 clientResponse->devAddr.addr);
167 OIC_LOG_V(DEBUG, TAG, "query before GetProvisioningStatus call = %s %d", szQueryUri,
168 devaddress->adapter);
170 if (GetProvisioningStatus(OC_HIGH_QOS, szQueryUri, devaddress) != OC_STACK_OK) {
171 ErrorCallback(DEVICE_NOT_PROVISIONED);
172 return OC_STACK_DELETE_TRANSACTION;
175 return OC_STACK_KEEP_TRANSACTION;
179 bool ValidateEasySetupParams(const EnrolleeNWProvInfo_t *netInfo,
180 OCProvisioningStatusCB provisioningStatusCallback) {
182 if (netInfo == NULL || strlen(netInfo->netAddressInfo.LE.leMacAddress) == 0) {
183 OIC_LOG(ERROR, TAG, "Request URI is NULL");
187 if (provisioningStatusCallback == NULL) {
188 OIC_LOG(ERROR, TAG, "ProvisioningStatusCallback is NULL");