X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fnotification%2Fsrc%2Fconsumer%2FNSConsumerDiscovery.c;h=28c137e7e73276b765d8e8f78ea4529884befe57;hb=419a77de36d75ab0d947237e0f45a44405825792;hp=dc6ab9ae02a67d8cadd5cdb1c00507198ddeba90;hpb=705120561e5ffb4788f36ad27f62dd46c45ab470;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/notification/src/consumer/NSConsumerDiscovery.c b/service/notification/src/consumer/NSConsumerDiscovery.c index dc6ab9a..28c137e 100644 --- a/service/notification/src/consumer/NSConsumerDiscovery.c +++ b/service/notification/src/consumer/NSConsumerDiscovery.c @@ -22,32 +22,35 @@ #include #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_CONSUMER_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_CONSUMER_LOG_V(DEBUG, "Presence result : %d", + NS_LOG_V(DEBUG, "Presence result : %d", clientResponse->result); - NS_CONSUMER_LOG_V(DEBUG, "Presence sequenceNum : %d", + NS_LOG_V(DEBUG, "Presence sequenceNum : %d", clientResponse->sequenceNumber); + NS_LOG_V(DEBUG, "Presence Transport Type : %d", + clientResponse->devAddr.adapter); if (!NSIsStartedConsumer()) { @@ -58,175 +61,197 @@ OCStackApplicationResult NSConsumerPresenceListener( if (payload->trigger == OC_PRESENCE_TRIGGER_DELETE || clientResponse->result == OC_STACK_PRESENCE_STOPPED) { - // TODO find request and cancel - NS_CONSUMER_LOG(DEBUG, "stopped presence or resource is deleted."); - //OCCancel(handle, NS_QOS, NULL, 0); + NS_LOG(DEBUG, "stopped presence or resource is deleted."); + 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) { - NSRequestToResourceIntrospection(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_CONSUMER_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_CONSUMER_LOG_V(DEBUG, "Discover result : %d", + NS_LOG_V(DEBUG, "Discover result : %d", clientResponse->result); - NS_CONSUMER_LOG_V(DEBUG, "Discover sequenceNum : %d", + 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) { - NSRequestToResourceIntrospection( - NULL, OC_REST_GET, clientResponse->addr, - NS_RESOURCE_URI, NULL, NSGetProviderInformation); + 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 NSGetProviderInformation( - OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult NSIntrospectProvider( + void * ctx, OCDoHandle handle, OCClientResponse * clientResponse) { (void) handle; - int64_t accepter = 0; - NS_CONSUMER_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_CONSUMER_LOG_V(DEBUG, "GET response result : %d", + NS_LOG_V(DEBUG, "GET response result : %d", clientResponse->result); - NS_CONSUMER_LOG_V(DEBUG, "GET response sequenceNum : %d", + NS_LOG_V(DEBUG, "GET response sequenceNum : %d", clientResponse->sequenceNumber); - NS_CONSUMER_LOG_V(DEBUG, "GET response resource uri : %s", + 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_CONSUMER_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_CONSUMER_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_CONSUMER_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_CONSUMER_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_CONSUMER_LOG_V(DEBUG, "Payload Key : %s", payload->values->name); - payload = payload->next; + 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); } } - - if (!OCRepPayloadGetPropString((OCRepPayload *)clientResponse->payload, - "MESSAGE_URI", & newProvider->messageUri)) + else { - OICFree(newProvider->mUserData); - OICFree(newProvider); - NS_CONSUMER_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_CONSUMER_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_CONSUMER_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_CONSUMER_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_CONSUMER_LOG(DEBUG, "NSTask allocation fail"); - return OC_STACK_KEEP_TRANSACTION; + addr = NSChangeAddress(address); + dType = NS_DISCOVER_CLOUD; } - NSConsumerPushEvent(task); - } - - return OC_STACK_KEEP_TRANSACTION; -} - -void NSConsumerDiscoveryHandleMsg(NSTask * task) -{ - if (!task) - { - NS_CONSUMER_LOG(ERROR, "task is null"); - return; + NSConsumerHandleRequestDiscover(addr, dType); + NSOICFree(task->taskData); + NSOICFree(addr); } - - NS_CONSUMER_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType); - if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_CONSUMER_REQ_DISCOVER) + else if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_EVENT_CONNECTED_TCP) { - NSRequestToResourceIntrospection(NULL, OC_REST_DISCOVER, NULL, NS_DISCOVER_QUERY, - NULL, NSProviderDiscoverListener); + NSConsumerHandleRequestDiscover((OCDevAddr *) task->taskData, NS_DISCOVER_DEFAULT); + NSOICFree(task->taskData); } else { - NS_CONSUMER_LOG(ERROR, "Unknown type message"); + NS_LOG(ERROR, "Unknown type message"); } -} + NSOICFree(task); +}