X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fnotification%2Fsrc%2Fprovider%2FNSProviderTopic.c;h=f7d9940b907241fabb2aacd991a5abec0648d8b2;hb=ac3918b8b529bdf4c639fe333da2c93f36620684;hp=b17bbfe59a41c11125eafe796e3dc7b7a989b9db;hpb=e873ce8c63bf0ddf3ce14993e12b558b8f1550a2;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/notification/src/provider/NSProviderTopic.c b/service/notification/src/provider/NSProviderTopic.c index b17bbfe..f7d9940 100644 --- a/service/notification/src/provider/NSProviderTopic.c +++ b/service/notification/src/provider/NSProviderTopic.c @@ -19,6 +19,9 @@ //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #include "NSProviderTopic.h" +#include "oic_string.h" +#include "oic_malloc.h" +#include NSResult NSSendTopicUpdation(); @@ -35,12 +38,32 @@ NSResult NSInitTopicList() return NS_OK; } +size_t NSProviderGetTopicListSize(NSTopicLL * firstElement) +{ + if(!firstElement) + { + return 0; + } + + int cnt = 0; + + NSTopicLL * iter = firstElement; + + while(iter) + { + cnt++; + iter = iter->next; + } + + return cnt; +} + NSResult NSAddTopics(const char * topicName) { NS_LOG(DEBUG, "NSWriteTopicsToStorage()"); NSCacheTopicData * data = (NSCacheTopicData *)OICMalloc(sizeof(NSCacheTopicData)); - data->topicName = topicName; + data->topicName = (char *)topicName; data->state = NS_TOPIC_UNSUBSCRIBED; NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement)); @@ -111,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; } @@ -196,19 +218,20 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest) char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID); NSTopicLL * topics = NULL; - NSCacheElement * currList = NULL; if(!id) { NS_LOG(DEBUG, "Send registered topic list"); topics = NSProviderGetTopicsCacheData(registeredTopicList); - currList = registeredTopicList->head; } else { NS_LOG(DEBUG, "Send subscribed topic list to consumer"); - topics = NSProviderGetConsumerTopicsCacheData(consumerTopicList, id); - currList = consumerTopicList->head; + topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList, consumerTopicList, id); + if(!topics) + { + topics = NSProviderGetTopicsCacheData(registeredTopicList); + } } // make response for the Get Request @@ -225,36 +248,56 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest) return NS_ERROR; } - // set topics to the array of resource property - - NSCacheElement * iter = currList; - size_t dimensionSize = (size_t)NSProviderGetListSize(iter); - - if(!dimensionSize) + OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI); + if(id) { - return NS_ERROR; + OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id); } + OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, + NSGetProviderInfo()->providerId); - OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc( - sizeof(OCRepPayload *) * dimensionSize); - - size_t dimensions[3] = {dimensionSize, 0, 0}; - for (int i = 0; i < (int)dimensionSize; i++) + if(topics) { - NSTopicLL * topic = (NSTopicLL *) iter->data; + NS_LOG(DEBUG, "topicList is NULL"); + size_t dimensionSize = (size_t)NSProviderGetTopicListSize(topics); - payloadTopicArray[i] = OCRepPayloadCreate(); - OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME, topic->topicName); - OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION, - (int)topic->state); + NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize); - iter = iter->next; + 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}; - OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI); - OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id); - OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, - (const OCRepPayload**)(payloadTopicArray), dimensions); + OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST, + (OCRepPayload **) NULL, dimensions); + } response.requestHandle = entityHandlerRequest->requestHandle; response.resourceHandle = entityHandlerRequest->resource; @@ -268,23 +311,17 @@ NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest) return NS_ERROR; } OCRepPayloadDestroy(payload); - NSFreeOCEntityHandlerRequest(entityHandlerRequest); NS_LOG(DEBUG, "NSSendTopicList - OUT"); return NS_OK; } -bool NSIsTopicSubscribed(char * consumerId, char * topic) -{ - return NSProviderIsTopicSubScribed(consumerTopicList->head, consumerId, topic); -} - NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) { NS_LOG(DEBUG, "NSPostConsumerTopics() - IN"); char * consumerId = NULL; - OCRepPayload * payload = entityHandlerRequest->payload; + OCRepPayload * payload = (OCRepPayload *) entityHandlerRequest->payload; OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId); if(!consumerId) @@ -293,6 +330,12 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) 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); @@ -303,16 +346,16 @@ NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest) for(int i = 0; i <(int)dimensionSize; i++) { char * topicName = NULL; - int topicState = 0; + 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, 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)); + NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) + OICMalloc(sizeof(NSCacheTopicSubData)); OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId); topicSubData->topicName = OICStrdup(topicName); @@ -350,6 +393,7 @@ 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 : "); @@ -359,10 +403,10 @@ void * NSTopicSchedule(void * ptr) NSStorageWrite(consumerTopicList, newObj); break; case TASK_UNSUBSCRIBE_TOPIC: - consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID; - NSStorageDelete(consumerTopicList, (const char *) node->taskData); - consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME; - OICFree((char *)node->taskData); + 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: { @@ -380,6 +424,26 @@ void * NSTopicSchedule(void * ptr) { NS_LOG(DEBUG, "TASK_POST_TOPIC : "); NSPostConsumerTopics((OCEntityHandlerRequest*) node->taskData); + NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData); + } + break; + 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 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: