X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fnotification%2Fcpp-wrapper%2Fconsumer%2Fsrc%2FNSProvider.cpp;h=9272cf3bdfc8e08b2cabb7918462855f12120e78;hb=refs%2Ftags%2Faccepted%2Ftizen%2Funified%2F20171010.063815;hp=648f9c659236c838c29a7e712df11ee65895c801;hpb=b23ebaa7fb6716971cc13df2f9f70771a50e87d6;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 648f9c6..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" @@ -45,7 +47,7 @@ namespace OIC m_state = NSProviderState::DENY; m_subscribedState = NSProviderSubscribedState::DENY; - m_topicList = new NSTopicsList(); + m_topicList = std::make_shared(); if (provider != nullptr) { @@ -56,15 +58,16 @@ namespace OIC NSProvider::NSProvider(const NSProvider &provider) { m_providerId = provider.getProviderId(); - m_topicList = new NSTopicsList(); + 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()); @@ -74,15 +77,16 @@ namespace OIC NSProvider &NSProvider::operator=(const NSProvider &provider) { this->m_providerId = provider.getProviderId(); - this->m_topicList = new NSTopicsList(); + this->m_topicList = std::make_shared(); auto topicsList = provider.getTopicList(); if (topicsList != nullptr) { for (auto it : topicsList->getTopicsList()) { - this->getTopicList()->addTopic(it->getTopicName(), it->getState()); + this->m_topicList->addTopic(it.getTopicName(), it.getState()); } } + m_topicList->unsetModifiability(); this->setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(), provider.getSyncInfoReceivedCb()); this->setProviderState(provider.getProviderState()); @@ -90,33 +94,38 @@ namespace OIC 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()); -// } + } NS_LOG(DEBUG, "Creating TopicLL from TopicList"); NSTopicLL *topicLL = NULL; for (auto it : topicList->getTopicsList()) @@ -128,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) { @@ -158,9 +167,27 @@ namespace OIC 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; } @@ -168,37 +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; } - NSProviderSubscribedState NSProvider::getProviderSubscribedState() const + 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; } - void NSProvider::subscribe() + 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; + } + + 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() + bool NSProvider::isSubscribed() throw (NSException) { NS_LOG(DEBUG, "isSubscribed - IN"); + 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, @@ -227,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; } @@ -243,5 +304,15 @@ namespace OIC { 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; + } } }