replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / consumer / src / NSProvider.cpp
index 0c5588a..9272cf3 100755 (executable)
@@ -20,7 +20,9 @@
 \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
@@ -45,7 +47,7 @@ namespace OIC
             m_state = NSProviderState::DENY;\r
             m_subscribedState = NSProviderSubscribedState::DENY;\r
 \r
-            m_topicList = new NSTopicsList();\r
+            m_topicList = std::make_shared<NSTopicsList>();\r
 \r
             if (provider != nullptr)\r
             {\r
@@ -56,15 +58,16 @@ namespace OIC
         NSProvider::NSProvider(const NSProvider &provider)\r
         {\r
             m_providerId = provider.getProviderId();\r
-            m_topicList = new NSTopicsList();\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
-                    getTopicList()->addTopic(it->getTopicName(), it->getState());\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
@@ -74,15 +77,16 @@ namespace OIC
         NSProvider &NSProvider::operator=(const NSProvider &provider)\r
         {\r
             this->m_providerId = provider.getProviderId();\r
-            this->m_topicList = new NSTopicsList();\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->getTopicList()->addTopic(it->getTopicName(), it->getState());\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
@@ -90,28 +94,34 @@ namespace OIC
             return *this;\r
         }\r
 \r
-        NSProvider::~NSProvider()\r
-        {\r
-            if (m_topicList != nullptr)\r
-            {\r
-                delete m_topicList;\r
-            }\r
-        }\r
-\r
         std::string NSProvider::getProviderId() const\r
         {\r
             return m_providerId;\r
         }\r
 \r
-        NSTopicsList *NSProvider::getTopicList() const\r
+        std::shared_ptr<NSTopicsList> NSProvider::getTopicList() const  throw (NSException)\r
         {\r
             NS_LOG(DEBUG, "getTopicList - IN");\r
-            return m_topicList;\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(NSTopicsList *topicList)\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
@@ -127,8 +137,8 @@ namespace OIC
                     return NSResult::ERROR;\r
                 }\r
                 topic->topicName = NULL;\r
-                topic->topicName = OICStrdup(it->getTopicName().c_str());\r
-                topic->state = (::NSTopicState)it->getState();\r
+                topic->topicName = OICStrdup(it.getTopicName().c_str());\r
+                topic->state = (::NSTopicState)it.getState();\r
                 topic->next = NULL;\r
                 if (topicLL == NULL)\r
                 {\r
@@ -157,7 +167,7 @@ namespace OIC
                     iter = iter->next;\r
                 }\r
             }\r
-            NS_LOG_V(DEBUG, "calling Lower layer UpdateTopicList for Provider Id : %s",\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
@@ -185,25 +195,54 @@ namespace OIC
         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\r
+        NSProviderSubscribedState NSProvider::getProviderSubscribedState() const  throw (NSException)\r
         {\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::subscribe()\r
+        NSResult NSProvider::subscribe()  throw (NSException)\r
         {\r
             NS_LOG(DEBUG, "Subscribe - IN");\r
-            NSSubscribe(getProviderId().c_str());\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
-        bool NSProvider::isSubscribed()\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
@@ -212,12 +251,17 @@ namespace OIC
             return false;\r
         }\r
 \r
-        void NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\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::ProviderStateCallback stateHandle,\r
@@ -246,12 +290,8 @@ namespace OIC
             return m_syncInfoCb;\r
         }\r
 \r
-        void NSProvider::setTopicList(NSTopicsList *topicsList)\r
+        void NSProvider::setTopicList(std::shared_ptr<NSTopicsList> topicsList)\r
         {\r
-            if (m_topicList != nullptr)\r
-            {\r
-                delete m_topicList;\r
-            }\r
             m_topicList = topicsList;\r
         }\r
 \r
@@ -264,5 +304,15 @@ namespace OIC
         {\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