X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fnotification%2Fcpp-wrapper%2Fconsumer%2Fsrc%2FNSProvider.cpp;h=9272cf3bdfc8e08b2cabb7918462855f12120e78;hb=8229635f6d207516ccbbdf23b13be164e0fc1787;hp=c4d72699926f9fb24b5108aadfdaa4dcb880b0b6;hpb=c9a0b0ff9f05d1824d7813adc0f4313f064059ef;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp b/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp index c4d7269..9272cf3 100755 --- a/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp +++ b/service/notification/cpp-wrapper/consumer/src/NSProvider.cpp @@ -20,7 +20,9 @@ #include "NSProvider.h" #include +#include "NSConsumerService.h" #include "NSConsumerInterface.h" +#include "NSAcceptedProviders.h" #include "NSConstants.h" #include "NSCommon.h" #include "oic_string.h" @@ -43,7 +45,9 @@ namespace OIC m_messageCb = NULL; m_syncInfoCb = NULL; m_state = NSProviderState::DENY; - m_topicList = new NSTopicsList(); + m_subscribedState = NSProviderSubscribedState::DENY; + + m_topicList = std::make_shared(); if (provider != nullptr) { @@ -54,62 +58,73 @@ namespace OIC NSProvider::NSProvider(const NSProvider &provider) { m_providerId = provider.getProviderId(); + m_topicList = std::make_shared(); auto topicsList = provider.getTopicList(); if (topicsList != nullptr) { for (auto it : topicsList->getTopicsList()) { - getTopicList()->addTopic(it->getTopicName(), it->getState()); + m_topicList->addTopic(it.getTopicName(), it.getState()); } } + m_topicList->unsetModifiability(); setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(), provider.getSyncInfoReceivedCb()); setProviderState(provider.getProviderState()); + setProviderSubscribedState(provider.getProviderSubscribedState()); } NSProvider &NSProvider::operator=(const NSProvider &provider) { - m_providerId = provider.getProviderId(); + this->m_providerId = provider.getProviderId(); + this->m_topicList = std::make_shared(); auto topicsList = provider.getTopicList(); if (topicsList != nullptr) { for (auto it : topicsList->getTopicsList()) { - getTopicList()->addTopic(it->getTopicName(), it->getState()); + this->m_topicList->addTopic(it.getTopicName(), it.getState()); } } - setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(), - provider.getSyncInfoReceivedCb()); - setProviderState(provider.getProviderState()); + m_topicList->unsetModifiability(); + this->setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(), + provider.getSyncInfoReceivedCb()); + this->setProviderState(provider.getProviderState()); + this->setProviderSubscribedState(provider.getProviderSubscribedState()); return *this; } - NSProvider::~NSProvider() - { - if (m_topicList != nullptr) - delete m_topicList; - } - std::string NSProvider::getProviderId() const { return m_providerId; } - NSTopicsList *NSProvider::getTopicList() const + std::shared_ptr NSProvider::getTopicList() const throw (NSException) { NS_LOG(DEBUG, "getTopicList - IN"); - return m_topicList; + if (!isValid()) + { + throw NSException("Invalid Operation on provider. Provider is already Stopped."); + } + std::shared_ptr topicList = std::make_shared(); + for (auto it : m_topicList->getTopicsList()) + { + topicList->addTopic(it.getTopicName(), it.getState()); + } + topicList->unsetModifiability(); + return topicList; } - NSResult NSProvider::updateTopicList(NSTopicsList *topicList) + NSResult NSProvider::updateTopicList(std::shared_ptr topicList) throw (NSException) { NS_LOG(DEBUG, "updateTopicList - IN"); + if (!isValid()) + { + throw NSException("Invalid Operation on provider. Provider is already Stopped."); + } if (topicList == nullptr) - return NSResult::ERROR; - for (auto it : topicList->getTopicsList()) { - NS_LOG_V(DEBUG, "Topic Name : %s", it->getTopicName().c_str()); - NS_LOG_V(DEBUG, "Topic State : %d", (int) it->getState()); + return NSResult::ERROR; } NS_LOG(DEBUG, "Creating TopicLL from TopicList"); NSTopicLL *topicLL = NULL; @@ -122,8 +137,8 @@ namespace OIC return NSResult::ERROR; } topic->topicName = NULL; - topic->topicName = OICStrdup(it->getTopicName().c_str()); - topic->state = (::NSTopicState)it->getState(); + topic->topicName = OICStrdup(it.getTopicName().c_str()); + topic->state = (::NSTopicState)it.getState(); topic->next = NULL; if (topicLL == NULL) { @@ -148,13 +163,31 @@ namespace OIC while (iter) { NS_LOG_V(DEBUG, "Topic Name : %s", iter->topicName); - NS_LOG_V(DEBUG, "Topic State : %d", iter->state); + NS_LOG_V(DEBUG, "Topic State : %d", (int) iter->state); iter = iter->next; } } - NS_LOG_V(DEBUG, "calling Lower layer UpdateTopicList for Provider Id : %s", + NS_LOG_V(INFO_PRIVATE, "calling Lower layer UpdateTopicList for Provider Id : %s", getProviderId().c_str()); NSResult result = (NSResult) NSConsumerUpdateTopicList(getProviderId().c_str(), topicLL); + + if (topicLL) + { + NSTopicLL *iter = topicLL; + NSTopicLL *following = NULL; + + while (iter) + { + following = iter->next; + if (iter) + { + NSOICFree(iter->topicName); + iter->next = NULL; + NSOICFree(iter); + } + iter = following; + } + } NS_LOG(DEBUG, "updateTopicList - OUT"); return result; } @@ -162,32 +195,73 @@ namespace OIC NSProviderState NSProvider::getProviderState() const { NS_LOG_V(DEBUG, "getProviderState state : %d", (int)m_state); + if (!isValid()) + { + return NSProviderState::STOPPED; + } return m_state; } - void NSProvider::subscribe() + NSProviderSubscribedState NSProvider::getProviderSubscribedState() const throw (NSException) + { + NS_LOG_V(DEBUG, "getProviderSubscribedState state : %d", (int)m_subscribedState); + if (!isValid()) + { + throw NSException("Invalid Operation on provider. Provider is already Stopped."); + } + return m_subscribedState; + } + + NSResult NSProvider::subscribe() throw (NSException) { NS_LOG(DEBUG, "Subscribe - IN"); - NSSubscribe(getProviderId().c_str()); + if (!isValid()) + { + throw NSException("Invalid Operation on provider. Provider is already Stopped."); + } + NSResult result = (NSResult) NSSubscribe(getProviderId().c_str()); NS_LOG(DEBUG, "Subscribe - OUT"); + return result; } - bool NSProvider::isSubscribed() + NSResult NSProvider::unsubscribe() throw (NSException) + { + NS_LOG(DEBUG, "unsubscribe - IN"); + if (!isValid()) + { + throw NSException("Invalid Operation on provider. Provider is already Stopped."); + } + NSResult result = (NSResult) NSUnsubscribe(getProviderId().c_str()); + NS_LOG(DEBUG, "unsubscribe - OUT"); + return result; + } + + bool NSProvider::isSubscribed() throw (NSException) { NS_LOG(DEBUG, "isSubscribed - IN"); - auto state = getProviderState(); - NS_LOG_V(DEBUG, "state : %d", (int)state); - if ((state == NSProviderState::ALLOW) || (state == NSProviderState::TOPIC) ) + if (!isValid()) + { + throw NSException("Invalid Operation on provider. Provider is already Stopped."); + } + NS_LOG_V(DEBUG, "Subscribed state : %d", (int)getProviderSubscribedState()); + if (getProviderSubscribedState() == NSProviderSubscribedState::SUBSCRIBED) + { return true; + } return false; } - void NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type) + NSResult NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type) throw (NSException) { NS_LOG(DEBUG, "SendSyncInfo - IN"); - NSConsumerSendSyncInfo(m_providerId.c_str(), messageId, (::NSSyncType)type); + if (!isValid()) + { + throw NSException("Invalid Operation on provider. Provider is already Stopped."); + } + NSResult result = (NSResult) NSConsumerSendSyncInfo(getProviderId().c_str(), messageId, + (::NSSyncType)type); NS_LOG(DEBUG, "SendSyncInfo - OUT"); - return; + return result; } void NSProvider::setListener(NSProvider::ProviderStateCallback stateHandle, @@ -216,10 +290,8 @@ namespace OIC return m_syncInfoCb; } - void NSProvider::setTopicList(NSTopicsList *topicsList) + void NSProvider::setTopicList(std::shared_ptr topicsList) { - if (m_topicList != nullptr) - delete m_topicList; m_topicList = topicsList; } @@ -227,5 +299,20 @@ namespace OIC { m_state = providerState; } + + void NSProvider::setProviderSubscribedState(const NSProviderSubscribedState &subscribedState) + { + m_subscribedState = subscribedState; + } + + bool NSProvider::isValid() const + { + if (!NSConsumerService::getInstance()->getAcceptedProviders()->isAccepted(getProviderId())) + { + NS_LOG(DEBUG, "Invalid Operation with stale reference of Provider. Provider ID doesnot exist"); + return false; + } + return true; + } } }