#include <string.h>
#include "NSCommon.h"
+#include "NSUtil.h"
#include "NSConsumerCommon.h"
#include "NSConstants.h"
#include "ocpayload.h"
#include "oic_malloc.h"
#include "oic_string.h"
-#define NS_DISCOVER_QUERY "/oic/res?rt=oic.r.notification"
-#define NS_PRESENCE_SUBSCRIBE_QUERY "coap://224.0.1.187:5683/oic/ad?rt=oic.r.notification"
-#define NS_GET_INFORMATION_QUERY "/notification?if=oic.if.notification"
-
-NSProvider_internal * NSGetProvider(OCClientResponse * clientResponse);
+#define NS_DISCOVER_QUERY "/oic/res?rt=x.org.iotivity.notification"
+#define NS_PRESENCE_SUBSCRIBE_QUERY_TCP "/oic/ad?rt=x.org.iotivity.notification"
OCStackApplicationResult NSConsumerPresenceListener(
void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
(void) ctx;
(void) handle;
- NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
- NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_STACK_SUCCESS(
+ NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
- NS_LOG_V(DEBUG, "Presence income : %s:%d",
+ NS_LOG_V(INFO_PRIVATE, "Presence income : %s:%d",
clientResponse->devAddr.addr, clientResponse->devAddr.port);
NS_LOG_V(DEBUG, "Presence result : %d",
clientResponse->result);
NS_LOG_V(DEBUG, "Presence sequenceNum : %d",
clientResponse->sequenceNumber);
+ NS_LOG_V(DEBUG, "Presence Transport Type : %d",
+ clientResponse->devAddr.adapter);
if (!NSIsStartedConsumer())
{
if (payload->trigger == OC_PRESENCE_TRIGGER_DELETE ||
clientResponse->result == OC_STACK_PRESENCE_STOPPED)
{
- // TODO find request and cancel
NS_LOG(DEBUG, "stopped presence or resource is deleted.");
- //OCCancel(handle, NS_QOS, NULL, 0);
+ NS_LOG(DEBUG, "build NSTask");
+ OCDevAddr * addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
+ NS_VERIFY_NOT_NULL(addr, OC_STACK_KEEP_TRANSACTION);
+ memcpy(addr, clientResponse->addr, sizeof(OCDevAddr));
+
+ NSTask * task = NSMakeTask(TASK_CONSUMER_PROVIDER_DELETED, addr);
+ NS_VERIFY_NOT_NULL(task, OC_STACK_KEEP_TRANSACTION);
+
+ NSConsumerPushEvent(task);
}
else if (payload->trigger == OC_PRESENCE_TRIGGER_CREATE)
{
NS_LOG(DEBUG, "started presence or resource is created.");
NSInvokeRequest(NULL, OC_REST_DISCOVER, clientResponse->addr,
- NS_DISCOVER_QUERY, NULL, NSProviderDiscoverListener, NULL);
+ NS_DISCOVER_QUERY, NULL, NSProviderDiscoverListener, NULL, NULL,
+ clientResponse->addr->adapter);
}
return OC_STACK_KEEP_TRANSACTION;
OCStackApplicationResult NSProviderDiscoverListener(
void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
{
- (void) ctx;
(void) handle;
- NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
- NS_VERTIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION);
- NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
- NS_LOG_V(DEBUG, "Discover income : %s:%d",
+ NS_LOG_V(INFO_PRIVATE, "Discover income : %s:%d",
clientResponse->devAddr.addr, clientResponse->devAddr.port);
NS_LOG_V(DEBUG, "Discover result : %d",
clientResponse->result);
NS_LOG_V(DEBUG, "Discover sequenceNum : %d",
clientResponse->sequenceNumber);
+ NS_LOG_V(DEBUG, "Discover Transport Type : %d",
+ clientResponse->devAddr.adapter);
if (!NSIsStartedConsumer())
{
return OC_STACK_DELETE_TRANSACTION;
}
- OCResourcePayload * resource = ((OCDiscoveryPayload *)clientResponse->payload)->resources;
- while (resource)
+ OCDiscoveryPayload * discoveryPayload = (OCDiscoveryPayload *)clientResponse->payload;
+
+ while (discoveryPayload)
{
- if (!strcmp(resource->uri, NS_RESOURCE_URI))
+ OCResourcePayload * resource = discoveryPayload->resources;
+ while (resource)
{
- NSInvokeRequest(NULL, OC_REST_GET, clientResponse->addr,
- NS_RESOURCE_URI, NULL, NSIntrospectProvider, NULL);
+ NS_LOG_V(DEBUG, "Discovered resource uri : %s", resource->uri);
+ NS_VERIFY_NOT_NULL(resource->uri, OC_STACK_KEEP_TRANSACTION);
+ if (strstr(resource->uri, NS_RESOURCE_URI))
+ {
+ NS_LOG_V(DEBUG, "Request GET to provider : %s", resource->uri);
+ OCConnectivityType type = CT_DEFAULT;
+ if (clientResponse->addr->adapter == OC_ADAPTER_TCP)
+ {
+ type = CT_ADAPTER_TCP;
+ }
+
+ OCDevAddr * addr = clientResponse->addr;
+ if (resource->secure)
+ {
+ addr->port = resource->port;
+ addr->flags |= OC_FLAG_SECURE;
+ }
+
+ NSInvokeRequest(NULL, OC_REST_GET, addr,
+ resource->uri, NULL, NSIntrospectProvider, ctx,
+ NULL, type);
+ }
+ resource = resource->next;
}
- resource = resource->next;
+ discoveryPayload = discoveryPayload->next;
}
return OC_STACK_KEEP_TRANSACTION;
}
-void NSRemoveProviderObj(NSProvider_internal * provider)
-{
- NSOICFree(provider->messageUri);
- NSOICFree(provider->syncUri);
-
- provider->messageHandle = NULL;
- provider->syncHandle = NULL;
- NSOICFree(provider->addr);
-
- NSOICFree(provider);
-}
-
OCStackApplicationResult NSIntrospectProvider(
void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
{
- (void) ctx;
(void) handle;
- NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
- NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
- NS_LOG_V(DEBUG, "GET response income : %s:%d",
+ NS_LOG_V(INFO_PRIVATE, "GET response income : %s:%d",
clientResponse->devAddr.addr, clientResponse->devAddr.port);
NS_LOG_V(DEBUG, "GET response result : %d",
clientResponse->result);
clientResponse->sequenceNumber);
NS_LOG_V(DEBUG, "GET response resource uri : %s",
clientResponse->resourceUri);
+ NS_LOG_V(DEBUG, "GET response Transport Type : %d",
+ clientResponse->devAddr.adapter);
if (!NSIsStartedConsumer())
{
}
NSProvider_internal * newProvider = NSGetProvider(clientResponse);
- NS_VERTIFY_NOT_NULL(newProvider, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_NOT_NULL(newProvider, OC_STACK_KEEP_TRANSACTION);
+ if (ctx && ctx == (void *)NS_DISCOVER_CLOUD )
+ {
+ newProvider->connection->isCloudConnection = true;
+ }
NS_LOG(DEBUG, "build NSTask");
NSTask * task = NSMakeTask(TASK_CONSUMER_PROVIDER_DISCOVERED, (void *) newProvider);
- NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveProviderObj(newProvider));
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveProvider_internal(newProvider));
NSConsumerPushEvent(task);
return OC_STACK_KEEP_TRANSACTION;
}
-void NSGetProviderPostClean(char * pId, char * mUri, char * sUri, OCDevAddr * addr)
-{
- NSOICFree(pId);
- NSOICFree(mUri);
- NSOICFree(sUri);
- NSOICFree(addr);
-}
-
-NSProvider_internal * NSGetProvider(OCClientResponse * clientResponse)
+void NSConsumerHandleRequestDiscover(OCDevAddr * address, NSConsumerDiscoverType rType)
{
- NS_LOG(DEBUG, "create NSProvider");
- NS_VERTIFY_NOT_NULL(clientResponse->payload, NULL);
+ OCConnectivityType type = CT_ADAPTER_IP;
+ NSConsumerDiscoverType * callbackData = NULL;
- OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
- while (payload)
+ if (address)
{
- NS_LOG_V(DEBUG, "Payload Key : %s", payload->values->name);
- payload = payload->next;
+ if (address->adapter == OC_ADAPTER_IP)
+ {
+ NS_LOG(DEBUG, "Request discover [UDP]");
+ }
+ else if (address->adapter == OC_ADAPTER_TCP)
+ {
+ type = CT_ADAPTER_TCP;
+ NS_LOG(DEBUG, "Request discover and subscribe presence [TCP]");
+ NS_LOG(DEBUG, "Subscribe presence [TCP]");
+ NSInvokeRequest(NULL, OC_REST_PRESENCE, address, NS_PRESENCE_SUBSCRIBE_QUERY_TCP,
+ NULL, NSConsumerPresenceListener, NULL, NULL, type);
+
+ if (rType == NS_DISCOVER_CLOUD)
+ {
+ callbackData = (void *) NS_DISCOVER_CLOUD;
+ }
+ }
+ else
+ {
+ NS_LOG_V(INFO_PRIVATE, "Request discover But Adapter is not IP : %d", address->adapter);
+ }
+ }
+ else
+ {
+ NS_LOG(DEBUG, "Request Multicast discover [UDP]");
}
- payload = (OCRepPayload *)clientResponse->payload;
-
- char * providerId = NULL;
- char * messageUri = NULL;
- char * syncUri = NULL;
- int64_t accepter = 0;
- OCDevAddr * addr = NULL;
-
- NS_LOG(DEBUG, "get information of accepter");
- bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_POLICY, & accepter);
- NS_VERTIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
-
- NS_LOG(DEBUG, "get provider ID");
- getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, & providerId);
- NS_VERTIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
-
- NS_LOG(DEBUG, "get message URI");
- getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_MESSAGE, & messageUri);
- NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL, NULL,
- NSGetProviderPostClean(providerId, messageUri, syncUri, addr));
-
- NS_LOG(DEBUG, "get sync URI");
- getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_SYNC, & syncUri);
- NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL, NULL,
- NSGetProviderPostClean(providerId, messageUri, syncUri, addr));
-
- NS_LOG(DEBUG, "get provider address");
- addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
- NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(addr, NULL,
- NSGetProviderPostClean(providerId, messageUri, syncUri, addr));
- memcpy(addr, clientResponse->addr, sizeof(OCDevAddr));
-
- NSProvider_internal * newProvider
- = (NSProvider_internal *)OICMalloc(sizeof(NSProvider_internal));
- NS_VERTIFY_NOT_NULL(newProvider, NULL);
-
- OICStrcpy(newProvider->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
- NSOICFree(providerId);
- newProvider->messageUri = messageUri;
- newProvider->syncUri = syncUri;
- newProvider->accessPolicy = (NSAccessPolicy)accepter;
- newProvider->addr = addr;
- newProvider->messageHandle = NULL;
- newProvider->syncHandle = NULL;
-
- return newProvider;
+ NSInvokeRequest(NULL, OC_REST_DISCOVER, address, NS_DISCOVER_QUERY,
+ NULL, NSProviderDiscoverListener, (void *)callbackData, NULL, type);
}
void NSConsumerDiscoveryTaskProcessing(NSTask * task)
{
- NS_VERTIFY_NOT_NULL_V(task);
+ NS_VERIFY_NOT_NULL_V(task);
NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
- if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_CONSUMER_REQ_DISCOVER)
+ if (task->taskType == TASK_CONSUMER_REQ_DISCOVER)
+ {
+ char * address = (char *) task->taskData;
+ NSConsumerDiscoverType dType = NS_DISCOVER_DEFAULT;
+
+ OCDevAddr * addr = NULL;
+ if (address)
+ {
+ addr = NSChangeAddress(address);
+ dType = NS_DISCOVER_CLOUD;
+ }
+
+ NSConsumerHandleRequestDiscover(addr, dType);
+ NSOICFree(task->taskData);
+ NSOICFree(addr);
+ }
+ else if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_EVENT_CONNECTED_TCP)
{
- NSInvokeRequest(NULL, OC_REST_DISCOVER, NULL, NS_DISCOVER_QUERY,
- NULL, NSProviderDiscoverListener, NULL);
+ NSConsumerHandleRequestDiscover((OCDevAddr *) task->taskData, NS_DISCOVER_DEFAULT);
+ NSOICFree(task->taskData);
}
else
{
NS_LOG(ERROR, "Unknown type message");
}
+
+ NSOICFree(task);
}