C++ mediator changes to keep common code in Provision.cpp file
[platform/upstream/iotivity.git] / service / easy-setup / sdk / mediator / src / ble_provisioning.cpp
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 // NOTE : Keeping Ble provisioning in this file to have adaptability while doing OOPs refactoring 
23
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <signal.h>
29 #include <unistd.h>
30 #include <pthread.h>
31
32 #include "ocpayload.h"
33 #include "provisioning.h"
34 #include "common.h"
35 // External includes
36
37 #include "logger.h"
38 #include "oic_malloc.h"
39
40 static bool sent_provision_request = false;
41
42 static EnrolleeNWProvInfo_t *netProvInfo;
43
44 /**
45  * @var cbData
46  * @brief Callback for providing provisioning status callback to application
47  */
48 static OCProvisioningStatusCB cbData = NULL;
49
50
51 OCStackApplicationResult GetProvisioningStatusResponse(void *ctx, OCDoHandle handle,
52                                                        OCClientResponse *clientResponse) {
53
54     OIC_LOG_V(DEBUG, TAG, "INside  GetProvisioningStatusResponse");
55
56     // If user stopped the process then return from this function;
57     if (IsSetupStopped()) {
58         ErrorCallback(DEVICE_NOT_PROVISIONED);
59         ClearMemory();
60         return OC_STACK_DELETE_TRANSACTION;
61     }
62
63     if (sent_provision_request == true)
64         return OC_STACK_DELETE_TRANSACTION;
65     sent_provision_request = true;
66
67     ProvisioningInfo *provInfo;
68
69     if (!ValidateEnrolleResponse(clientResponse)) {
70         ErrorCallback(DEVICE_NOT_PROVISIONED);
71         ClearMemory();
72         return OC_STACK_DELETE_TRANSACTION;
73     }
74
75     OCRepPayload *input = (OCRepPayload * )(clientResponse->payload);
76
77     char query[OIC_STRING_MAX_VALUE] =
78             {'\0'};
79     char resURI[MAX_URI_LENGTH] =
80             {'\0'};
81
82     OIC_LOG_V(DEBUG, TAG, "resUri = %s", input->uri);
83
84     strncpy(resURI, input->uri, sizeof(resURI) - 1);
85
86     snprintf(query, sizeof(query), UNICAST_PROVISIONING_QUERY_BLE, clientResponse->addr->addr);
87
88     OIC_LOG_V(DEBUG, TAG, "query = %s", query);
89
90     OCDevAddr *devaddress = &clientResponse->devAddr;
91     devaddress->adapter = OC_ADAPTER_GATT_BTLE;
92
93     //OCPayloadLogRep(DEBUG,TAG,input);
94
95     if (ProvisionEnrollee(OC_HIGH_QOS, query, OC_RSRVD_ES_URI_PROV, devaddress,
96                           5  /* 5s delay to avoid packet drop*/) != OC_STACK_OK) {
97         OIC_LOG(INFO, TAG,
98                 "GetProvisioningStatusResponse received NULL clientResponse.Invoking Provisioing Status Callback");
99
100         ErrorCallback(DEVICE_NOT_PROVISIONED);
101         ClearMemory();
102         return OC_STACK_DELETE_TRANSACTION;
103     }
104
105     return OC_STACK_KEEP_TRANSACTION;
106
107 }
108
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);
115     return ret;
116 }
117
118
119 // This is a function called back when a device is discovered
120 OCStackApplicationResult FindProvisioningResourceResponse(void *ctx, OCDoHandle handle,
121                                                           OCClientResponse *clientResponse) {
122
123     OIC_LOG(INFO, TAG, PCF("Entering FindProvisioningResourceResponse"));
124
125     // If user stopped the process then return from this function;
126     if (IsSetupStopped()) {
127         ErrorCallback(DEVICE_NOT_PROVISIONED);
128         ClearMemory();
129         return OC_STACK_DELETE_TRANSACTION;
130     }
131
132     if (!ValidateFinddResourceResponse(clientResponse)) {
133         ErrorCallback(DEVICE_NOT_PROVISIONED);
134         return OC_STACK_DELETE_TRANSACTION;
135     }
136
137     OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;
138
139     ProvisioningInfo *provInfo;
140     char szQueryUri[64] =
141             {0};
142
143     OCDiscoveryPayload *discoveryPayload = (OCDiscoveryPayload * )(clientResponse->payload);
144
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;
150     }
151
152     OIC_LOG_V(DEBUG, TAG, "resUri = %s", discoveryPayload->resources->uri);
153
154     snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY_BLE,
155              clientResponse->addr->addr);
156
157     OCDevAddr *devaddress = &clientResponse->devAddr;
158     devaddress->adapter = OC_ADAPTER_GATT_BTLE;
159
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);
163     else
164         OIC_LOG_V(INFO, TAG, "unequal %s %s", netProvInfo->netAddressInfo.WIFI.ipAddress,
165                   clientResponse->devAddr.addr);
166
167     OIC_LOG_V(DEBUG, TAG, "query before GetProvisioningStatus call = %s %d", szQueryUri,
168               devaddress->adapter);
169
170     if (GetProvisioningStatus(OC_HIGH_QOS, szQueryUri, devaddress) != OC_STACK_OK) {
171         ErrorCallback(DEVICE_NOT_PROVISIONED);
172         return OC_STACK_DELETE_TRANSACTION;
173     }
174
175     return OC_STACK_KEEP_TRANSACTION;
176
177 }
178
179 bool ValidateEasySetupParams(const EnrolleeNWProvInfo_t *netInfo,
180                              OCProvisioningStatusCB provisioningStatusCallback) {
181
182     if (netInfo == NULL || strlen(netInfo->netAddressInfo.LE.leMacAddress) == 0) {
183         OIC_LOG(ERROR, TAG, "Request URI is NULL");
184         return false;
185     }
186
187     if (provisioningStatusCallback == NULL) {
188         OIC_LOG(ERROR, TAG, "ProvisioningStatusCallback is NULL");
189         return false;
190     }
191
192     return true;
193
194 }
195