X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fnotification%2Fsrc%2Fprovider%2FNSProviderListener.c;h=ea371cc2c73aabec9b561b1c47d5bcd171c6bde2;hb=c315c87e07c4080ecd0ef488e7a1047bc3c509b2;hp=5503aceda1a720802eba8af0f5daa492a85e415a;hpb=2cf77086eecdb9fe5d207d55bebe0b6633805b39;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/notification/src/provider/NSProviderListener.c b/service/notification/src/provider/NSProviderListener.c index 5503ace..ea371cc 100644 --- a/service/notification/src/provider/NSProviderListener.c +++ b/service/notification/src/provider/NSProviderListener.c @@ -56,11 +56,11 @@ OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag, && strcmp(reqInterface, NS_INTERFACE_READ) != 0) { NS_LOG(ERROR, "Invalid interface"); - OICFree(copyQuery); + NSOICFree(copyQuery); return ehResult; } - OICFree(copyQuery); + NSOICFree(copyQuery); NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); @@ -104,7 +104,7 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag, char * copyQuery = OICStrdup(entityHandlerRequest->query); reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE)); - OICFree(copyQuery); + NSOICFree(copyQuery); if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0 && strcmp(reqInterface, NS_INTERFACE_READ) != 0) @@ -135,13 +135,8 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag, NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); ehResult = OC_EH_OK; - - if (NSGetPolicy() == NS_POLICY_CONSUMER) - { - return ehResult; - } } - else if(ocObAction == OC_OBSERVE_DEREGISTER) + else if (ocObAction == OC_OBSERVE_DEREGISTER) { NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_DEREGISTER"); NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n - " @@ -154,7 +149,7 @@ OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag, ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult, NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE); - OICFree(reqInterface); + NSOICFree(reqInterface); NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT"); return ehResult; } @@ -184,7 +179,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag, char * copyQuery = OICStrdup(entityHandlerRequest->query); reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE)); - OICFree(copyQuery); + NSOICFree(copyQuery); if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0 && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0) @@ -203,7 +198,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag, NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST"); - if(NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload)) + if (NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload)) { NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ, NSGetSyncInfo(entityHandlerRequest->payload)); @@ -233,7 +228,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag, NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); } - else if(ocObAction == OC_OBSERVE_DEREGISTER) + else if (ocObAction == OC_OBSERVE_DEREGISTER) { NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_DEREGISTER"); NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - " @@ -247,7 +242,7 @@ OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag, ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult, NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE); - OICFree(reqInterface); + NSOICFree(reqInterface); return ehResult; } @@ -278,7 +273,7 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag, char * copyReq = OICStrdup(entityHandlerRequest->query); reqInterface = OICStrdup(NSGetValueFromQuery(copyReq, NS_QUERY_INTERFACE)); - OICFree(copyReq); + NSOICFree(copyReq); if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0 && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0) @@ -296,12 +291,14 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag, else if (OC_REST_POST == entityHandlerRequest->method) { // Receive interesting topic list from consumers - // Send topic notice message(id = TOPIC) to the consumer + // Send topic notice message(id = TOPIC) to the consumer // which requests to post. NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST"); // Accepter is provider. our service is not support sendtopiclist from OC_REST_POST // Accepter is consumer. our service is support sendtopiclist from OC_REST_POST - if(NSGetPolicy() == false) + if (NSGetPolicy() == false && + NSProviderIsTopicAttributes(OCRepPayloadClone((OCRepPayload *) + entityHandlerRequest->payload))) { NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC, NSCopyOCEntityHandlerRequest(entityHandlerRequest)); @@ -319,10 +316,167 @@ OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag, NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT"); ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult, NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC); - OICFree(reqInterface); + NSOICFree(reqInterface); return ehResult; } +#ifdef WITH_MQ +OCStackApplicationResult NSProviderMQListener(void * ctx, OCDoHandle handle, + OCClientResponse * clientResponse) +{ + (void) ctx; + (void) handle; + + NS_LOG_V(DEBUG, "clientResponse->sequenceNumber = %d", clientResponse->sequenceNumber); + + if (clientResponse->sequenceNumber == OC_OBSERVE_REGISTER) + { + NS_LOG(DEBUG, "MQ OC_OBSERVE_RIGSTER"); + NSSetMQServerInfo(clientResponse->resourceUri, &(clientResponse->devAddr)); + } + + NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION); + NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION); + NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION); + + NS_LOG(DEBUG, "income observe response of MQ notification"); + NS_LOG_V(INFO_PRIVATE, "MQ OBS response income : %s:%d", + clientResponse->devAddr.addr, clientResponse->devAddr.port); + NS_LOG_V(DEBUG, "MQ OBS response result : %d", + clientResponse->result); + NS_LOG_V(DEBUG, "MQ OBS response sequenceNum : %d", + clientResponse->sequenceNumber); + NS_LOG_V(DEBUG, "MQ OBS response resource uri : %s", + clientResponse->resourceUri); + NS_LOG_V(DEBUG, "MQ OBS response Transport Type : %d", + clientResponse->devAddr.adapter); + + OCRepPayload * payload = (OCRepPayload *)clientResponse->payload; + NS_VERIFY_NOT_NULL(payload, OC_STACK_KEEP_TRANSACTION); + + NSMessageType type = -1; + bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_TYPE, (int64_t *) &type); + NS_LOG_V (DEBUG, "message sync type : %d", (int) type); + + if (!getResult && (type == NS_MESSAGE_READ || type == NS_MESSAGE_DELETED)) + { + char * pId = NULL; + getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, &pId); + NS_LOG_V (INFO_PRIVATE, "provider id: %s", pId); + + if (getResult && strcmp(pId, NSGetProviderInfo()->providerId) == 0) + { + NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo)); + syncInfo->state = (type == NS_MESSAGE_READ) ? NS_SYNC_READ : NS_SYNC_DELETED; + OICStrcpy(syncInfo->providerId, NS_UUID_STRING_SIZE, pId); + NSOICFree(pId); + NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ, (void*) syncInfo); + } + } + + return OC_STACK_KEEP_TRANSACTION; +} + +OCStackApplicationResult NSProviderGetMQResponseCB(void * ctx, OCDoHandle handle, + OCClientResponse * clientResponse) +{ + NS_LOG(DEBUG, "NSProviderGetMQResponseCB - IN"); + + (void) handle; + + NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION); + NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION); + NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION); + + NS_LOG(DEBUG, "income get response of MQ broker"); + NS_LOG_V(INFO_PRIVATE, "MQ GET response income : %s:%d", + clientResponse->devAddr.addr, clientResponse->devAddr.port); + NS_LOG_V(DEBUG, "MQ GET response result : %d", + clientResponse->result); + NS_LOG_V(DEBUG, "MQ GET response sequenceNum : %d", + clientResponse->sequenceNumber); + NS_LOG_V(DEBUG, "MQ GET response resource uri : %s", + clientResponse->resourceUri); + NS_LOG_V(DEBUG, "MQ GET response Transport Type : %d", + clientResponse->devAddr.adapter); + + char ** topicList = NULL; + size_t dimensions[MAX_REP_ARRAY_DEPTH] = {0}; + OCRepPayloadGetStringArray((OCRepPayload *) clientResponse->payload, + NS_ATTIRBUTE_MQ_TOPICLIST, & topicList, dimensions); + + char * interestTopicName = (char *) ctx; + + NS_LOG_V(DEBUG, "interestTopicName = %s", interestTopicName); + for (size_t i = 0; i < dimensions[0]; ++i) + { + NS_LOG_V(DEBUG, "found MQ topic : %s", topicList[i]); + if (!strcmp(topicList[i], interestTopicName)) + { + NS_LOG(DEBUG, "subscribe to MQ notification"); + + OCCallbackData cbdata = { NULL, NULL, NULL }; + cbdata.cb = NSProviderMQListener; + cbdata.context = NULL; + cbdata.cd = NULL; + + OCStackResult ret = OCDoResource(NULL, OC_REST_OBSERVE, topicList[i], + clientResponse->addr, NULL, CT_DEFAULT, OC_HIGH_QOS, &cbdata, NULL, 0); + + if (!NSOCResultToSuccess(ret)) + { + NS_LOG(DEBUG, "fail to subscribe to MQ notification"); + continue; + } + } + } + + NS_LOG(DEBUG, "NSProviderGetMQResponseCB - OUT"); + return OC_STACK_KEEP_TRANSACTION; +} + +OCStackApplicationResult NSProviderPublishMQResponseCB(void *ctx, OCDoHandle handle, + OCClientResponse *clientResponse) +{ + (void) ctx; + (void) handle; + NS_LOG(DEBUG, "Publish Topic callback received"); + + OCStackApplicationResult res = OC_STACK_ERROR; + + NS_LOG_V(DEBUG, "Publish Topic response received code: (%d)", clientResponse->result); + + if (clientResponse->payload != NULL && + clientResponse->payload->type == PAYLOAD_TYPE_REPRESENTATION) + { + NS_LOG(DEBUG, "PAYLOAD_TYPE_REPRESENTATION received"); + + OCRepPayloadValue *val = ((OCRepPayload *)clientResponse->payload)->values; + while (val) + { + if( val->type == OCREP_PROP_INT) + { + NS_LOG_V(DEBUG, "Key: %s, Value: %lld, int", val->name, val->i); + } + else if( val->type == OCREP_PROP_STRING) + { + NS_LOG_V(DEBUG, "Key: %s, Value: %s, string", val->name, val->str); + } + else + { + NS_LOG_V(DEBUG, "Un supported val Type.(0x%d)", val->type); + } + + val = val->next; + } + + res = OC_STACK_KEEP_TRANSACTION; + } + + return res; +} +#endif + void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected) { NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN"); @@ -337,9 +491,9 @@ void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected // Start Presence NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL); - if(info->adapter == CA_ADAPTER_TCP) + if (info->adapter == CA_ADAPTER_TCP) { - NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port); + NS_LOG_V(INFO_PRIVATE, "TCP Connected remote address: %s:%d", info->addr, info->port); } } else @@ -349,9 +503,9 @@ void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected // Set Connection State NSSetProviderConnectionState(DISCONNECTED); - if(info->adapter == CA_ADAPTER_TCP) + if (info->adapter == CA_ADAPTER_TCP) { - NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port); + NS_LOG_V(INFO_PRIVATE, "TCP Disconnected remote address: %s:%d", info->addr, info->port); } } @@ -401,14 +555,15 @@ bool NSProviderCompareSyncAttributes(const char * name) bool NSProviderIsSyncAttributes(OCRepPayload * payload) { NS_LOG(DEBUG, "get extra info"); - OCRepPayloadValue * curr = payload->values; - while(curr) + + while (curr) { if (!NSProviderCompareSyncAttributes(curr->name)) { return false; } + curr = curr->next; } @@ -440,12 +595,13 @@ bool NSProviderCompareSubTopicAttributes(const char * name) bool NSProviderIsTopicAttributes(OCRepPayload * payload) { NS_LOG(DEBUG, "get extra info"); - OCRepPayloadValue * curr = payload->values; - while(curr) + + while (curr) { - if (!NSProviderCompareSyncAttributes(curr->name)) + if (!NSProviderCompareTopicAttributes(curr->name)) { + OCRepPayloadDestroy(payload); return false; } @@ -459,6 +615,7 @@ bool NSProviderIsTopicAttributes(OCRepPayload * payload) if (!dimensionSize) { + OCRepPayloadDestroy(payload); return false; } @@ -468,15 +625,17 @@ bool NSProviderIsTopicAttributes(OCRepPayload * payload) for (int i = 0; i < (int) dimensionSize; i++) { OCRepPayloadValue * subCurr = topicListPayload[i]->values; - while(subCurr) + + while (subCurr) { if (!NSProviderCompareSubTopicAttributes(subCurr->name)) { for(int j = i; j < (int) dimensionSize; ++j) { - OCRepPayloadDestroy(topicListPayload[i]); + OCRepPayloadDestroy(topicListPayload[j]); } + NSOICFree(topicListPayload); OCRepPayloadDestroy(payload); return false; } @@ -484,6 +643,7 @@ bool NSProviderIsTopicAttributes(OCRepPayload * payload) } OCRepPayloadDestroy(topicListPayload[i]); } + NSOICFree(topicListPayload); } curr = curr->next; } @@ -531,26 +691,28 @@ OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerReque OCResourcePayloadAddStringLL(&payload->types, rtStr); } - if(resourceType != NS_RESOURCE_TOPIC) + if (resourceType == NS_RESOURCE_TOPIC && entityHandlerRequest->method == OC_REST_GET) { - OCEntityHandlerResponse response; - response.numSendVendorSpecificHeaderOptions = 0; - memset(response.sendVendorSpecificHeaderOptions, 0, - sizeof response.sendVendorSpecificHeaderOptions); - memset(response.resourceUri, 0, sizeof response.resourceUri); - - response.requestHandle = entityHandlerRequest->requestHandle; - response.resourceHandle = entityHandlerRequest->resource; - response.persistentBufferFlag = 0; - response.ehResult = ehResult; - response.payload = (OCPayload *) payload; - - if (OCDoResponse(&response) != OC_STACK_OK) - { - NS_LOG(ERROR, "Fail to AccessPolicy send response"); - OCRepPayloadDestroy(payload); - return ehResult; - } + OCRepPayloadDestroy(payload); + return ehResult; + } + + OCEntityHandlerResponse response; + response.numSendVendorSpecificHeaderOptions = 0; + memset(response.sendVendorSpecificHeaderOptions, 0, + sizeof response.sendVendorSpecificHeaderOptions); + memset(response.resourceUri, 0, sizeof response.resourceUri); + + response.requestHandle = entityHandlerRequest->requestHandle; + response.resourceHandle = entityHandlerRequest->resource; + response.persistentBufferFlag = 0; + response.ehResult = ehResult; + response.payload = (OCPayload *) payload; + + if (OCDoResponse(&response) != OC_STACK_OK) + { + NS_LOG(ERROR, "Fail to AccessPolicy send response"); + ehResult = OC_STACK_ERROR; } OCRepPayloadDestroy(payload);