X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fnotification%2Fsrc%2Fprovider%2FNSProviderTopic.c;h=f7d9940b907241fabb2aacd991a5abec0648d8b2;hb=ac3918b8b529bdf4c639fe333da2c93f36620684;hp=44c5b65ed0b5b6c7d61cf69b650b4e41f5a8bc9c;hpb=24dc8074e3b488b27363ee7a1b952003dcf523d7;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/notification/src/provider/NSProviderTopic.c b/service/notification/src/provider/NSProviderTopic.c index 44c5b65..f7d9940 100644 --- a/service/notification/src/provider/NSProviderTopic.c +++ b/service/notification/src/provider/NSProviderTopic.c @@ -19,100 +19,79 @@ //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #include "NSProviderTopic.h" +#include "oic_string.h" +#include "oic_malloc.h" +#include -static bool isTopicList = false; +NSResult NSSendTopicUpdation(); NSResult NSInitTopicList() { NS_LOG(DEBUG, "NSInitTopicList - IN"); - - if(isTopicList) - { - NS_LOG(DEBUG, "topic list has already initiated"); - return NS_FAIL; - } - consumerTopicList = NSStorageCreate(); - consumerTopicList->cacheType = NS_PROVIDER_CACHE_TOPIC; - isTopicList = true; + consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME; + + registeredTopicList = NSStorageCreate(); + registeredTopicList->cacheType = NS_PROVIDER_CACHE_REGISTER_TOPIC; NS_LOG(DEBUG, "NSInitTopicList - OUT"); return NS_OK; } -NSTopicList * NSGetTopics(char *consumerId) +size_t NSProviderGetTopicListSize(NSTopicLL * firstElement) { - NS_LOG(DEBUG, "NSGetTopics()"); - - NSTopicList * topicList; - - if(consumerId == NULL) + if(!firstElement) { - NS_LOG(DEBUG, "All registered topic list"); + return 0; } - else + + int cnt = 0; + + NSTopicLL * iter = firstElement; + + while(iter) { - NS_LOG_V(DEBUG, "Subscribed topic list for consumerId(%s)", consumerId); + cnt++; + iter = iter->next; } - NS_LOG(DEBUG, "NSGetTopics() NS_OK"); - return topicList; + return cnt; } -//TODO: update parameter -NSResult NSStoreTopics(char * consumerId, NSTopic** topics) +NSResult NSAddTopics(const char * topicName) { NS_LOG(DEBUG, "NSWriteTopicsToStorage()"); - NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement)); - NSCacheTopicData * topicData = (NSCacheTopicData *) OICMalloc(sizeof(NSCacheTopicData)); - - OICStrcpy(topicData->consumerId, UUID_STRING_SIZE, consumerId); - NS_LOG_V(DEBUG, "consumer id: %s", topicData->consumerId); + NSCacheTopicData * data = (NSCacheTopicData *)OICMalloc(sizeof(NSCacheTopicData)); + data->topicName = (char *)topicName; + data->state = NS_TOPIC_UNSUBSCRIBED; - // TODO: print topic list - topicData->topics = topics; - NS_LOG(DEBUG, "print topic list"); - - element->data = (void*) topicData; + NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement)); + element->data = (void *) data; element->next = NULL; - if(NSStorageWrite(consumerTopicList, element) != NS_OK) + if(NSStorageWrite(registeredTopicList, element) != NS_OK) { NS_LOG(DEBUG, "fail to write cache"); } + NSSendTopicUpdation(); NS_LOG(DEBUG, "NSWriteTopicsToStorage() NS_OK"); return NS_OK; } -NSResult NSRegisterTopicList(NSTopicList *topicList) +NSResult NSDeleteTopics(const char * topicName) { - NS_LOG(DEBUG, "NSRegisterTopicList()"); - - if(!topicList) - { - NS_LOG(ERROR, "no topics"); - return NS_ERROR; - } + NS_LOG(DEBUG, "NSDeleteTopics()"); - OCResourceHandle rHandle = NULL; - if(NSPutTopicResource(topicList, &rHandle) != NS_OK) - { - NS_LOG(ERROR, "Fail to put topic resource"); - return NS_ERROR; - } - - if(topicList->consumerId != NULL) + if(!topicName) { - // id should be null to register topic list - NS_LOG(ERROR, "invalid consumer id"); + NS_LOG(ERROR, "topicName is NULL"); return NS_ERROR; } - NSStoreTopics(topicList->consumerId, topicList->head); - - NS_LOG(DEBUG, "NSRegisterTopicList() NS_OK"); + NSStorageDelete(registeredTopicList, topicName); + while(NSStorageDelete(consumerTopicList, topicName) != NS_FAIL); return NS_OK; } @@ -155,13 +134,12 @@ NSResult NSSendTopicUpdation() obArray[obCount++] = subData->messageObId; } -#ifdef WITH_CLOUD +#if(defined WITH_CLOUD && defined RD_CLIENT) if(subData->remote_messageObId != 0) { obArray[obCount++] = subData->remote_messageObId; } #endif - } it = it->next; } @@ -239,15 +217,21 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest) NS_LOG(DEBUG, "NSSendTopicList - IN"); char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID); + NSTopicLL * topics = NULL; + if(!id) { NS_LOG(DEBUG, "Send registered topic list"); - //TODO: get registered topic list + topics = NSProviderGetTopicsCacheData(registeredTopicList); } else { NS_LOG(DEBUG, "Send subscribed topic list to consumer"); - //TODO: get subscribed topic list for consumer + topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList, consumerTopicList, id); + if(!topics) + { + topics = NSProviderGetTopicsCacheData(registeredTopicList); + } } // make response for the Get Request @@ -265,8 +249,55 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest) } OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI); - OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id); - // TODO: add PayLoadSet with topic list got above + if(id) + { + OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id); + } + OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, + NSGetProviderInfo()->providerId); + + if(topics) + { + NS_LOG(DEBUG, "topicList is NULL"); + size_t dimensionSize = (size_t)NSProviderGetTopicListSize(topics); + + NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize); + + if(!dimensionSize) + { + return NS_ERROR; + } + + OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc( + sizeof(OCRepPayload *) * dimensionSize); + + size_t dimensions[3] = {dimensionSize, 0, 0}; + + for (int i = 0; i < (int)dimensionSize; i++) + { + NS_LOG_V(DEBUG, "topicName = %s", topics->topicName); + NS_LOG_V(DEBUG, "topicState = %d",(int) topics->state); + + payloadTopicArray[i] = OCRepPayloadCreate(); + OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME, + topics->topicName); + OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION, + (int)topics->state); + + topics = topics->next; + } + + + OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, + (const OCRepPayload**)(payloadTopicArray), dimensions); + } + else + { + size_t dimensions[3] = {0, 0, 0}; + + OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST, + (OCRepPayload **) NULL, dimensions); + } response.requestHandle = entityHandlerRequest->requestHandle; response.resourceHandle = entityHandlerRequest->resource; @@ -274,23 +305,70 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest) response.ehResult = OC_EH_OK; response.payload = (OCPayload *) payload; - // Send Response if (OCDoResponse(&response) != OC_STACK_OK) { NS_LOG(ERROR, "Fail to response topic list"); return NS_ERROR; } OCRepPayloadDestroy(payload); - NSFreeOCEntityHandlerRequest(entityHandlerRequest); NS_LOG(DEBUG, "NSSendTopicList - OUT"); return NS_OK; } -bool NSIsTopicSubscribed(char * consumerId, char * topic) +NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) { - //TODO: implement function - return true; + NS_LOG(DEBUG, "NSPostConsumerTopics() - IN"); + + char * consumerId = NULL; + OCRepPayload * payload = (OCRepPayload *) entityHandlerRequest->payload; + OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId); + + if(!consumerId) + { + NS_LOG(DEBUG, "Invalid consumer ID"); + return NS_ERROR; + } + + NS_LOG_V(DEBUG, "TOPIC consumer ID = %s", consumerId); + + consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID; + while(NSStorageDelete(consumerTopicList, consumerId) != NS_FAIL); + consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME; + + OCRepPayload ** topicListPayload = NULL; + OCRepPayloadValue * payloadValue = NULL; + payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST); + size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions); + size_t dimensions[3] = {dimensionSize, 0, 0}; + OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, & topicListPayload, dimensions); + + for(int i = 0; i <(int)dimensionSize; i++) + { + char * topicName = NULL; + int64_t topicState = 0; + + OCRepPayloadGetPropString(topicListPayload[i], NS_ATTRIBUTE_TOPIC_NAME, &topicName); + OCRepPayloadGetPropInt(topicListPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, &topicState); + NS_LOG_V(DEBUG, "Topic Name(state): %s(%d)", topicName, (int)topicState); + + if(NS_TOPIC_SUBSCRIBED == (NSTopicState)topicState) + { + NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) + OICMalloc(sizeof(NSCacheTopicSubData)); + + OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId); + topicSubData->topicName = OICStrdup(topicName); + + NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement)); + newObj->data = (NSCacheData *) topicSubData; + newObj->next = NULL; + NSStorageWrite(consumerTopicList, newObj); + } + } + + NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT"); + return NS_OK; } void * NSTopicSchedule(void * ptr) @@ -315,17 +393,58 @@ void * NSTopicSchedule(void * ptr) case TASK_SEND_TOPICS: NS_LOG(DEBUG, "CASE TASK_SEND_TOPICS : "); NSSendTopicList((OCEntityHandlerRequest*) node->taskData); + NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData); + break; + case TASK_SUBSCRIBE_TOPIC: + NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : "); + NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement)); + newObj->data = node->taskData; + newObj->next = NULL; + NSStorageWrite(consumerTopicList, newObj); + break; + case TASK_UNSUBSCRIBE_TOPIC: + NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : "); + NSProviderDeleteConsumerTopic(consumerTopicList, + (NSCacheTopicSubData *) node->taskData); + NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC AFter: "); + break; + case TASK_ADD_TOPIC: + { + NS_LOG(DEBUG, "CASE TASK_ADD_TOPIC : "); + NSAddTopics((const char *) node->taskData); + } + break; + case TASK_DELETE_TOPIC: + { + NS_LOG(DEBUG, "CASE_TASK_DELETE_TOPIC : "); + NSDeleteTopics((const char *) node->taskData); + } + break; + case TASK_POST_TOPIC: + { + NS_LOG(DEBUG, "TASK_POST_TOPIC : "); + NSPostConsumerTopics((OCEntityHandlerRequest*) node->taskData); + NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData); + } break; - case TASK_SUBSCRIBE_TOPICS: - NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPICS : "); + case TASK_GET_TOPICS: + { + NS_LOG(DEBUG, "TASK_GET_TOPICS : "); + NSTopicSynchronization * topicData = (NSTopicSynchronization *) node->taskData; + NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList); + topicData->topics = topics; + pthread_cond_signal(&topicData->condition); + } break; - case TASK_REGISTER_TOPICS: - NS_LOG(DEBUG, "CASE TASK_REGISTER_TOPICS : "); - NSTopicList * topicList = (NSTopicList *) node->taskData; - NSRegisterTopicList(topicList); - NSSendTopicUpdation(); - // TODO : free NSTopic - // NSFreeTopicList(topicList); + case TAST_GET_CONSUMER_TOPICS: + { + NS_LOG(DEBUG, "TASK_GET_CONSUMER_TOPICS : "); + NSTopicSynchronization * topicData = (NSTopicSynchronization *) node->taskData; + NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList, + consumerTopicList, topicData->consumerId); + topicData->topics = topics; + pthread_cond_signal(&topicData->condition); + } break; default: break;