+OCDevAddr * NSChangeAddress(const char * inputaddress)
+{
+ NS_VERIFY_NOT_NULL(inputaddress, NULL);
+
+ char * address = (char *)inputaddress;
+ char * schema = strstr(inputaddress, "//");
+ if (schema)
+ {
+ address = schema + 2;
+ }
+ size_t prefixLen = schema - inputaddress;
+ if (prefixLen <= 0)
+ {
+ NS_LOG(ERROR, "Invalid Input address.");
+ return NULL;
+ }
+
+ OCTransportFlags flags = OC_DEFAULT_FLAGS;
+ OCTransportAdapter adapter = OC_ADAPTER_IP;
+ if (strstr(inputaddress, "coap+tcp://"))
+ {
+ NS_LOG(DEBUG, "address : TCP");
+ adapter = OC_ADAPTER_TCP;
+ }
+ else if (strstr(inputaddress, "coaps://"))
+ {
+ NS_LOG(DEBUG, "address : UDP + SECURED");
+ flags |= OC_FLAG_SECURE;
+ }
+ else if (strstr(inputaddress, "coaps+tcp://"))
+ {
+ NS_LOG(DEBUG, "address : TCP + SECURED");
+ flags |= OC_FLAG_SECURE;
+ adapter = OC_ADAPTER_TCP;
+ }
+ else if (strstr(inputaddress, "coap://"))
+ {
+ NS_LOG(DEBUG, "address : UDP");
+ }
+ else
+ {
+ NS_LOG(ERROR, "Invalid CoAP Schema.");
+ return NULL;
+ }
+
+ OCDevAddr * retAddr = NULL;
+ retAddr = (OCDevAddr *) OICMalloc(sizeof(OCDevAddr));
+ NS_VERIFY_NOT_NULL(retAddr, NULL);
+
+ char * start = address;
+ char * end = address;
+ if (address[0] == '[')
+ {
+ flags |= OC_IP_USE_V6;
+ end = strchr(++address, ']');
+ if (!end || end <= start)
+ {
+ NS_LOG(ERROR, "Invalid Input Address - IPv6.");
+ NSOICFree(retAddr);
+ return NULL;
+ }
+ memset(retAddr->addr, 0, (size_t)MAX_ADDR_STR_SIZE);
+ OICStrcpy(retAddr->addr, (size_t)(end-start), address);
+ }
+ else
+ {
+ flags |= OC_IP_USE_V4;
+ end = strchr(address, ':');
+ if (!end || end <= start)
+ {
+ NS_LOG(ERROR, "Invalid Input Address - IPv4.");
+ NSOICFree(retAddr);
+ return NULL;
+ }
+ char * end2 = strchr(end + 1, ':');
+ if (end2)
+ {
+ NS_LOG(ERROR, "Invalid Input Address - IPv4.");
+ NSOICFree(retAddr);
+ return NULL;
+ }
+ memset(retAddr->addr, 0, (size_t)MAX_ADDR_STR_SIZE);
+ OICStrcpy(retAddr->addr, (size_t)(end-start)+1, address);
+ }
+
+ retAddr->adapter = adapter;
+ retAddr->flags = flags;
+
+ address = end + 1;
+ int tmp = 0;
+ if (flags & OC_IP_USE_V6)
+ {
+ address++;
+ }
+ uint16_t port = address[tmp++] - '0';
+
+ while(true)
+ {
+ if (address[tmp] == '\0' || address[tmp] > '9' || address[tmp] < '0')
+ {
+ break;
+ }
+ if (tmp >= 5 || (port >= 6553 && (address[tmp] -'0') >= 6))
+ {
+ NS_LOG_V(ERROR, "Invalid Input Address - Port. %d", tmp+1);
+ NSOICFree(retAddr);
+ return NULL;
+ }
+ port *= 10;
+ port += address[tmp++] - '0';
+ }
+
+ retAddr->port = port;
+
+ NS_LOG(DEBUG, "Change Address for TCP request");
+ NS_LOG_V(INFO_PRIVATE, "Origin : %s", inputaddress);
+ NS_LOG_V(INFO_PRIVATE, "Changed Addr : %s", retAddr->addr);
+ NS_LOG_V(INFO_PRIVATE, "Changed Port : %d", retAddr->port);
+
+ return retAddr;
+}
+
+bool NSOCResultToSuccess(OCStackResult ret)
+{
+ switch (ret)
+ {
+ case OC_STACK_OK:
+ case OC_STACK_RESOURCE_CREATED:
+ case OC_STACK_RESOURCE_DELETED:
+ case OC_STACK_PRESENCE_STOPPED:
+ case OC_STACK_CONTINUE:
+ case OC_STACK_RESOURCE_CHANGED:
+ return true;
+ default:
+ NS_LOG_V(DEBUG, "OCStackResult : %d", (int)ret);
+ return false;
+ }
+}
+