#include "NSProviderTopic.h"\r
#include "oic_string.h"\r
#include "oic_malloc.h"\r
+#include <pthread.h>\r
\r
NSResult NSSendTopicUpdation();\r
\r
NSResult NSInitTopicList()\r
{\r
NS_LOG(DEBUG, "NSInitTopicList - IN");\r
- consumerTopicList = NSStorageCreate();\r
+\r
+ consumerTopicList = NSProviderStorageCreate();\r
+ NS_VERIFY_NOT_NULL(consumerTopicList, NS_FAIL);\r
consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
\r
- registeredTopicList = NSStorageCreate();\r
+ registeredTopicList = NSProviderStorageCreate();\r
+ NS_VERIFY_NOT_NULL(registeredTopicList, NS_FAIL);\r
registeredTopicList->cacheType = NS_PROVIDER_CACHE_REGISTER_TOPIC;\r
\r
NS_LOG(DEBUG, "NSInitTopicList - OUT");\r
\r
size_t NSProviderGetTopicListSize(NSTopicLL * firstElement)\r
{\r
- if(!firstElement)\r
+ if (!firstElement)\r
{\r
return 0;\r
}\r
\r
NSTopicLL * iter = firstElement;\r
\r
- while(iter)\r
+ while (iter)\r
{\r
cnt++;\r
iter = iter->next;\r
return cnt;\r
}\r
\r
-NSResult NSAddTopics(const char * topicName)\r
+NSResult NSRegisterTopic(const char * topicName)\r
{\r
NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
\r
- NSCacheTopicData * data = (NSCacheTopicData *)OICMalloc(sizeof(NSCacheTopicData));\r
- data->topicName = (char *)topicName;\r
+ NSCacheTopicData * data = (NSCacheTopicData *) OICMalloc(sizeof(NSCacheTopicData));\r
+ NS_VERIFY_NOT_NULL(data, NS_FAIL);\r
+ data->topicName = (char *) topicName;\r
data->state = NS_TOPIC_UNSUBSCRIBED;\r
\r
NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+ if (!element)\r
+ {\r
+ OICFree(data->topicName);\r
+ OICFree(data);\r
+ return NS_FAIL;\r
+ }\r
element->data = (void *) data;\r
element->next = NULL;\r
\r
- if(NSStorageWrite(registeredTopicList, element) != NS_OK)\r
+ if(NSProviderStorageWrite(registeredTopicList, element) != NS_OK)\r
{\r
NS_LOG(DEBUG, "fail to write cache");\r
+ return NS_FAIL;\r
}\r
NSSendTopicUpdation();\r
\r
return NS_OK;\r
}\r
\r
-NSResult NSDeleteTopics(const char * topicName)\r
+NSResult NSUnregisterTopic(const char * topicName)\r
{\r
NS_LOG(DEBUG, "NSDeleteTopics()");\r
+ NSResult result = NS_OK;\r
\r
- if(!topicName)\r
+ if (!topicName)\r
{\r
NS_LOG(ERROR, "topicName is NULL");\r
return NS_ERROR;\r
}\r
\r
- NSStorageDelete(registeredTopicList, topicName);\r
- while(NSStorageDelete(consumerTopicList, topicName) != NS_FAIL);\r
- return NS_OK;\r
+ result = NSProviderStorageDelete(registeredTopicList, topicName);\r
+ while (NSProviderStorageDelete(consumerTopicList, topicName) != NS_FAIL)\r
+ {\r
+ }\r
+\r
+ if (result == NS_OK)\r
+ {\r
+ NSSendTopicUpdation();\r
+ }\r
+\r
+ return result;\r
}\r
\r
NSResult NSSendTopicUpdation()\r
OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
\r
- OCObservationId obArray[255] = { 0, };\r
+ OCObservationId obArray[255] =\r
+ { 0, };\r
int obCount = 0;\r
\r
NSCacheElement * it = consumerSubList->head;\r
\r
if (subData->isWhite)\r
{\r
- if(subData->messageObId != 0)\r
+ if (subData->messageObId != 0)\r
{\r
obArray[obCount++] = subData->messageObId;\r
}\r
it = it->next;\r
}\r
\r
- if(!obCount)\r
+ if (!obCount)\r
{\r
NS_LOG(ERROR, "observer count is zero");\r
return NS_ERROR;\r
}\r
\r
- if (OCNotifyListOfObservers(rHandle, obArray, obCount, payload, OC_HIGH_QOS)\r
- != OC_STACK_OK)\r
+ if (OCNotifyListOfObservers(rHandle, obArray, obCount, payload, OC_HIGH_QOS) != OC_STACK_OK)\r
{\r
NS_LOG(ERROR, "fail to send topic updation");\r
OCRepPayloadDestroy(payload);\r
OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
\r
- NSCacheElement * element = NSStorageRead(consumerSubList, consumerId);\r
+ NSCacheElement * element = NSProviderStorageRead(consumerSubList, consumerId);\r
\r
- if(element == NULL)\r
+ if (element == NULL)\r
{\r
NS_LOG(ERROR, "element is NULL");\r
return NS_ERROR;\r
\r
NSCacheSubData * subData = (NSCacheSubData*) element->data;\r
\r
- if (OCNotifyListOfObservers(rHandle, (OCObservationId*)&subData->messageObId, 1, payload, OC_HIGH_QOS)\r
- != OC_STACK_OK)\r
+ if (OCNotifyListOfObservers(rHandle, (OCObservationId*) &subData->messageObId, 1, payload,\r
+ OC_HIGH_QOS) != OC_STACK_OK)\r
{\r
NS_LOG(ERROR, "fail to send topic updation");\r
OCRepPayloadDestroy(payload);\r
return NS_ERROR;\r
-\r
}\r
\r
OCRepPayloadDestroy(payload);\r
char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
NSTopicLL * topics = NULL;\r
\r
- if(!id)\r
+ if (!id)\r
{\r
NS_LOG(DEBUG, "Send registered topic list");\r
topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
{\r
NS_LOG(DEBUG, "Send subscribed topic list to consumer");\r
topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList, consumerTopicList, id);\r
- if(!topics)\r
+ if (!topics)\r
{\r
topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
}\r
}\r
\r
- if(!topics)\r
- {\r
- NS_LOG(DEBUG, "topicList is NULL");\r
- return NS_ERROR;\r
- }\r
-\r
// make response for the Get Request\r
OCEntityHandlerResponse response;\r
response.numSendVendorSpecificHeaderOptions = 0;\r
return NS_ERROR;\r
}\r
\r
- size_t dimensionSize = (size_t)NSProviderGetTopicListSize(topics);\r
-\r
- NS_LOG_V(DEBUG, "dimensionSize = %d", dimensionSize);\r
-\r
- if(!dimensionSize)\r
+ OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
+ if (id)\r
{\r
- return NS_ERROR;\r
+ OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
}\r
+ OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
\r
- OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
- sizeof(OCRepPayload *) * dimensionSize);\r
+ if (topics)\r
+ {\r
+ NS_LOG(DEBUG, "topicList is NULL");\r
+ size_t dimensionSize = (size_t) NSProviderGetTopicListSize(topics);\r
\r
- size_t dimensions[3] = {dimensionSize, 0, 0};\r
+ NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize);\r
\r
- for (int i = 0; i < (int)dimensionSize; i++)\r
- {\r
- NS_LOG_V(DEBUG, "topicName = %s", topics->topicName);\r
- NS_LOG_V(DEBUG, "topicState = %d",(int) topics->state);\r
+ if (!dimensionSize)\r
+ {\r
+ return NS_ERROR;\r
+ }\r
+\r
+ OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
+ sizeof(OCRepPayload *) * dimensionSize);\r
+ NS_VERIFY_NOT_NULL(payloadTopicArray, NS_ERROR);\r
+\r
+ size_t dimensions[3] =\r
+ { dimensionSize, 0, 0 };\r
+\r
+ for (int i = 0; i < (int) dimensionSize; i++)\r
+ {\r
+ NS_LOG_V(DEBUG, "topicName = %s", topics->topicName);\r
+ NS_LOG_V(DEBUG, "topicState = %d",(int) topics->state);\r
+\r
+ payloadTopicArray[i] = OCRepPayloadCreate();\r
+ NS_VERIFY_NOT_NULL(payloadTopicArray[i], NS_ERROR);\r
+ OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME,\r
+ topics->topicName);\r
+ OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION,\r
+ (int) topics->state);\r
+\r
+ topics = topics->next;\r
+ }\r
\r
- payloadTopicArray[i] = OCRepPayloadCreate();\r
- OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME, topics->topicName);\r
- OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION,\r
- (int)topics->state);\r
+ OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+ (const OCRepPayload**) (payloadTopicArray), dimensions);\r
+ }\r
+ else\r
+ {\r
+ size_t dimensions[3] =\r
+ { 0, 0, 0 };\r
\r
- topics = topics->next;\r
+ OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
+ (OCRepPayload **) NULL, dimensions);\r
}\r
\r
- OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
- if(id)\r
+ char * reqInterface =\r
+ NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+ if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
{\r
- OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
+ OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
+ OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ);\r
+ OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE);\r
}\r
- OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
- (const OCRepPayload**)(payloadTopicArray), dimensions);\r
\r
response.requestHandle = entityHandlerRequest->requestHandle;\r
response.resourceHandle = entityHandlerRequest->resource;\r
OCRepPayload * payload = (OCRepPayload *) entityHandlerRequest->payload;\r
OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId);\r
\r
- if(!consumerId)\r
+ if (!consumerId)\r
{\r
NS_LOG(DEBUG, "Invalid consumer ID");\r
- return NS_ERROR;\r
+ return NS_FAIL;\r
}\r
\r
NS_LOG_V(DEBUG, "TOPIC consumer ID = %s", consumerId);\r
\r
consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
- while(NSStorageDelete(consumerTopicList, consumerId) != NS_FAIL);\r
+
+ while (NSProviderStorageDelete(consumerTopicList, consumerId) != NS_FAIL)\r
+ {\r
+ }\r
consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
\r
OCRepPayload ** topicListPayload = NULL;\r
OCRepPayloadValue * payloadValue = NULL;\r
payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
- size_t dimensions[3] = {dimensionSize, 0, 0};\r
- OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, & topicListPayload, dimensions);\r
+ size_t dimensions[3] = { dimensionSize, 0, 0 };\r
+ OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload, dimensions);\r
\r
- for(int i = 0; i <(int)dimensionSize; i++)\r
+ for (int i = 0; i < (int) dimensionSize; i++)\r
{\r
char * topicName = NULL;\r
int64_t topicState = 0;\r
OCRepPayloadGetPropInt(topicListPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, &topicState);\r
NS_LOG_V(DEBUG, "Topic Name(state): %s(%d)", topicName, (int)topicState);\r
\r
- if(NS_TOPIC_SUBSCRIBED == (NSTopicState)topicState)\r
+ if (NS_TOPIC_SUBSCRIBED == (NSTopicState) topicState)\r
{\r
- NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *)\r
- OICMalloc(sizeof(NSCacheTopicSubData));\r
+ NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) OICMalloc(\r
+ sizeof(NSCacheTopicSubData));\r
+ NS_VERIFY_NOT_NULL(topicSubData, NS_FAIL);\r
\r
OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
- topicSubData->topicName = OICStrdup(topicName);\r
+ topicSubData->topicName = topicName;\r
\r
NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+\r
+ if (!newObj)\r
+ {\r
+ OICFree(topicSubData->topicName);\r
+ OICFree(topicSubData);\r
+ OICFree(consumerId);\r
+ return NS_FAIL;\r
+ }\r
+\r
newObj->data = (NSCacheData *) topicSubData;\r
newObj->next = NULL;\r
- NSStorageWrite(consumerTopicList, newObj);\r
+\r
+ NSProviderStorageWrite(consumerTopicList, newObj);
}\r
}\r
-\r
+ NSSendTopicUpdationToConsumer(consumerId);\r
+ OICFree(consumerId);\r
NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT");\r
return NS_OK;\r
}\r
NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
break;\r
case TASK_SUBSCRIBE_TOPIC:\r
+ {\r
NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
- newObj->data = node->taskData;\r
- newObj->next = NULL;\r
- NSStorageWrite(consumerTopicList, newObj);\r
+ if (newObj)\r
+ {\r
+ newObj->data = node->taskData;\r
+ newObj->next = NULL;\r
+ if (NSProviderStorageWrite(consumerTopicList, newObj) == NS_OK)\r
+ {\r
+ NSCacheTopicSubData * topicSubData =\r
+ (NSCacheTopicSubData *) node->taskData;\r
+ NSSendTopicUpdationToConsumer(topicSubData->id);\r
+ }\r
+ }
+ }\r
break;\r
case TASK_UNSUBSCRIBE_TOPIC:\r
+ {\r
NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
- NSProviderDeleteConsumerTopic(consumerTopicList,\r
- (NSCacheTopicSubData *) node->taskData);\r
- NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC AFter: ");\r
+ NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) node->taskData;\r
+ if (NSProviderDeleteConsumerTopic(consumerTopicList,\r
+ (NSCacheTopicSubData *) node->taskData) == NS_OK)\r
+ {\r
+ NSSendTopicUpdationToConsumer(topicSubData->id);\r
+ }\r
+ OICFree(topicSubData->topicName);\r
+ OICFree(topicSubData);\r
+ }\r
break;\r
- case TASK_ADD_TOPIC:\r
+ case TASK_REGISTER_TOPIC:\r
{\r
NS_LOG(DEBUG, "CASE TASK_ADD_TOPIC : ");\r
- NSAddTopics((const char *) node->taskData);\r
+ NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
+\r
+ pthread_mutex_lock(topicSyncResult->mutex);\r
+ topicSyncResult->result = NSRegisterTopic(\r
+ (const char *) topicSyncResult->topicName);\r
+ pthread_cond_signal(topicSyncResult->condition);\r
+ pthread_mutex_unlock(topicSyncResult->mutex);\r
}\r
break;\r
- case TASK_DELETE_TOPIC:\r
+ case TASK_UNREGISTER_TOPIC:\r
{\r
NS_LOG(DEBUG, "CASE_TASK_DELETE_TOPIC : ");\r
- NSDeleteTopics((const char *) node->taskData);\r
+ NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
+ pthread_mutex_lock(topicSyncResult->mutex);\r
+ topicSyncResult->result = NSUnregisterTopic(\r
+ (const char *) topicSyncResult->topicName);\r
+ pthread_cond_signal(topicSyncResult->condition);\r
+ pthread_mutex_unlock(topicSyncResult->mutex);\r
}\r
break;\r
case TASK_POST_TOPIC:\r
NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
}\r
break;\r
+ case TASK_GET_TOPICS:\r
+ {\r
+ NS_LOG(DEBUG, "TASK_GET_TOPICS : ");\r
+ NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
+ pthread_mutex_lock(topicSync->mutex);\r
+ NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
+ topicSync->topics = topics;\r
+ pthread_cond_signal(topicSync->condition);\r
+ pthread_mutex_unlock(topicSync->mutex);\r
+ }\r
+ break;\r
+ case TAST_GET_CONSUMER_TOPICS:\r
+ {\r
+ NS_LOG(DEBUG, "TASK_GET_CONSUMER_TOPICS : ");\r
+ NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
+ pthread_mutex_lock(topicSync->mutex);\r
+ NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
+ consumerTopicList, topicSync->consumerId);\r
+ topicSync->topics = topics;\r
+ pthread_cond_signal(topicSync->condition);\r
+ pthread_mutex_unlock(topicSync->mutex);\r
+ }\r
+ break;\r
default:\r
break;\r
}\r