1 /* ****************************************************************
3 * Copyright 2016 Samsung Electronics All Rights Reserved.
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 ******************************************************************/
21 #include "ocendpoint.h"
23 #include "oic_malloc.h"
24 #include "oic_string.h"
26 #include "cainterface.h"
28 #define VERIFY_NON_NULL(arg) { if (!arg) {OIC_LOG(FATAL, TAG, #arg " is NULL"); goto exit;} }
29 #define VERIFY_GT_ZERO(arg) { if (arg < 1) {OIC_LOG(FATAL, TAG, #arg " < 1"); goto exit;} }
30 #define VERIFY_GT(arg1, arg2) { if (arg1 <= arg2) {OIC_LOG(FATAL, TAG, #arg1 " <= " #arg2); goto exit;} }
31 #define TAG "OIC_RI_ENDPOINT"
33 OCStackResult OCGetSupportedEndpointFlags(const OCTpsSchemeFlags givenFlags, OCTpsSchemeFlags* out)
37 return OC_STACK_INVALID_PARAM;
40 CATransportAdapter_t SelectedNetwork = CAGetSelectedNetwork();
41 if ((givenFlags & (OC_COAP | OC_COAPS)) && (SelectedNetwork & CA_ADAPTER_IP))
43 *out = (OCTpsSchemeFlags)(*out | OC_COAP);
47 *out = (OCTpsSchemeFlags)(*out | OC_COAPS);
51 if ((givenFlags & (OC_COAP_TCP | OC_COAPS_TCP)) && (SelectedNetwork & CA_ADAPTER_TCP))
54 *out = (OCTpsSchemeFlags)(*out | OC_COAP_TCP);
58 *out = (OCTpsSchemeFlags)(*out | OC_COAPS_TCP);
63 if ((givenFlags & OC_COAP_RFCOMM) && (SelectedNetwork & CA_ADAPTER_RFCOMM_BTEDR))
65 *out = (OCTpsSchemeFlags)(*out | OC_COAP_RFCOMM);
72 OCStackResult OCGetMatchedTpsFlags(const CATransportAdapter_t adapter,
73 const CATransportFlags_t flags,
74 OCTpsSchemeFlags* out)
76 // return matched TPS Flags with given CA flags.
79 OIC_LOG(ERROR, TAG, "out param is NULL!!!");
80 return OC_STACK_INVALID_PARAM;
83 if ((adapter & OC_ADAPTER_IP) && (flags & (OC_IP_USE_V4 | OC_IP_USE_V6)))
85 if (flags & OC_FLAG_SECURE)
88 // typecasting to support C90(arduino)
89 *out = (OCTpsSchemeFlags)(*out | OC_COAPS);
93 // typecasting to support C90(arduino)
94 *out = (OCTpsSchemeFlags)(*out | OC_COAP);
99 if ((adapter & OC_ADAPTER_TCP) && (flags & (OC_IP_USE_V4 | OC_IP_USE_V6)))
101 if (flags & OC_FLAG_SECURE)
104 // typecasting to support C90(arduino)
105 *out = (OCTpsSchemeFlags)(*out | OC_COAPS_TCP);
110 // typecasting to support C90(arduino)
111 *out = (OCTpsSchemeFlags)(*out | OC_COAP_TCP);
117 // @todo iotivity not support http transport yet...
120 // @todo iotivity not support https transport yet...
124 if ((adapter & OC_ADAPTER_RFCOMM_BTEDR) && (flags == OC_DEFAULT_FLAGS))
126 // typecasting to support C90(arduino)
127 *out = (OCTpsSchemeFlags)(*out | OC_COAP_RFCOMM);
135 OCStackResult OCConvertTpsToString(const OCTpsSchemeFlags tps, char** out)
137 // return given tps as string for payload
138 // OC_COAP_IPV4 -> OC_COAP
142 return OC_STACK_INVALID_PARAM;
148 *out = OICStrdup(COAP_STR);
152 *out = OICStrdup(COAPS_STR);
156 *out = OICStrdup(COAP_TCP_STR);
160 *out = OICStrdup(COAPS_TCP_STR);
165 *out = OICStrdup(HTTP_STR);
169 *out = OICStrdup(HTTPS_STR);
174 *out = OICStrdup(COAP_RFCOMM_STR);
178 return OC_STACK_INVALID_PARAM;
180 VERIFY_NON_NULL(*out);
184 return OC_STACK_NO_MEMORY;
187 char* OCCreateEndpointString(const OCEndpointPayload* endpoint)
194 char* buf = (char*)OICCalloc(MAX_ADDR_STR_SIZE, sizeof(char));
195 VERIFY_NON_NULL(buf);
197 if ((strcmp(endpoint->tps, COAP_STR) == 0) || (strcmp(endpoint->tps, COAPS_STR) == 0)
199 || (strcmp(endpoint->tps, COAP_TCP_STR) == 0) ||(strcmp(endpoint->tps, COAPS_TCP_STR) == 0)
202 || (strcmp(endpoint->tps, HTTP_STR) == 0) ||(strcmp(endpoint->tps, HTTPS_STR) == 0)
206 // checking addr is ipv4 or not
207 if (endpoint->family == OC_IP_USE_V4)
210 sprintf(buf, "%s://%s:%d", endpoint->tps, endpoint->addr, endpoint->port);
215 sprintf(buf, "%s://[%s]:%d", endpoint->tps, endpoint->addr, endpoint->port);
219 else if ((strcmp(endpoint->tps, COAP_RFCOMM_STR) == 0))
222 sprintf(buf, "%s://%s", endpoint->tps, endpoint->addr);
227 OIC_LOG_V(ERROR, TAG, "Payload has invalid TPS!!! %s", endpoint->tps);
236 OCStackResult OCParseEndpointString(const char* endpointStr, OCEndpointPayload* out)
238 if (!endpointStr || !out)
240 return OC_STACK_INVALID_PARAM;
249 size_t tpsCharsToWrite = 0;
250 size_t addrCharsToWrite = 0;
251 OCStackResult isEnabledAdapter = OC_STACK_ADAPTER_NOT_ENABLED;
252 OCTransportAdapter parsedAdapter = OC_DEFAULT_ADAPTER;
254 tps = (char*)OICCalloc(OC_MAX_TPS_STR_SIZE, sizeof(char));
255 VERIFY_NON_NULL(tps);
257 addr = (char*)OICCalloc(OC_MAX_ADDR_STR_SIZE, sizeof(char));
258 VERIFY_NON_NULL(addr);
260 origin = OICStrdup(endpointStr);
261 VERIFY_NON_NULL(origin);
264 tokPos = strstr(origin, OC_ENDPOINT_TPS_TOKEN);
265 VERIFY_NON_NULL(tokPos);
268 tpsCharsToWrite = tokPos - origin;
269 VERIFY_GT_ZERO(tpsCharsToWrite);
270 VERIFY_GT((size_t)OC_MAX_TPS_STR_SIZE, tpsCharsToWrite);
271 ret = memcpy(tps, origin, tpsCharsToWrite);
272 VERIFY_NON_NULL(ret);
273 OIC_LOG_V(INFO, TAG, "parsed tps is:%s", tps);
276 if (strcmp(tps, COAP_STR) == 0)
278 isEnabledAdapter = OC_STACK_OK;
279 parsedAdapter = OC_ADAPTER_IP;
281 else if (strcmp(tps, COAPS_STR) == 0)
283 isEnabledAdapter = OC_STACK_OK;
284 parsedAdapter = OC_ADAPTER_IP;
287 else if (strcmp(tps, COAP_TCP_STR) == 0)
289 isEnabledAdapter = OC_STACK_OK;
290 parsedAdapter = OC_ADAPTER_TCP;
292 else if (strcmp(tps, COAPS_TCP_STR) == 0)
294 isEnabledAdapter = OC_STACK_OK;
295 parsedAdapter = OC_ADAPTER_TCP;
299 // @todo iotivity not support http, https transport yet...
302 else if (strcmp(tps, COAP_RFCOMM_STR) == 0)
304 isEnabledAdapter = OC_STACK_OK;
305 parsedAdapter = OC_ADAPTER_RFCOMM_BTEDR;
308 // ignore unrecognized tps type
309 if (isEnabledAdapter == OC_STACK_ADAPTER_NOT_ENABLED
310 && parsedAdapter == OC_DEFAULT_ADAPTER)
315 return OC_STACK_ADAPTER_NOT_ENABLED;
319 if (parsedAdapter == OC_ADAPTER_RFCOMM_BTEDR)
323 ret = strcpy(addr, tokPos);
324 VERIFY_NON_NULL(ret);
327 out->family = OC_DEFAULT_FLAGS;
333 // first check epl has square bracket
334 tmp = strchr(origin, OC_ENDPOINT_BRACKET_START);
337 out->family = OC_IP_USE_V6;
339 tmp = strrchr(origin, OC_ENDPOINT_BRACKET_END);
343 out->family = OC_IP_USE_V4;
345 tmp = strrchr(origin, OC_ENDPOINT_ADDR_TOKEN);
347 VERIFY_NON_NULL(tmp);
350 addrCharsToWrite = tmp - tokPos;
351 VERIFY_GT_ZERO(addrCharsToWrite);
352 VERIFY_GT((size_t)OC_MAX_ADDR_STR_SIZE, addrCharsToWrite);
353 ret = memcpy(addr, tokPos, addrCharsToWrite);
354 VERIFY_NON_NULL(ret);
355 OIC_LOG_V(INFO, TAG, "parsed addr is:%s", addr);
357 tmp = strrchr(origin, OC_ENDPOINT_ADDR_TOKEN);
358 VERIFY_NON_NULL(tmp);
362 VERIFY_GT_ZERO(atoi(tokPos));
363 OIC_LOG_V(INFO, TAG, "parsed port is:%s", tokPos);
367 out->port = atoi(tokPos);
388 return OC_STACK_ERROR;
391 OCTpsSchemeFlags OCGetSupportedTpsFlags()
393 OCTpsSchemeFlags ret = OC_NO_TPS;
394 CATransportAdapter_t SelectedNetwork = CAGetSelectedNetwork();
396 if (SelectedNetwork & CA_ADAPTER_IP)
398 ret = (OCTpsSchemeFlags)(ret | OC_COAP);
402 ret = (OCTpsSchemeFlags)(ret | OC_COAPS);
406 if (SelectedNetwork & CA_ADAPTER_TCP)
408 ret = (OCTpsSchemeFlags)(ret | OC_COAP_TCP);
412 ret = (OCTpsSchemeFlags)(ret | OC_COAPS_TCP);
417 if (SelectedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
419 ret = (OCTpsSchemeFlags)(ret | OC_COAP_RFCOMM);