replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / src / consumer / NSConsumerDiscovery.c
index 2e44986..28c137e 100644 (file)
 
 #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_PAYLOAD_KEY_ACCEPTER "ACCEPTER"
-#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"
-
-OCDoHandle * getPresenceHandle()
-{
-    static OCDoHandle * g_PresenceHandle = NULL;
-
-    return g_PresenceHandle;
-}
+#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(
-        OCDoHandle handle, OCClientResponse * clientResponse)
+        void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
 {
+    (void) ctx;
     (void) handle;
-    NS_LOG_V(DEBUG, "Presence income : %s:%d",
+
+    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(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())
     {
@@ -59,63 +61,98 @@ OCStackApplicationResult NSConsumerPresenceListener(
     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)
     {
-    NSSendRequest(NULL, OC_REST_DISCOVER, clientResponse->addr,
-            NS_DISCOVER_QUERY, NULL, NSProviderDiscoverListener);
+        NS_LOG(DEBUG, "started presence or resource is created.");
+        NSInvokeRequest(NULL, OC_REST_DISCOVER, clientResponse->addr,
+            NS_DISCOVER_QUERY, NULL, NSProviderDiscoverListener, NULL, NULL,
+            clientResponse->addr->adapter);
     }
 
     return OC_STACK_KEEP_TRANSACTION;
 }
 
 OCStackApplicationResult NSProviderDiscoverListener(
-        OCDoHandle handle, OCClientResponse * clientResponse)
+        void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
 {
     (void) handle;
-    NS_LOG_V(DEBUG, "Discover income : %s:%d",
+
+    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(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;
     }
 
-    if (!clientResponse->payload)
-    {
-        return OC_STACK_KEEP_TRANSACTION;
-    }
+    OCDiscoveryPayload * discoveryPayload = (OCDiscoveryPayload *)clientResponse->payload;
 
-    OCResourcePayload * resource = ((OCDiscoveryPayload *)clientResponse->payload)->resources;
-    while (resource)
+    while (discoveryPayload)
     {
-        if (!strcmp(resource->uri, NS_RESOURCE_URI))
+        OCResourcePayload * resource = discoveryPayload->resources;
+        while (resource)
         {
-            NSSendRequest(
-                    NULL, OC_REST_GET, clientResponse->addr,
-                    NS_RESOURCE_URI, NULL, NSIntrospectProvider);
+            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;
 }
 
 OCStackApplicationResult NSIntrospectProvider(
-        OCDoHandle handle, OCClientResponse * clientResponse)
+        void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
 {
     (void) handle;
-    int64_t accepter = 0;
 
-    NS_LOG_V(DEBUG, "GET response income : %s:%d",
+    NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
+    NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
+
+    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);
@@ -123,111 +160,98 @@ OCStackApplicationResult NSIntrospectProvider(
             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())
     {
         return OC_STACK_DELETE_TRANSACTION;
     }
 
-    if (!clientResponse->payload)
+    NSProvider_internal * newProvider = NSGetProvider(clientResponse);
+    NS_VERIFY_NOT_NULL(newProvider, OC_STACK_KEEP_TRANSACTION);
+    if (ctx && ctx == (void *)NS_DISCOVER_CLOUD )
     {
-        NS_LOG(ERROR, "payload is null");
-        return OC_STACK_KEEP_TRANSACTION;
+        newProvider->connection->isCloudConnection = true;
     }
 
-    if (!OCRepPayloadGetPropInt((OCRepPayload *)clientResponse->payload,
-            NS_PAYLOAD_KEY_ACCEPTER, & accepter))
-    {
-        NS_LOG(ERROR, "can not seach for accepter");
-        return OC_STACK_KEEP_TRANSACTION;
-    }
+    NS_LOG(DEBUG, "build NSTask");
+    NSTask * task = NSMakeTask(TASK_CONSUMER_PROVIDER_DISCOVERED, (void *) newProvider);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveProvider_internal(newProvider));
 
-    NSProvider * newProvider = (NSProvider *)OICMalloc(sizeof(NSProvider));
-    if (!newProvider)
-    {
-        NS_LOG(DEBUG, "NSProvider allocation fail");
-        return OC_STACK_KEEP_TRANSACTION;
-    }
+    NSConsumerPushEvent(task);
 
-    // TODO set id
-    newProvider->mId = NULL;
-    newProvider->mUserData = (void *)OICMalloc(sizeof(OCDevAddr));
-    if (!newProvider)
-    {
-        NS_LOG(DEBUG, "OCDevAddr allocation fail");
-        OICFree(newProvider);
-        return OC_STACK_KEEP_TRANSACTION;
-    }
-    memcpy(newProvider->mUserData, clientResponse->addr, sizeof(OCDevAddr));
+    return OC_STACK_KEEP_TRANSACTION;
+}
+
+void NSConsumerHandleRequestDiscover(OCDevAddr * address, NSConsumerDiscoverType rType)
+{
+    OCConnectivityType type = CT_ADAPTER_IP;
+    NSConsumerDiscoverType * callbackData = NULL;
 
+    if (address)
     {
-        OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
-        while (payload)
+        if (address->adapter == OC_ADAPTER_IP)
+        {
+            NS_LOG(DEBUG, "Request discover [UDP]");
+        }
+        else if (address->adapter == OC_ADAPTER_TCP)
         {
-            NS_LOG_V(DEBUG, "Payload Key : %s", payload->values->name);
-            payload = payload->next;
+            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);
         }
     }
-
-    if (!OCRepPayloadGetPropString((OCRepPayload *)clientResponse->payload,
-            "MESSAGE_URI", & newProvider->messageUri))
+    else
     {
-        OICFree(newProvider->mUserData);
-        OICFree(newProvider);
-        NS_LOG(ERROR, "can not seach for message uri");
-        return OC_STACK_KEEP_TRANSACTION;
+        NS_LOG(DEBUG, "Request Multicast discover [UDP]");
     }
 
-    if (!OCRepPayloadGetPropString((OCRepPayload *)clientResponse->payload,
-            NS_ATTRIBUTE_SYNC, & newProvider->syncUri))
-    {
-        OICFree(newProvider->messageUri);
-        OICFree(newProvider->mUserData);
-        OICFree(newProvider);
-        NS_LOG(ERROR, "can not seach for sync uri");
-        return OC_STACK_KEEP_TRANSACTION;
-    }
+    NSInvokeRequest(NULL, OC_REST_DISCOVER, address, NS_DISCOVER_QUERY,
+            NULL, NSProviderDiscoverListener, (void *)callbackData, NULL, type);
+}
 
-    if (accepter == NS_ACCEPTER_CONSUMER)
-    {
-        NS_LOG(DEBUG, "accepter is NS_ACCEPTER_CONSUMER, Callback to user");
+void NSConsumerDiscoveryTaskProcessing(NSTask * task)
+{
+    NS_VERIFY_NOT_NULL_V(task);
 
-        NSDiscoveredProvider(newProvider);
-    }
-    else
+    NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
+    if (task->taskType == TASK_CONSUMER_REQ_DISCOVER)
     {
-        NS_LOG(DEBUG, "accepter is NS_ACCEPTER_PROVIDER, request subscribe");
+        char * address = (char *) task->taskData;
+        NSConsumerDiscoverType dType = NS_DISCOVER_DEFAULT;
 
-        NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) newProvider);
-        if (!task)
+        OCDevAddr * addr = NULL;
+        if (address)
         {
-            NS_LOG(DEBUG, "NSTask allocation fail");
-            return OC_STACK_KEEP_TRANSACTION;
+            addr = NSChangeAddress(address);
+            dType = NS_DISCOVER_CLOUD;
         }
 
-        NSConsumerPushEvent(task);
+        NSConsumerHandleRequestDiscover(addr, dType);
+        NSOICFree(task->taskData);
+        NSOICFree(addr);
     }
-
-    return OC_STACK_KEEP_TRANSACTION;
-}
-
-void NSConsumerDiscoveryTaskProcessing(NSTask * task)
-{
-    if (!task)
+    else if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_EVENT_CONNECTED_TCP)
     {
-        NS_LOG(ERROR, "task is null");
-        return;
-    }
-
-    NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
-    if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_CONSUMER_REQ_DISCOVER)
-    {
-        NSSendRequest(NULL, OC_REST_DISCOVER, NULL, NS_DISCOVER_QUERY,
-                NULL, NSProviderDiscoverListener);
+        NSConsumerHandleRequestDiscover((OCDevAddr *) task->taskData, NS_DISCOVER_DEFAULT);
+        NSOICFree(task->taskData);
     }
     else
     {
         NS_LOG(ERROR, "Unknown type message");
     }
-}
 
+    NSOICFree(task);
+}