#include "NSProviderMemoryCache.h"\r
#include <string.h>\r
\r
-NSCacheList * NSStorageCreate()\r
+#define NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj) \\r
+ { \\r
+ if (it) \\r
+ { \\r
+ NS_LOG(DEBUG, "already registered for topic name"); \\r
+ NSOICFree(topicData->topicName); \\r
+ NSOICFree(topicData); \\r
+ NSOICFree(newObj); \\r
+ pthread_mutex_unlock(&NSCacheMutex); \\r
+ return NS_FAIL; \\r
+ } \\r
+ }\r
+\r
+NSCacheList * NSProviderStorageCreate()\r
{\r
pthread_mutex_lock(&NSCacheMutex);\r
NSCacheList * newList = (NSCacheList *) OICMalloc(sizeof(NSCacheList));\r
+\r
if (!newList)\r
{\r
pthread_mutex_unlock(&NSCacheMutex);\r
return newList;\r
}\r
\r
-NSCacheElement * NSStorageRead(NSCacheList * list, const char * findId)\r
+NSCacheElement * NSProviderStorageRead(NSCacheList * list, const char * findId)\r
{\r
pthread_mutex_lock(&NSCacheMutex);\r
\r
NSCacheElement * next = NULL;\r
NSCacheType type = list->cacheType;\r
\r
- NS_LOG_V(DEBUG, "Find ID - %s", findId);\r
+ NS_LOG_V(INFO_PRIVATE, "Find ID - %s", findId);\r
\r
while (iter)\r
{\r
return NS_ERROR;\r
}\r
\r
- NSCacheElement * it = NSStorageRead(list, id);\r
+ NSCacheElement * it = NSProviderStorageRead(list, id);\r
\r
if (it)\r
{\r
{\r
NS_LOG(DEBUG, "Update Data - IN");\r
\r
- NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
+ NS_LOG_V(INFO_PRIVATE, "currData_ID = %s", itData->id);\r
NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);\r
return NS_ERROR;\r
}\r
\r
-NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
+NSResult NSProviderStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
{\r
pthread_mutex_lock(&NSCacheMutex);\r
\r
NS_LOG(DEBUG, "Type is SUBSCRIBER");\r
\r
NSCacheSubData * subData = (NSCacheSubData *) newObj->data;\r
- NSCacheElement * it = NSStorageRead(list, subData->id);\r
+ NSCacheElement * it = NSProviderStorageRead(list, subData->id);\r
\r
if (it)\r
{\r
{\r
NS_LOG(DEBUG, "Update Data - IN");\r
\r
- NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
+ NS_LOG_V(INFO_PRIVATE, "currData_ID = %s", itData->id);\r
NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);\r
NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);\r
NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
\r
- NS_LOG_V(DEBUG, "subData_ID = %s", subData->id);\r
+ NS_LOG_V(INFO_PRIVATE, "subData_ID = %s", subData->id);\r
NS_LOG_V(DEBUG, "subData_MsgObID = %d", subData->messageObId);\r
NS_LOG_V(DEBUG, "subData_SyncObID = %d", subData->syncObId);\r
NS_LOG_V(DEBUG, "subData_Cloud_MsgObID = %d", subData->remote_messageObId);\r
}\r
\r
NS_LOG(DEBUG, "Update Data - OUT");\r
-\r
+ NSOICFree(subData);\r
+ NSOICFree(newObj);\r
pthread_mutex_unlock(&NSCacheMutex);\r
return NS_OK;\r
}\r
}\r
\r
}\r
+ else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
+ {\r
+ NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
+\r
+ NSCacheTopicData * topicData = (NSCacheTopicData *) newObj->data;\r
+ NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);\r
+\r
+ NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);\r
+ }\r
+ else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
+ {\r
+ NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
+\r
+ NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
+ NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);\r
+\r
+ NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);\r
+ }\r
+ else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
+ {\r
+ NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
+\r
+ NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
+ NSCacheElement * it = NSProviderStorageRead(list, topicData->id);\r
+\r
+ NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);\r
+ }\r
\r
if (list->head == NULL)\r
{\r
return NS_OK;\r
}\r
\r
-NSResult NSStorageDestroy(NSCacheList * list)\r
+NSResult NSProviderStorageDestroy(NSCacheList * list)\r
{\r
NSCacheElement * iter = list->head;\r
NSCacheElement * next = NULL;\r
-\r
NSCacheType type = list->cacheType;\r
\r
while (iter)\r
{\r
next = (NSCacheElement *) iter->next;\r
-\r
NSProviderDeleteCacheData(type, iter->data);\r
- OICFree(iter);\r
-\r
+ NSOICFree(iter);\r
iter = next;\r
}\r
\r
- OICFree(list);\r
-\r
+ NSOICFree(list);\r
return NS_OK;\r
}\r
\r
+bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
+{\r
+ if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
+ id == data->remote_syncObId)\r
+ {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
{\r
NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
return false;\r
}\r
\r
+ NS_LOG_V(INFO_PRIVATE, "Data(compData) = [%s]", id);\r
+\r
if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
{\r
NSCacheSubData * subData = (NSCacheSubData *) data;\r
\r
- NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
- NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
+ NS_LOG_V(INFO_PRIVATE, "Data(subData) = [%s]", subData->id);\r
\r
if (strcmp(subData->id, id) == 0)\r
{\r
\r
NS_LOG(DEBUG, "Message Data is Not Same");\r
return false;\r
+ }\r
+ else if (type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
+ {\r
+ NSCacheSubData * subData = (NSCacheSubData *) data;\r
+\r
+ NS_LOG_V(INFO_PRIVATE, "Data(subData) = [%s]", subData->id);\r
\r
+ OCObservationId currID = *id;\r
+\r
+ if (NSIsSameObId(subData, currID))\r
+ {\r
+ NS_LOG(DEBUG, "SubData is Same");\r
+ return true;\r
+ }\r
+\r
+ NS_LOG(DEBUG, "Message Data is Not Same");\r
+ return false;\r
+ }\r
+ else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
+ {\r
+ NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
+\r
+ NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
+\r
+ if (strcmp(topicData->topicName, id) == 0)\r
+ {\r
+ NS_LOG(DEBUG, "SubData is Same");\r
+ return true;\r
+ }\r
+\r
+ NS_LOG(DEBUG, "Message Data is Not Same");\r
+ return false;\r
+ }\r
+ else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
+ {\r
+ NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
+\r
+ NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
+\r
+ if (strcmp(topicData->topicName, id) == 0)\r
+ {\r
+ NS_LOG(DEBUG, "SubData is Same");\r
+ return true;\r
+ }\r
+\r
+ NS_LOG(DEBUG, "Message Data is Not Same");\r
+ return false;\r
+ }\r
+ else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
+ {\r
+ NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
+\r
+ NS_LOG_V(INFO_PRIVATE, "Data(topicData) = [%s]", topicData->id);\r
+\r
+ if (strcmp(topicData->id, id) == 0)\r
+ {\r
+ NS_LOG(DEBUG, "SubData is Same");\r
+ return true;\r
+ }\r
+\r
+ NS_LOG(DEBUG, "Message Data is Not Same");\r
+ return false;\r
}\r
\r
- NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
\r
+ NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
return false;\r
}\r
\r
NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
{\r
- if (data == NULL)\r
+ if (!data)\r
{\r
- return NS_OK;\r
+ return NS_ERROR;\r
}\r
\r
- if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
+ if (type == NS_PROVIDER_CACHE_SUBSCRIBER || type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
{\r
NSCacheSubData * subData = (NSCacheSubData *) data;\r
\r
(subData->id)[0] = '\0';\r
- OICFree(subData);\r
-\r
+ NSOICFree(subData);\r
return NS_OK;\r
}\r
+ else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
+ {\r
\r
- return NS_OK;\r
-}\r
+ NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
+ NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,\r
+ (int)topicData->state);\r
\r
-bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
-{\r
- if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
- id == data->remote_syncObId)\r
+ NSOICFree(topicData->topicName);\r
+ NSOICFree(topicData);\r
+ }\r
+ else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
+ type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
{\r
- return true;\r
+ NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
+ NSOICFree(topicData->topicName);\r
+ NSOICFree(topicData);\r
}\r
\r
- return false;\r
+ return NS_OK;\r
}\r
\r
-NSResult NSProviderDeleteSubDataFromObId(NSCacheList * list, OCObservationId id)\r
+NSResult NSProviderStorageDelete(NSCacheList * list, const char * delId)\r
{\r
- if(!list || !list->head)\r
- {\r
- NS_LOG(INFO, "list is NULL");\r
- return NS_FAIL;\r
- }\r
-\r
pthread_mutex_lock(&NSCacheMutex);\r
NSCacheElement * prev = list->head;\r
NSCacheElement * del = list->head;\r
\r
NSCacheType type = list->cacheType;\r
\r
- bool isDelete = true;\r
+ if (!del)\r
+ {\r
+ NS_LOG(DEBUG, "list head is NULL");\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_FAIL;\r
+ }\r
\r
- while(isDelete)\r
+ if (NSProviderCompareIdCacheData(type, del->data, delId))\r
{\r
- NSCacheSubData * curr = (NSCacheSubData *)del->data;\r
+ if (del == list->head) // first object\r
+ {\r
+ if (del == list->tail) // first object (one object)\r
+ {\r
+ list->tail = del->next;\r
+ }\r
+\r
+ list->head = del->next;\r
+ NSProviderDeleteCacheData(type, del->data);\r
+ NSOICFree(del);\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_OK;\r
+ }\r
+ }\r
\r
- isDelete = false;\r
+ del = del->next;\r
\r
- if (NSIsSameObId(curr, id))\r
+ while (del)\r
+ {\r
+ if (NSProviderCompareIdCacheData(type, del->data, delId))\r
{\r
- if (del == list->head) // first object\r
+ if (del == list->tail) // delete object same to last object\r
{\r
- if (del == list->tail) // first object (one object)\r
- {\r
- list->tail = del->next;\r
- }\r
+ list->tail = prev;\r
+ }\r
\r
- list->head = del->next;\r
+ prev->next = del->next;\r
+ NSProviderDeleteCacheData(type, del->data);\r
+ NSOICFree(del);\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_OK;\r
+ }\r
\r
- NSProviderDeleteCacheData(type, del->data);\r
- OICFree(del);\r
- isDelete = true;\r
- }\r
+ prev = del;\r
+ del = del->next;\r
+ }\r
+\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_FAIL;\r
+}\r
+\r
+NSTopicLL * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
+{\r
+ NS_LOG(DEBUG, "NSProviderGetTopicsCache - IN");\r
+ pthread_mutex_lock(&NSCacheMutex);\r
+\r
+ NSCacheElement * iter = regTopicList->head;\r
+\r
+ if (!iter)\r
+ {\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NULL;\r
+ }\r
+\r
+ NSTopicLL * iterTopic = NULL;\r
+ NSTopicLL * newTopic = NULL;\r
+ NSTopicLL * topics = NULL;\r
+\r
+ while (iter)\r
+ {\r
+ NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
+ newTopic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
+\r
+ if (!newTopic)\r
+ {\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NULL;\r
+ }\r
+\r
+ newTopic->state = curr->state;\r
+ newTopic->next = NULL;\r
+ newTopic->topicName = OICStrdup(curr->topicName);\r
+\r
+ if (!topics)\r
+ {\r
+ iterTopic = topics = newTopic;\r
}\r
else\r
{\r
- del = del->next;\r
- while (del)\r
+ iterTopic->next = newTopic;\r
+ iterTopic = newTopic;\r
+ }\r
+\r
+ iter = iter->next;\r
+ }\r
+\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ NS_LOG(DEBUG, "NSProviderGetTopicsCache - OUT");\r
+\r
+ return topics;\r
+}\r
+\r
+NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * regTopicList,\r
+ NSCacheList * conTopicList, const char * consumerId)\r
+{\r
+ NS_LOG(DEBUG, "NSProviderGetConsumerTopicsCacheData - IN");\r
+\r
+ pthread_mutex_lock(&NSCacheMutex);\r
+ NSTopicLL * topics = NSProviderGetTopicsCacheData(regTopicList);\r
+\r
+ if (!topics)\r
+ {\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NULL;\r
+ }\r
+\r
+ NSCacheElement * iter = conTopicList->head;\r
+ conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
+\r
+ while (iter)\r
+ {\r
+ NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;\r
+\r
+ if (curr && strcmp(curr->id, consumerId) == 0)\r
+ {\r
+ NS_LOG_V(INFO_PRIVATE, "curr->id = %s", curr->id);\r
+ NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
+ NSTopicLL * topicIter = topics;\r
+\r
+ while (topicIter)\r
{\r
- if (NSIsSameObId(curr, id))\r
+ if (strcmp(topicIter->topicName, curr->topicName) == 0)\r
{\r
- if (del == list->tail) // delete object same to last object\r
- {\r
- list->tail = prev;\r
- }\r
-\r
- prev->next = del->next;\r
- NSProviderDeleteCacheData(type, del->data);\r
- OICFree(del);\r
- isDelete = true;\r
+ topicIter->state = NS_TOPIC_SUBSCRIBED;\r
break;\r
}\r
\r
- prev = del;\r
- del = del->next;\r
+ topicIter = topicIter->next;\r
}\r
}\r
+\r
+ iter = iter->next;\r
}\r
+\r
+ conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
pthread_mutex_unlock(&NSCacheMutex);\r
- return NS_OK;\r
+ NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
+\r
+ return topics;\r
+}\r
+\r
+bool NSProviderIsTopicSubScribed(NSCacheElement * conTopicList, char * cId, char * topicName)\r
+{\r
+ pthread_mutex_lock(&NSCacheMutex);\r
+\r
+ if (!conTopicList || !cId || !topicName)\r
+ {\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return false;\r
+ }\r
+\r
+ NSCacheElement * iter = conTopicList;\r
+\r
+ while (iter)\r
+ {\r
+ NSCacheTopicSubData * curr = (NSCacheTopicSubData *) iter->data;\r
+\r
+ if ( (strcmp(curr->id, cId) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
+ {\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return true;\r
+ }\r
+\r
+ iter = iter->next;\r
+ }\r
+\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return false;\r
+}\r
+\r
+NSResult NSProviderDeleteConsumerTopic(NSCacheList * conTopicList,\r
+ NSCacheTopicSubData * topicSubData)\r
+{\r
+ pthread_mutex_lock(&NSCacheMutex);\r
+\r
+ char * cId = topicSubData->id;\r
+ char * topicName = topicSubData->topicName;\r
+\r
+ if (!conTopicList || !cId || !topicName)\r
+ {\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_ERROR;\r
+ }\r
+\r
+ NSCacheElement * prev = conTopicList->head;\r
+ NSCacheElement * del = conTopicList->head;\r
+\r
+ NSCacheType type = conTopicList->cacheType;\r
+\r
+ if (!del)\r
+ {\r
+ NS_LOG(DEBUG, "list head is NULL");\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_FAIL;\r
+ }\r
+\r
+ NSCacheTopicSubData * curr = (NSCacheTopicSubData *) del->data;\r
+ NS_LOG_V(INFO_PRIVATE, "compareid = %s", cId);\r
+ NS_LOG_V(DEBUG, "comparetopicName = %s", topicName);\r
+ NS_LOG_V(INFO_PRIVATE, "curr->id = %s", curr->id);\r
+ NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
+\r
+ if ( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
+ (strcmp(curr->topicName, topicName) == 0) )\r
+ {\r
+ if (del == conTopicList->head) // first object\r
+ {\r
+ if (del == conTopicList->tail) // first object (one object)\r
+ {\r
+ conTopicList->tail = del->next;\r
+ }\r
+\r
+ conTopicList->head = del->next;\r
+ NSProviderDeleteCacheData(type, del->data);\r
+ NSOICFree(del);\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_OK;\r
+ }\r
+ }\r
+\r
+ curr = NULL;\r
+ del = del->next;\r
+\r
+ while (del)\r
+ {\r
+ curr = (NSCacheTopicSubData *) del->data;\r
+ if ( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
+ (strcmp(curr->topicName, topicName) == 0) )\r
+ {\r
+ if (del == conTopicList->tail) // delete object same to last object\r
+ {\r
+ conTopicList->tail = prev;\r
+ }\r
+\r
+ prev->next = del->next;\r
+ NSProviderDeleteCacheData(type, del->data);\r
+ NSOICFree(del);\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_OK;\r
+ }\r
+\r
+ prev = del;\r
+ del = del->next;\r
+ }\r
+\r
+ pthread_mutex_unlock(&NSCacheMutex);\r
+ return NS_FAIL;\r
}\r