replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / consumer / src / NSProvider.cpp
index 31d7e52..9272cf3 100755 (executable)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\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
@@ -28,19 +35,63 @@ namespace OIC
         ::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
@@ -48,43 +99,220 @@ namespace OIC
             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