//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
\r
#include "NSProvider.h"\r
+#include <cstring>\r
+#include "NSConsumerService.h"\r
#include "NSConsumerInterface.h"\r
+#include "NSAcceptedProviders.h"\r
+#include "NSConstants.h"\r
+#include "NSCommon.h"\r
+#include "oic_string.h"\r
+#include "oic_malloc.h"\r
\r
namespace OIC\r
{\r
::NSProvider *NSProvider::getNSProvider()\r
{\r
::NSProvider *provider = new ::NSProvider;\r
- OICStrcpy(provider->providerId, m_providerId.length(), m_providerId.c_str());\r
+ OICStrcpy(provider->providerId, NS_UTILS_UUID_STRING_SIZE, m_providerId.c_str());\r
return provider;\r
}\r
\r
NSProvider::NSProvider(::NSProvider *provider)\r
{\r
+ m_stateCb = NULL;\r
m_messageCb = NULL;\r
m_syncInfoCb = NULL;\r
+ m_state = NSProviderState::DENY;\r
+ m_subscribedState = NSProviderSubscribedState::DENY;\r
+\r
+ m_topicList = std::make_shared<NSTopicsList>();\r
+\r
if (provider != nullptr)\r
{\r
- if ((provider->providerId != nullptr) && strlen(provider->providerId))\r
- m_providerId.assign(provider->providerId, strlen(provider->providerId));\r
+ m_providerId.assign(provider->providerId, NS_UTILS_UUID_STRING_SIZE - 1);\r
+ }\r
+ }\r
+\r
+ NSProvider::NSProvider(const NSProvider &provider)\r
+ {\r
+ m_providerId = provider.getProviderId();\r
+ m_topicList = std::make_shared<NSTopicsList>();\r
+ auto topicsList = provider.getTopicList();\r
+ if (topicsList != nullptr)\r
+ {\r
+ for (auto it : topicsList->getTopicsList())\r
+ {\r
+ m_topicList->addTopic(it.getTopicName(), it.getState());\r
+ }\r
}\r
+ m_topicList->unsetModifiability();\r
+ setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
+ provider.getSyncInfoReceivedCb());\r
+ setProviderState(provider.getProviderState());\r
+ setProviderSubscribedState(provider.getProviderSubscribedState());\r
+ }\r
+\r
+ NSProvider &NSProvider::operator=(const NSProvider &provider)\r
+ {\r
+ this->m_providerId = provider.getProviderId();\r
+ this->m_topicList = std::make_shared<NSTopicsList>();\r
+ auto topicsList = provider.getTopicList();\r
+ if (topicsList != nullptr)\r
+ {\r
+ for (auto it : topicsList->getTopicsList())\r
+ {\r
+ this->m_topicList->addTopic(it.getTopicName(), it.getState());\r
+ }\r
+ }\r
+ m_topicList->unsetModifiability();\r
+ this->setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
+ provider.getSyncInfoReceivedCb());\r
+ this->setProviderState(provider.getProviderState());\r
+ this->setProviderSubscribedState(provider.getProviderSubscribedState());\r
+ return *this;\r
}\r
\r
std::string NSProvider::getProviderId() const\r
return m_providerId;\r
}\r
\r
- void NSProvider::subscribe()\r
+ std::shared_ptr<NSTopicsList> NSProvider::getTopicList() const throw (NSException)\r
+ {\r
+ NS_LOG(DEBUG, "getTopicList - IN");\r
+ if (!isValid())\r
+ {\r
+ throw NSException("Invalid Operation on provider. Provider is already Stopped.");\r
+ }\r
+ std::shared_ptr<NSTopicsList> topicList = std::make_shared<NSTopicsList>();\r
+ for (auto it : m_topicList->getTopicsList())\r
+ {\r
+ topicList->addTopic(it.getTopicName(), it.getState());\r
+ }\r
+ topicList->unsetModifiability();\r
+ return topicList;\r
+ }\r
+\r
+ NSResult NSProvider::updateTopicList(std::shared_ptr<NSTopicsList> topicList) throw (NSException)\r
+ {\r
+ NS_LOG(DEBUG, "updateTopicList - IN");\r
+ if (!isValid())\r
+ {\r
+ throw NSException("Invalid Operation on provider. Provider is already Stopped.");\r
+ }\r
+ if (topicList == nullptr)\r
+ {\r
+ return NSResult::ERROR;\r
+ }\r
+ NS_LOG(DEBUG, "Creating TopicLL from TopicList");\r
+ NSTopicLL *topicLL = NULL;\r
+ for (auto it : topicList->getTopicsList())\r
+ {\r
+ NSTopicLL *topic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
+ if (topic == nullptr)\r
+ {\r
+ NS_LOG(ERROR, "new NSTopicLL failed");\r
+ return NSResult::ERROR;\r
+ }\r
+ topic->topicName = NULL;\r
+ topic->topicName = OICStrdup(it.getTopicName().c_str());\r
+ topic->state = (::NSTopicState)it.getState();\r
+ topic->next = NULL;\r
+ if (topicLL == NULL)\r
+ {\r
+ topicLL = topic;\r
+ }\r
+ else\r
+ {\r
+ NSTopicLL *iter = topicLL;\r
+ NSTopicLL *prev = NULL;\r
+ while (iter)\r
+ {\r
+ prev = iter;\r
+ iter = (NSTopicLL *) iter->next;\r
+ }\r
+ prev->next = topic;\r
+ topic->next = NULL;\r
+ }\r
+ }\r
+ if (topicLL)\r
+ {\r
+ NSTopicLL *iter = topicLL;\r
+ while (iter)\r
+ {\r
+ NS_LOG_V(DEBUG, "Topic Name : %s", iter->topicName);\r
+ NS_LOG_V(DEBUG, "Topic State : %d", (int) iter->state);\r
+ iter = iter->next;\r
+ }\r
+ }\r
+ NS_LOG_V(INFO_PRIVATE, "calling Lower layer UpdateTopicList for Provider Id : %s",\r
+ getProviderId().c_str());\r
+ NSResult result = (NSResult) NSConsumerUpdateTopicList(getProviderId().c_str(), topicLL);\r
+\r
+ if (topicLL)\r
+ {\r
+ NSTopicLL *iter = topicLL;\r
+ NSTopicLL *following = NULL;\r
+\r
+ while (iter)\r
+ {\r
+ following = iter->next;\r
+ if (iter)\r
+ {\r
+ NSOICFree(iter->topicName);\r
+ iter->next = NULL;\r
+ NSOICFree(iter);\r
+ }\r
+ iter = following;\r
+ }\r
+ }\r
+ NS_LOG(DEBUG, "updateTopicList - OUT");\r
+ return result;\r
+ }\r
+\r
+ NSProviderState NSProvider::getProviderState() const\r
+ {\r
+ NS_LOG_V(DEBUG, "getProviderState state : %d", (int)m_state);\r
+ if (!isValid())\r
+ {\r
+ return NSProviderState::STOPPED;\r
+ }\r
+ return m_state;\r
+ }\r
+\r
+ NSProviderSubscribedState NSProvider::getProviderSubscribedState() const throw (NSException)\r
{\r
- NS_LOG(DEBUG, "subscribe - IN");\r
- NSSubscribe(getNSProvider());\r
- NS_LOG(DEBUG, "subscribe - OUT");\r
+ NS_LOG_V(DEBUG, "getProviderSubscribedState state : %d", (int)m_subscribedState);\r
+ if (!isValid())\r
+ {\r
+ throw NSException("Invalid Operation on provider. Provider is already Stopped.");\r
+ }\r
+ return m_subscribedState;\r
}\r
\r
- void NSProvider::unSubscribe()\r
+ NSResult NSProvider::subscribe() throw (NSException)\r
{\r
- NS_LOG(DEBUG, "unSubscribe - IN");\r
- NSUnsubscribe(getNSProvider());\r
- NS_LOG(DEBUG, "unSubscribe - OUT");\r
+ NS_LOG(DEBUG, "Subscribe - IN");\r
+ if (!isValid())\r
+ {\r
+ throw NSException("Invalid Operation on provider. Provider is already Stopped.");\r
+ }\r
+ NSResult result = (NSResult) NSSubscribe(getProviderId().c_str());\r
+ NS_LOG(DEBUG, "Subscribe - OUT");\r
+ return result;\r
}\r
\r
- void NSProvider::SendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\r
+ NSResult NSProvider::unsubscribe() throw (NSException)\r
+ {\r
+ NS_LOG(DEBUG, "unsubscribe - IN");\r
+ if (!isValid())\r
+ {\r
+ throw NSException("Invalid Operation on provider. Provider is already Stopped.");\r
+ }\r
+ NSResult result = (NSResult) NSUnsubscribe(getProviderId().c_str());\r
+ NS_LOG(DEBUG, "unsubscribe - OUT");\r
+ return result;\r
+ }\r
+\r
+ bool NSProvider::isSubscribed() throw (NSException)\r
+ {\r
+ NS_LOG(DEBUG, "isSubscribed - IN");\r
+ if (!isValid())\r
+ {\r
+ throw NSException("Invalid Operation on provider. Provider is already Stopped.");\r
+ }\r
+ NS_LOG_V(DEBUG, "Subscribed state : %d", (int)getProviderSubscribedState());\r
+ if (getProviderSubscribedState() == NSProviderSubscribedState::SUBSCRIBED)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ NSResult NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type) throw (NSException)\r
{\r
NS_LOG(DEBUG, "SendSyncInfo - IN");\r
- NSConsumerSendSyncInfo(m_providerId.c_str(), messageId, (::NSSyncType)type);\r
+ if (!isValid())\r
+ {\r
+ throw NSException("Invalid Operation on provider. Provider is already Stopped.");\r
+ }\r
+ NSResult result = (NSResult) NSConsumerSendSyncInfo(getProviderId().c_str(), messageId,\r
+ (::NSSyncType)type);\r
NS_LOG(DEBUG, "SendSyncInfo - OUT");\r
- return;\r
+ return result;\r
}\r
\r
- void NSProvider::setListener(NSProvider::MessageReceivedCallback messageHandle,\r
+ void NSProvider::setListener(NSProvider::ProviderStateCallback stateHandle,\r
+ NSProvider::MessageReceivedCallback messageHandle,\r
NSProvider::SyncInfoReceivedCallback syncHandle)\r
{\r
+ NS_LOG(DEBUG, "setListener - IN");\r
+ m_stateCb = stateHandle;\r
m_messageCb = messageHandle;\r
m_syncInfoCb = syncHandle;\r
+ NS_LOG(DEBUG, "setListener - OUT");\r
}\r
\r
- NSProvider::MessageReceivedCallback NSProvider::getMessageReceivedCb()\r
+ NSProvider::ProviderStateCallback NSProvider::getProviderStateReceivedCb() const\r
+ {\r
+ return m_stateCb;\r
+ }\r
+\r
+ NSProvider::MessageReceivedCallback NSProvider::getMessageReceivedCb() const\r
{\r
return m_messageCb;\r
}\r
\r
- NSProvider::SyncInfoReceivedCallback NSProvider::getSyncInfoReceivedCb()\r
+ NSProvider::SyncInfoReceivedCallback NSProvider::getSyncInfoReceivedCb() const\r
{\r
return m_syncInfoCb;\r
}\r
+\r
+ void NSProvider::setTopicList(std::shared_ptr<NSTopicsList> topicsList)\r
+ {\r
+ m_topicList = topicsList;\r
+ }\r
+\r
+ void NSProvider::setProviderState(const NSProviderState &providerState)\r
+ {\r
+ m_state = providerState;\r
+ }\r
+\r
+ void NSProvider::setProviderSubscribedState(const NSProviderSubscribedState &subscribedState)\r
+ {\r
+ m_subscribedState = subscribedState;\r
+ }\r
+\r
+ bool NSProvider::isValid() const\r
+ {\r
+ if (!NSConsumerService::getInstance()->getAcceptedProviders()->isAccepted(getProviderId()))\r
+ {\r
+ NS_LOG(DEBUG, "Invalid Operation with stale reference of Provider. Provider ID doesnot exist");\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
}\r
}\r