Exemplo n.º 1
0
NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * regTopicList,
        NSCacheList * conTopicList, const char * consumerId)
{
    NS_LOG(DEBUG, "NSProviderGetConsumerTopicsCacheData - IN");

    pthread_mutex_lock(&NSCacheMutex);
    NSTopicLL * topics = NSProviderGetTopicsCacheData(regTopicList);

    if (!topics)
    {
        pthread_mutex_unlock(&NSCacheMutex);
        return NULL;
    }

    NSCacheElement * iter = conTopicList->head;
    conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;

    while (iter)
    {
        NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;

        if (curr && strcmp(curr->id, consumerId) == 0)
        {
            NS_LOG_V(INFO_PRIVATE, "curr->id = %s", curr->id);
            NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);
            NSTopicLL * topicIter = topics;

            while (topicIter)
            {
                if (strcmp(topicIter->topicName, curr->topicName) == 0)
                {
                    topicIter->state = NS_TOPIC_SUBSCRIBED;
                    break;
                }

                topicIter = topicIter->next;
            }
        }

        iter = iter->next;
    }

    conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;
    pthread_mutex_unlock(&NSCacheMutex);
    NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");

    return topics;
}
Exemplo n.º 2
0
NSCacheElement * NSProviderStorageRead(NSCacheList * list, const char * findId)
{
    pthread_mutex_lock(&NSCacheMutex);

    NS_LOG(DEBUG, "NSCacheRead - IN");

    NSCacheElement * iter = list->head;
    NSCacheElement * next = NULL;
    NSCacheType type = list->cacheType;

    NS_LOG_V(INFO_PRIVATE, "Find ID - %s", findId);

    while (iter)
    {
        next = iter->next;

        if (NSProviderCompareIdCacheData(type, iter->data, findId))
        {
            NS_LOG(DEBUG, "Found in Cache");
            pthread_mutex_unlock(&NSCacheMutex);
            return iter;
        }

        iter = next;
    }

    NS_LOG(DEBUG, "Not found in Cache");
    NS_LOG(DEBUG, "NSCacheRead - OUT");
    pthread_mutex_unlock(&NSCacheMutex);

    return NULL;
}
Exemplo n.º 3
0
NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)
{
    if (!data)
    {
        return NS_ERROR;
    }

    if (type == NS_PROVIDER_CACHE_SUBSCRIBER || type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)
    {
        NSCacheSubData * subData = (NSCacheSubData *) data;

        (subData->id)[0] = '\0';
        NSOICFree(subData);
        return NS_OK;
    }
    else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)
    {

        NSCacheTopicData * topicData = (NSCacheTopicData *) data;
        NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,
                (int)topicData->state);

        NSOICFree(topicData->topicName);
        NSOICFree(topicData);
    }
    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||
            type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)
    {
        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;
        NSOICFree(topicData->topicName);
        NSOICFree(topicData);
    }

    return NS_OK;
}
void NSConsumerInternalTaskProcessing(NSTask * task)
{
    NS_VERIFY_NOT_NULL_V(task);

    NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
    switch (task->taskType)
    {
        case TASK_CONSUMER_RECV_SUBSCRIBE_CONFIRMED:
        {
            NS_LOG(DEBUG, "Receive Subscribe confirm from provider.");
            NSConsumerHandleRecvSubscriptionConfirmed((NSMessage *)task->taskData);
            NSRemoveMessage((NSMessage *)task->taskData);
            break;
        }
        case TASK_CONSUMER_RECV_MESSAGE:
        {
            NS_LOG(DEBUG, "Receive New Notification");
            NSConsumerHandleRecvMessage((NSMessage *)task->taskData);
            NSRemoveMessage((NSMessage *)task->taskData);
            break;
        }
        case TASK_CONSUMER_PROVIDER_DISCOVERED:
        {
            NS_LOG(DEBUG, "Receive New Provider is discovered.");
            NSConsumerHandleProviderDiscovered((NSProvider_internal *)task->taskData);
            NSRemoveProvider((NSProvider_internal *)task->taskData);
            break;
        }
        case TASK_RECV_SYNCINFO:
        {
            NS_LOG(DEBUG, "Receive SyncInfo.");
            NSConsumerHandleRecvSyncInfo((NSSyncInfo *)task->taskData);
            NSOICFree(task->taskData);
            break;
        }
        case TASK_MAKE_SYNCINFO:
        {
            NS_LOG(DEBUG, "Make SyncInfo, get Provider's Addr");
            NSConsumerHandleMakeSyncInfo((NSSyncInfo *)task->taskData);
            NSOICFree(task->taskData);
            break;
        }
        case TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL:
        {
            NS_LOG(DEBUG, "Make Subscribe cancel from provider.");
            NSConsumerHandleProviderDeleted((NSProvider_internal *)task->taskData);
            NSRemoveProvider((NSProvider_internal *)task->taskData);
            break;
        }
        default :
        {
            NS_LOG(ERROR, "Unknown TASK Type");
            return ;
        }
    }
    NSOICFree(task);
}
void NSConsumerHandleRecvSubscriptionConfirmed(NSMessage * msg)
{
    NS_VERIFY_NOT_NULL_V(msg);

    NS_LOG_V(DEBUG, "confirmed by : %s", msg->providerId);
    NSProvider_internal * provider = NSProviderCacheFind(msg->providerId);
    NS_VERIFY_NOT_NULL_V(provider);

    if (provider->connection->next == NULL)
    {
        NS_LOG(DEBUG, "call back to user");
        NSSubscriptionAccepted((NSProvider *) provider);
    }
}
Exemplo n.º 6
0
OCStackApplicationResult NSHandlePublishCb(void *ctx, OCDoHandle handle,
    OCClientResponse *clientResponse)
{
    (void) handle;

    if (ctx != (void *)DEFAULT_CONTEXT_VALUE)
    {
        NS_LOG(DEBUG, "Invalid publish callback received");
    }

    NS_LOG_V(DEBUG, "Publish resource response received code: %d", clientResponse->result);

    return OC_STACK_KEEP_TRANSACTION;
}
Exemplo n.º 7
0
void NSPushQueue(NSSchedulerType schedulerType, NSTaskType taskType, void* data)
{

    if(!NSIsRunning[schedulerType])
    {
        return;
    }

    pthread_mutex_lock(&NSMutex[schedulerType]);

    NS_LOG(DEBUG, "NSPushQueue - IN");
    NS_LOG_V(DEBUG, "NSSchedulerType = %d", schedulerType);
    NS_LOG_V(DEBUG, "NSTaskType = %d", taskType);

    if (NSHeadMsg[schedulerType] == NULL)
    {
        NSHeadMsg[schedulerType] = (NSTask*) OICMalloc(sizeof(NSTask));
        NSHeadMsg[schedulerType]->taskType = taskType;
        NSHeadMsg[schedulerType]->taskData = data;
        NSHeadMsg[schedulerType]->nextTask = NULL;
        NSTailMsg[schedulerType] = NSHeadMsg[schedulerType];
    }
    else
    {
        NSTask* newNode = (NSTask*) OICMalloc(sizeof(NSTask));
        newNode->taskType = taskType;
        newNode->taskData = data;
        newNode->nextTask = NULL;

        NSTailMsg[schedulerType]->nextTask = newNode;
        NSTailMsg[schedulerType] = newNode;
    }

    sem_post(&(NSSemaphore[schedulerType]));
    NS_LOG(DEBUG, "NSPushQueue - OUT");
    pthread_mutex_unlock(&NSMutex[schedulerType]);
}
Exemplo n.º 8
0
NSResult NSPublishResourceToCloud(char *serverAddress)
{

    NS_LOG(DEBUG, "NSPublishResourceToCloud - IN");
    NS_LOG_V(DEBUG, "Cloud address: %s", serverAddress);

    const char * publishQuery = "/oic/rd?rt=oic.wk.rdpub";

    if (NSCloudPublish(serverAddress, publishQuery, &NSHandlePublishCb, 1,
            NotificationResource.handle) != OC_STACK_OK)
    {
        NS_LOG(DEBUG, "Unable to publish resources to cloud");
    }

    NS_LOG(DEBUG, "NSPublishResourceToCloud - OUT");
    return NS_OK;
}
Exemplo n.º 9
0
NSResult NSConsumerStorageWrite(NSCacheList * list, NSCacheElement * newObj)
{
    NS_VERIFY_NOT_NULL(list, NS_ERROR);
    NS_VERIFY_NOT_NULL(newObj, NS_ERROR);

    NSCacheType type = list->cacheType;
    NS_LOG_V(DEBUG, "cache type : %d", type);

    if (type == NS_CONSUMER_CACHE_PROVIDER)
    {
        return NSConsumerCacheWriteProvider(list, newObj);
    }

    NS_LOG (ERROR, "Not Supported Type");

    return NS_ERROR;
}
Exemplo n.º 10
0
NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool state)
{
    pthread_mutex_lock(&NSCacheMutex);

    NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - IN");

    if (id == NULL)
    {
        NS_LOG(DEBUG, "id is NULL");
        pthread_mutex_unlock(&NSCacheMutex);
        return NS_ERROR;
    }

    NSCacheElement * it = NSProviderStorageRead(list, id);

    if (it)
    {
        NSCacheSubData * itData = (NSCacheSubData *) it->data;
        if (strcmp(itData->id, id) == 0)
        {
            NS_LOG(DEBUG, "Update Data - IN");

            NS_LOG_V(INFO_PRIVATE, "currData_ID = %s", itData->id);
            NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);
            NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);
            NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);
            NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);
            NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);

            NS_LOG_V(DEBUG, "update state = %d", state);

            itData->isWhite = state;

            NS_LOG(DEBUG, "Update Data - OUT");
            pthread_mutex_unlock(&NSCacheMutex);
            return NS_OK;
        }
    }
    else
    {
        NS_LOG(DEBUG, "Not Found Data");
    }

    NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - OUT");
    pthread_mutex_unlock(&NSCacheMutex);
    return NS_ERROR;
}
Exemplo n.º 11
0
OCStackResult NSProviderPublishTopic(OCRepPayload * payload, OCClientResponseHandler response)
{
    NS_LOG(DEBUG, "NSProviderPublishTopic - IN");
    OCCallbackData cbData;
    memset(&cbData, 0, sizeof(OCCallbackData));
    cbData.cb = response;
    cbData.cd = NULL;
    cbData.context = NULL;

    NSMQServerInfo * serverInfo = NSGetMQServerInfo();

    if (!serverInfo)
    {
        NS_LOG(DEBUG, "serverInfo is not NULL");
        NS_LOG_V(DEBUG, "serverInfo->serverUri = %s", serverInfo->serverUri);
    }

    NS_LOG(DEBUG, "NSProviderPublishTopic - OUT");

    return OCDoResource(NULL, OC_REST_POST, serverInfo->serverUri, serverInfo->devAddr,
            (OCPayload *)payload, CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
}
Exemplo n.º 12
0
NSResult NSSendSync(NSSyncInfo *sync)
{
    NS_LOG(DEBUG, "NSSendSync - IN");

    OCObservationId obArray[255] = { 0, };
    int obCount = 0;
    int i;

    OCResourceHandle rHandle;
    if (NSPutSyncResource(sync, &rHandle) != NS_OK)
    {
        NS_LOG(ERROR, PCF("Fail to put sync resource"));
        return NS_ERROR;
    }

    NSCacheElement * it = consumerSubList->head;

    while (it)
    {
        NSCacheSubData * subData = (NSCacheSubData *) it->data;
        NS_LOG_V(INFO_PRIVATE, "sync subData->id = %s", subData->id);
        NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
        NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
        NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
        NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
        NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);

        if (subData->isWhite)
        {
            if (subData->syncObId != 0)
            {
                obArray[obCount++] = subData->syncObId;
            }

#if (defined WITH_CLOUD)
            if (subData->remote_syncObId != 0)
            {
                obArray[obCount++] = subData->remote_syncObId;
            }
#endif
        }
        it = it->next;
    }

    OCRepPayload* payload = NULL;
    if (NSSetSyncPayload(sync, &payload) != NS_OK)
    {
        NS_LOG(ERROR, "Failed to allocate payload");
        return NS_ERROR;
    }

#ifdef WITH_MQ
    if (NSGetMQServerInfo())
    {
        OCRepPayload* MQPayload = OCRepPayloadClone(payload);
        NSMessageType MQType = 0;

        if (sync->state == NS_SYNC_READ)
        {
            MQType = NS_MESSAGE_READ;
        }
        else if (sync->state == NS_SYNC_DELETED)
        {
            MQType = NS_MESSAGE_DELETED;
        }

        OCRepPayloadSetPropInt(MQPayload, NS_ATTRIBUTE_TYPE, (int64_t) MQType);
        NSProviderPublishTopic(MQPayload, NSProviderPublishMQResponseCB);
    }
#endif

    for (i = 0; i < obCount; ++i)
    {
        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
        NS_LOG_V(DEBUG, "Sync WhiteList[%d] = %d", i, obArray[i]);
        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
    }

    OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray,
            obCount, payload, OC_LOW_QOS);

    NS_LOG_V(DEBUG, "Sync ocstackResult = %d", ocstackResult);
    if (ocstackResult != OC_STACK_OK)
    {
        NS_LOG(ERROR, "fail to send Sync");
        OCRepPayloadDestroy(payload);
        return NS_ERROR;
    }

    OCRepPayloadDestroy(payload);

    NS_LOG(DEBUG, "NSSendSync - OUT");
    return NS_OK;
}
Exemplo n.º 13
0
NSResult NSProviderDeleteConsumerTopic(NSCacheList * conTopicList,
        NSCacheTopicSubData * topicSubData)
{
    pthread_mutex_lock(&NSCacheMutex);

    char * cId = topicSubData->id;
    char * topicName = topicSubData->topicName;

    if (!conTopicList || !cId || !topicName)
    {
        pthread_mutex_unlock(&NSCacheMutex);
        return NS_ERROR;
    }

    NSCacheElement * prev = conTopicList->head;
    NSCacheElement * del = conTopicList->head;

    NSCacheType type = conTopicList->cacheType;

    if (!del)
    {
        NS_LOG(DEBUG, "list head is NULL");
        pthread_mutex_unlock(&NSCacheMutex);
        return NS_FAIL;
    }

    NSCacheTopicSubData * curr = (NSCacheTopicSubData *) del->data;
    NS_LOG_V(INFO_PRIVATE, "compareid = %s", cId);
    NS_LOG_V(DEBUG, "comparetopicName = %s", topicName);
    NS_LOG_V(INFO_PRIVATE, "curr->id = %s", curr->id);
    NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);

    if ( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&
            (strcmp(curr->topicName, topicName) == 0) )
    {
        if (del == conTopicList->head) // first object
        {
            if (del == conTopicList->tail) // first object (one object)
            {
                conTopicList->tail = del->next;
            }

            conTopicList->head = del->next;
            NSProviderDeleteCacheData(type, del->data);
            NSOICFree(del);
            pthread_mutex_unlock(&NSCacheMutex);
            return NS_OK;
        }
    }

    curr = NULL;
    del = del->next;

    while (del)
    {
        curr = (NSCacheTopicSubData *) del->data;
        if ( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&
                (strcmp(curr->topicName, topicName) == 0) )
        {
            if (del == conTopicList->tail) // delete object same to last object
            {
                conTopicList->tail = prev;
            }

            prev->next = del->next;
            NSProviderDeleteCacheData(type, del->data);
            NSOICFree(del);
            pthread_mutex_unlock(&NSCacheMutex);
            return NS_OK;
        }

        prev = del;
        del = del->next;
    }

    pthread_mutex_unlock(&NSCacheMutex);
    return NS_FAIL;
}
Exemplo n.º 14
0
NSResult NSSendNotification(NSMessage *msg)
{
    NS_LOG(DEBUG, "NSSendMessage - IN");

    OCResourceHandle rHandle;
    OCObservationId obArray[255] = { 0, };
    int obCount = 0, i;

    if (NSPutMessageResource(msg, &rHandle) != NS_OK)
    {
        NS_LOG(ERROR, "fail to Put notification resource");
        return NS_ERROR;
    }

    OCRepPayload* payload = NULL;

    if (NSSetMessagePayload(msg, &payload) != NS_OK)
    {
        NS_LOG(ERROR, "fail to Get message payload");
        return NS_ERROR;
    }

#ifdef WITH_MQ
    if (NSGetMQServerInfo())
    {
        NSProviderPublishTopic(OCRepPayloadClone(payload), NSProviderPublishMQResponseCB);
    }
#endif

    if (consumerSubList->head == NULL)
    {
        NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
        OCRepPayloadDestroy(payload);
        msg->extraInfo = NULL;
        return NS_ERROR;
    }

    NSCacheElement * it = consumerSubList->head;

    while (it)
    {
        NSCacheSubData * subData = (NSCacheSubData *) it->data;
        NS_LOG_V(INFO_PRIVATE, "message subData->id = %s", subData->id);
        NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
        NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
        NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
        NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
        NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);

        if (subData->isWhite)
        {
            if(subData->messageObId != 0)
            {
                if (msg->topic && (msg->topic)[0] != '\0')
                {
                    NS_LOG_V(DEBUG, "this is topic message: %s", msg->topic);

                    if (NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
                    {
                        obArray[obCount++] = subData->messageObId;
                    }
                }
                else
                {
                    obArray[obCount++] = subData->messageObId;
                }
            }

#if (defined WITH_CLOUD)
            if (subData->remote_messageObId != 0)
            {
                if (msg->topic && (msg->topic)[0] != '\0')
                {
                    NS_LOG_V(DEBUG, "this is topic message via remote server: %s", msg->topic);
                    if (NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
                    {
                        obArray[obCount++] = subData->remote_messageObId;
                    }
                }
                else
                {
                    obArray[obCount++] = subData->remote_messageObId;
                }
            }
#endif

        }
        it = it->next;
    }

    for (i = 0; i < obCount; ++i)
    {
        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
        NS_LOG_V(DEBUG, "SubScription WhiteList[%d] = %d", i, obArray[i]);
        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
    }

    if (!obCount)
    {
        NS_LOG(ERROR, "observer count is zero");
        OCRepPayloadDestroy(payload);
        msg->extraInfo = NULL;
        return NS_ERROR;
    }

    OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray, obCount, payload,
            OC_LOW_QOS);

    NS_LOG_V(DEBUG, "Message ocstackResult = %d", ocstackResult);

    if (ocstackResult != OC_STACK_OK)
    {
        NS_LOG(ERROR, "fail to send message");
        OCRepPayloadDestroy(payload);
        msg->extraInfo = NULL;
        return NS_ERROR;
    }

    OCRepPayloadDestroy(payload);
    msg->extraInfo = NULL;

    NS_LOG(DEBUG, "NSSendMessage - OUT");
    return NS_OK;
}
Exemplo n.º 15
0
NSResult NSConsumerCacheWriteProvider(NSCacheList * list, NSCacheElement * newObj)
{
    NS_VERIFY_NOT_NULL(list, NS_ERROR);
    NS_VERIFY_NOT_NULL(newObj, NS_ERROR);

    pthread_mutex_t * mutex = NSGetCacheMutex();

    NSProvider_internal * newProvObj = (NSProvider_internal *) newObj->data;

    NSCacheElement * it = NSConsumerStorageRead(list, newProvObj->providerId);

    pthread_mutex_lock(mutex);

    if (it)
    {
        if (newProvObj->connection)
        {
            NSProvider_internal * provObj = (NSProvider_internal *) it->data;

            NSProviderConnectionInfo * infos = provObj->connection;
            NSProviderConnectionInfo * lastConn = infos->next;
            while(lastConn)
            {
                infos = lastConn;
                lastConn = lastConn->next;
            }
            infos->next = NSCopyProviderConnections(newProvObj->connection);
        }

        if (newProvObj->topicLL)
        {
            NSProvider_internal * provObj = (NSProvider_internal *) it->data;
            NSRemoveTopicLL(provObj->topicLL);
            provObj->topicLL = NSCopyTopicLL(newProvObj->topicLL);
        }

        pthread_mutex_unlock(mutex);

        return NS_OK;
    }

    NSCacheElement * obj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));
    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(obj, NS_ERROR, pthread_mutex_unlock(mutex));

    NS_LOG_V(INFO_PRIVATE, "New Object address : %s:%d", newProvObj->connection->addr->addr, newProvObj->connection->addr->port);
    obj->data = (void *) NSCopyProvider_internal(newProvObj);

    if (!obj->data)
    {
        NS_LOG (ERROR, "Failed to CopyProvider");
        NSOICFree(obj);
        pthread_mutex_unlock(mutex);

        return NS_ERROR;
    }
    obj->next = NULL;

    if (!list->head)
    {
        list->head = obj;
        list->tail = obj;

        pthread_mutex_unlock(mutex);

        return NS_OK;
    }

    (list->tail)->next = obj;
    list->tail = obj;

    pthread_mutex_unlock(mutex);

    return NS_OK;
}
Exemplo n.º 16
0
NSResult NSProviderStorageWrite(NSCacheList * list, NSCacheElement * newObj)
{
    pthread_mutex_lock(&NSCacheMutex);

    NSCacheType type = list->cacheType;

    NS_LOG(DEBUG, "NSCacheWrite - IN");

    if (newObj == NULL)
    {
        NS_LOG(DEBUG, "newObj is NULL - IN");
        pthread_mutex_unlock(&NSCacheMutex);
        return NS_ERROR;
    }

    if (type == NS_PROVIDER_CACHE_SUBSCRIBER)
    {
        NS_LOG(DEBUG, "Type is SUBSCRIBER");

        NSCacheSubData * subData = (NSCacheSubData *) newObj->data;
        NSCacheElement * it = NSProviderStorageRead(list, subData->id);

        if (it)
        {
            NSCacheSubData * itData = (NSCacheSubData *) it->data;

            if (strcmp(itData->id, subData->id) == 0)
            {
                NS_LOG(DEBUG, "Update Data - IN");

                NS_LOG_V(INFO_PRIVATE, "currData_ID = %s", itData->id);
                NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);
                NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);
                NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);
                NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);
                NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);

                NS_LOG_V(INFO_PRIVATE, "subData_ID = %s", subData->id);
                NS_LOG_V(DEBUG, "subData_MsgObID = %d", subData->messageObId);
                NS_LOG_V(DEBUG, "subData_SyncObID = %d", subData->syncObId);
                NS_LOG_V(DEBUG, "subData_Cloud_MsgObID = %d", subData->remote_messageObId);
                NS_LOG_V(DEBUG, "subData_Cloud_SyncObID = %d", subData->remote_syncObId);
                NS_LOG_V(DEBUG, "subData_IsWhite = %d", subData->isWhite);

                if (subData->messageObId != 0)
                {
                    itData->messageObId = subData->messageObId;
                }

                if (subData->syncObId != 0)
                {
                    itData->syncObId = subData->syncObId;
                }

                if (subData->remote_messageObId != 0)
                {
                    itData->remote_messageObId = subData->remote_messageObId;
                }

                if (subData->remote_syncObId != 0)
                {
                    itData->remote_syncObId = subData->remote_syncObId;
                    NS_LOG_V(DEBUG, "sync id cached: %d", itData->remote_syncObId);
                }

                NS_LOG(DEBUG, "Update Data - OUT");
                NSOICFree(subData);
                NSOICFree(newObj);
                pthread_mutex_unlock(&NSCacheMutex);
                return NS_OK;
            }
        }

    }
    else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)
    {
        NS_LOG(DEBUG, "Type is REGITSTER TOPIC");

        NSCacheTopicData * topicData = (NSCacheTopicData *) newObj->data;
        NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);

        NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);
    }
    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)
    {
        NS_LOG(DEBUG, "Type is REGITSTER TOPIC");

        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;
        NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);

        NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);
    }
    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)
    {
        NS_LOG(DEBUG, "Type is REGITSTER TOPIC");

        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;
        NSCacheElement * it = NSProviderStorageRead(list, topicData->id);

        NS_PROVIDER_DELETE_REGISTERED_TOPIC_DATA(it, topicData, newObj);
    }

    if (list->head == NULL)
    {
        NS_LOG(DEBUG, "list->head is NULL, Insert First Data");
        list->head = list->tail = newObj;
        pthread_mutex_unlock(&NSCacheMutex);
        return NS_OK;
    }

    list->tail = list->tail->next = newObj;
    NS_LOG(DEBUG, "list->head is not NULL");
    pthread_mutex_unlock(&NSCacheMutex);
    return NS_OK;
}
Exemplo n.º 17
0
bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)
{
    NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");

    if (data == NULL)
    {
        return false;
    }

    NS_LOG_V(INFO_PRIVATE, "Data(compData) = [%s]", id);

    if (type == NS_PROVIDER_CACHE_SUBSCRIBER)
    {
        NSCacheSubData * subData = (NSCacheSubData *) data;

        NS_LOG_V(INFO_PRIVATE, "Data(subData) = [%s]", subData->id);

        if (strcmp(subData->id, id) == 0)
        {
            NS_LOG(DEBUG, "SubData is Same");
            return true;
        }

        NS_LOG(DEBUG, "Message Data is Not Same");
        return false;
    }
    else if (type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)
    {
        NSCacheSubData * subData = (NSCacheSubData *) data;

        NS_LOG_V(INFO_PRIVATE, "Data(subData) = [%s]", subData->id);

        OCObservationId currID = *id;

        if (NSIsSameObId(subData, currID))
        {
            NS_LOG(DEBUG, "SubData is Same");
            return true;
        }

        NS_LOG(DEBUG, "Message Data is Not Same");
        return false;
    }
    else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)
    {
        NSCacheTopicData * topicData = (NSCacheTopicData *) data;

        NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);

        if (strcmp(topicData->topicName, id) == 0)
        {
            NS_LOG(DEBUG, "SubData is Same");
            return true;
        }

        NS_LOG(DEBUG, "Message Data is Not Same");
        return false;
    }
    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)
    {
        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;

        NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);

        if (strcmp(topicData->topicName, id) == 0)
        {
            NS_LOG(DEBUG, "SubData is Same");
            return true;
        }

        NS_LOG(DEBUG, "Message Data is Not Same");
        return false;
    }
    else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)
    {
        NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;

        NS_LOG_V(INFO_PRIVATE, "Data(topicData) = [%s]", topicData->id);

        if (strcmp(topicData->id, id) == 0)
        {
            NS_LOG(DEBUG, "SubData is Same");
            return true;
        }

        NS_LOG(DEBUG, "Message Data is Not Same");
        return false;
    }


    NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");
    return false;
}
void NSConsumerHandleProviderDiscovered(NSProvider_internal * provider)
{
    NS_VERIFY_NOT_NULL_V(provider);

    bool isAdded = true;
    bool isSubscribing = false;
    NSProvider_internal * providerCacheData = NSProviderCacheFind(provider->providerId);

    if (providerCacheData == NULL)
    {
        isAdded = false;
    }
    else
    {
        providerCacheData->accessPolicy = provider->accessPolicy;
        NSProviderConnectionInfo * infos = providerCacheData->connection;
        OCTransportAdapter newAdapter = provider->connection->addr->adapter;
        while (infos)
        {
            isSubscribing |= infos->isSubscribing;
            if (infos->addr->adapter == newAdapter && infos->isSubscribing == true)
            {
                NS_LOG_V(DEBUG, "This provider already discovered : %s:%d",
                         infos->addr->addr, infos->addr->port);
                NS_LOG_V(DEBUG, "Subscription : %d", infos->isSubscribing);
                return;
            }
            infos = infos->next;
        }
    }

    NSResult ret = NSProviderCacheUpdate(provider);
    NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);

    if (isAdded == false)
    {
        NS_LOG(DEBUG, "New provider is discovered");
    }
    else
    {
        provider = providerCacheData;
        NS_LOG(DEBUG, "provider's connection is updated.");
    }

    if (provider->accessPolicy == NS_SELECTION_CONSUMER && isSubscribing == false)
    {
        NS_LOG(DEBUG, "accepter is NS_ACCEPTER_CONSUMER, Callback to user");
        NSDiscoveredProvider((NSProvider *) provider);
    }
    else
    {
        NS_LOG(DEBUG, "accepter is NS_ACCEPTER_PROVIDER, request subscribe");
        NSProvider_internal * subProvider = NSCopyProvider(provider);
        NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) subProvider);
        NS_VERIFY_NOT_NULL_V(task);

        NSConsumerPushEvent(task);
    }

    NSRemoveProvider(providerCacheData);
}