security provisioning cloud c++ fixs
[iotivity.git] / resource / csdk / security / provisioning / src / cloud / utils.c
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 #include "utils.h"
21
22 #include "experimental/logger.h"
23 #include "experimental/payload_logging.h"
24 #include "oic_malloc.h"
25 #include "experimental/doxmresource.h"
26 #include "srmutility.h"
27 #include "pmutility.h"
28
29 #define TAG "OIC_CLOUD_UTILS"
30
31 typedef struct {
32     void *ctx;
33     OCCloudResponseCB cb;
34     UserFunctionCB fn;
35     void *params;
36 }ContextInfo_t;
37
38 const char *DEFAULT_QUERY  = COAP_TCP_QUERY;
39 const char *DEFAULT_PREFIX = COAP_TCP_PREFIX;
40
41 /**
42  * This function sets required CoAP prefix depending on
43  * secure or non-secure connection
44  *
45  * @param[in] secure   secure flag
46  */
47 void setCoapPrefix(bool secure)
48 {
49     if (secure)
50     {
51         DEFAULT_QUERY  = COAPS_TCP_QUERY;
52         DEFAULT_PREFIX = COAPS_TCP_PREFIX;
53     }
54     else
55     {
56         DEFAULT_QUERY  = COAP_TCP_QUERY;
57         DEFAULT_PREFIX = COAP_TCP_PREFIX;
58     }
59 }
60
61 /**
62  * This hepler function handles response from each request
63  * During execution it calls proper callbacks
64  *
65  * @param[in] ctx             context
66  * @param[in] handle          handle
67  * @param[in] clientResponse  response from peer
68  */
69 static OCStackApplicationResult handleResponse(void *ctx,
70                                               OCDoHandle handle,
71                                               OCClientResponse *response)
72 {
73     OC_UNUSED(handle);
74
75     if (NULL == response)
76     {
77         OIC_LOG_V(ERROR, TAG, "Received null response from client");
78         return OC_STACK_DELETE_TRANSACTION;
79     }
80
81     if (ctx)
82     {
83         void *data = NULL;
84
85         ContextInfo_t *info = (ContextInfo_t *)ctx;
86
87         if (info->fn)
88         {
89             response->result = ((UserFunctionCB)info->fn)(info->params, &data, response);
90         }
91
92         if (info->cb)
93         {
94             ((OCCloudResponseCB)info->cb)(info->ctx, response, data);
95         }
96     }
97
98     return OC_STACK_DELETE_TRANSACTION;
99 }
100
101 static void deleteContextInfo(void *info)
102 {
103     OICFree(info);
104 }
105
106 void fillCallbackData(OCCallbackData *cbData, void *ctx, OCCloudResponseCB cb,
107                                               UserFunctionCB fn, void *params)
108 {
109     memset(cbData, 0, sizeof(OCCallbackData));
110
111     ContextInfo_t *info = (ContextInfo_t *)OICCalloc(1, sizeof(ContextInfo_t));
112     if (!info)
113     {
114         OIC_LOG(ERROR, TAG, "Can't allocate memory for info");
115         return;
116     }
117
118     info->ctx = ctx;
119     info->cb  = cb;
120     info->fn  = fn;
121     info->params = params;
122
123     cbData->cb = handleResponse;
124     cbData->cd = deleteContextInfo;
125     cbData->context = info;
126 }
127
128 char * getDeviceId(void)
129 {
130     char *deviceId = NULL;
131     OicUuid_t uuid;
132
133     OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
134
135     memset(&uuid, 0, sizeof(uuid));
136     if (OC_STACK_OK != GetDoxmDeviceID(&uuid))
137     {
138         OIC_LOG(ERROR, TAG, "Cann't get the device id(GetDoxmDeviceID)");
139         goto exit;
140     }
141
142     if (OC_STACK_OK != ConvertUuidToStr(&uuid, &deviceId))
143     {
144         OIC_LOG(ERROR, TAG, "Cann't get the device id(ConvertUuidToStr)");
145         goto exit;
146     }
147
148     OIC_LOG_V(DEBUG, TAG, "device Id: %s", deviceId);
149 exit:
150     OIC_LOG_V(DEBUG, TAG, "OUT: %s", __func__);
151     return deviceId;
152 }
153
154 /**
155  * Clear previously filled array of strings
156  *
157  * @param[out] list           array of strings structure to clear
158  * @param[in] count           elements count
159  */
160 void clearStringArray(stringArray_t *list)
161 {
162     if (!list || !list->array)
163     {
164         return;
165     }
166
167     for (size_t i = 0; i < list->length; i++)
168     {
169         OICFree(list->array[i]);
170     }
171     OICFree(list->array);
172 }
173