case OC_STACK_RESOURCE_CHANGED:
return true;
default:
+ NS_LOG_V(DEBUG, "OCStackResult : %d", (int)ret);
return false;
}
}
if (payload->trigger == OC_PRESENCE_TRIGGER_DELETE ||
clientResponse->result == OC_STACK_PRESENCE_STOPPED)
{
- // TODO find request and cancel
NS_LOG(DEBUG, "stopped presence or resource is deleted.");
- //OCCancel(handle, NS_QOS, NULL, 0);
+ NS_LOG(DEBUG, "build NSTask");
+ OCDevAddr * addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
+ NS_VERIFY_NOT_NULL(addr, OC_STACK_KEEP_TRANSACTION);
+ memcpy(addr, clientResponse->addr, sizeof(OCDevAddr));
+
+ NSTask * task = NSMakeTask(TASK_CONSUMER_PROVIDER_DELETED, addr);
+ NS_VERIFY_NOT_NULL(task, OC_STACK_KEEP_TRANSACTION);
}
else if (payload->trigger == OC_PRESENCE_TRIGGER_CREATE)
return NSCopyProvider_internal((NSProvider_internal *) cacheElement->data);
}
+NSProvider_internal * NSFindProviderFromAddr(OCDevAddr * addr)
+{
+ NS_VERIFY_NOT_NULL(addr, NULL);
+
+ NSCacheList * ProviderCache = *(NSGetProviderCacheList());
+ if (!ProviderCache)
+ {
+ NS_LOG(DEBUG, "Provider Cache does not intialized.");
+ return NULL;
+ }
+
+ NSCacheElement * cacheElement =
+ NSGetProviderFromAddr(ProviderCache, addr->addr, addr->port);
+
+ NS_VERIFY_NOT_NULL(cacheElement, NULL);
+
+ return NSCopyProvider_internal((NSProvider_internal *) cacheElement->data);
+}
+
void NSRemoveCacheElementMessage(NSCacheElement * obj)
{
NSRemoveMessage(((NSStoreMessage *)obj->data)->msg);
NSProvider_internal * NSProviderCacheFind(const char *);
+NSProvider_internal * NSFindProviderFromAddr(OCDevAddr * addr);
+
void NSConsumerInternalTaskProcessing(NSTask *);
#ifdef __cplusplus
return NULL;
}
+NSCacheElement * NSGetProviderFromAddr(NSCacheList * list, const char * addr, uint16_t port)
+{
+ NS_VERIFY_NOT_NULL(list, NULL);
+ NS_VERIFY_NOT_NULL(addr, NULL);
+ NS_VERIFY_NOT_NULL(
+ (list->cacheType != NS_CONSUMER_CACHE_PROVIDER) ? NULL : (void *) 1, NULL);
+
+ pthread_mutex_t * mutex = NSGetCacheMutex();
+ pthread_mutex_lock(mutex);
+
+ NSCacheElement * iter = list->head;
+
+ while (iter)
+ {
+ NSProviderConnectionInfo * connection =
+ ((NSProviderConnectionInfo *) iter->data)->next;
+ while (connection)
+ {
+ char * conAddr = connection->addr->addr;
+ uint16_t conPort = connection->addr->port;
+
+ if (!strcmp(conAddr, addr) && conPort == port)
+ {
+ pthread_mutex_unlock(mutex);
+ return iter;
+ }
+ connection = connection->next;
+ }
+
+ iter = iter->next;
+ }
+
+ NS_LOG (DEBUG, "No Cache Element");
+ pthread_mutex_unlock(mutex);
+ return NULL;
+}
+
NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)
{
NS_VERIFY_NOT_NULL(list, NS_ERROR);
NSResult NSConsumerCacheWriteProvider(NSCacheList * list, NSCacheElement * newObj);
NSCacheElement * NSPopProviderCacheList(NSCacheList * list);
+NSCacheElement * NSGetProviderFromAddr(NSCacheList * list, const char * addr, uint16_t port);
+
#ifdef __cplusplus
}
#endif // __cplusplus
return NULL;
}
+void NSProviderDeletedPostClean(
+ NSTask * task, NSProvider_internal * prov1, NSProvider_internal * prov2)
+{
+ if (task && task->taskData)
+ {
+ if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL)
+ {
+ NSRemoveProvider((NSProvider *) task->taskData);
+ }
+ else if (task->taskType == TASK_CONSUMER_PROVIDER_DELETED)
+ {
+ NSOICFree(task->taskData);
+ }
+ NSOICFree(task);
+ }
+
+ if (prov1)
+ {
+ NSRemoveProvider_internal(prov1);
+ }
+
+ if (prov2)
+ {
+ NSRemoveProvider_internal(prov2);
+ }
+}
+
void NSConsumerTaskProcessing(NSTask * task)
{
switch (task->taskType)
break;
}
case TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL:
+ case TASK_CONSUMER_PROVIDER_DELETED:
{
- NSProvider_internal * data =
- NSConsumerFindNSProvider(((NSProvider *)task->taskData)->providerId);
- NS_VERIFY_NOT_NULL_V(data);
+ NSProvider_internal * data = NULL;
+
+ if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL)
+ {
+ data = NSConsumerFindNSProvider(((NSProvider *) task->taskData)->providerId);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+ data, NSProviderDeletedPostClean(task, NULL, NULL));
+ }
+ else if (task->taskType == TASK_CONSUMER_PROVIDER_DELETED)
+ {
+ data = NSFindProviderFromAddr((OCDevAddr *) task->taskData);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+ data, NSProviderDeletedPostClean(task, NULL, NULL));
+ }
+
+ NSProvider_internal * data2 = NSCopyProvider_internal(data);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+ data2, NSProviderDeletedPostClean(task, data, NULL));
+
NSTask * conTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, data);
- NS_VERIFY_NOT_NULL_V(conTask);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+ conTask, NSProviderDeletedPostClean(task, data, data2));
NSConsumerCommunicationTaskProcessing(conTask);
- data = NSConsumerFindNSProvider(((NSProvider *)task->taskData)->providerId);
- NS_VERIFY_NOT_NULL_V(data);
- NSTask * conTask2 = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, data);
+ NSTask * conTask2 = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, data2);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+ conTask, NSProviderDeletedPostClean(task, NULL, data2));
NSConsumerInternalTaskProcessing(conTask2);
- NSRemoveProvider((NSProvider *)task->taskData);
- NSOICFree(task);
+ NSProviderDeletedPostClean(task, NULL, NULL);
break;
}
case TASK_RECV_SYNCINFO: