[IOT-1808]Changes in C++ APIs to remove TopicList raw pointers.
authorabitha.s <abitha.s@samsung.com>
Wed, 8 Feb 2017 09:16:32 +0000 (14:46 +0530)
committerUze Choi <uzchoi@samsung.com>
Thu, 16 Feb 2017 05:07:27 +0000 (05:07 +0000)
1. Changes in NSProvider APIs for get and set TopicsList to shared pointers.
2. Changes in NSConsumer API for get ConsumerTopicList to shared pointer
3. Changes in NSProviderService API to get RegisteredTopicsList to shared pointer.
4. changes to return as object of list of Topics in TopicsList

Patch 2 : rebased

patch 3 : added shared_ptr changes to setTopicList as per review

patch 4 : added modifiability feature for preventing TopicsList modification
patch 5 : added unsetModifiability to only preven modification
patch 6 : rebased

Change-Id: I3aacef4f3a5809623add69a16fd2ad9f93d11dd9
Signed-off-by: abitha.s <abitha.s@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/17113
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
15 files changed:
service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp
service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp
service/notification/cpp-wrapper/common/NSTopicsList.cpp
service/notification/cpp-wrapper/common/NSTopicsList.h
service/notification/cpp-wrapper/consumer/inc/NSProvider.h
service/notification/cpp-wrapper/consumer/src/NSConsumerService.cpp
service/notification/cpp-wrapper/consumer/src/NSProvider.cpp
service/notification/cpp-wrapper/examples/linux/notificationserviceconsumer.cpp
service/notification/cpp-wrapper/examples/linux/notificationserviceprovider.cpp
service/notification/cpp-wrapper/provider/inc/NSConsumer.h
service/notification/cpp-wrapper/provider/inc/NSProviderService.h
service/notification/cpp-wrapper/provider/src/NSConsumer.cpp
service/notification/cpp-wrapper/provider/src/NSProviderService.cpp
service/notification/cpp-wrapper/unittest/NSConsumerServiceTest.cpp
service/notification/cpp-wrapper/unittest/NSProviderServiceTest.cpp

index fe22c8b..cfe8c20 100755 (executable)
@@ -200,7 +200,7 @@ jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsSta
     return topicState;\r
 }\r
 \r
-jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)\r
+jobject getJavaTopicsList(JNIEnv *env, std::shared_ptr<OIC::Service::NSTopicsList> topicList)\r
 {\r
     NS_LOGD ("ConsumerService_getJavaTopicsList - IN");\r
     jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));\r
@@ -230,8 +230,8 @@ jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)
     }\r
     for (auto it : topicList->getTopicsList())\r
     {\r
-        jobject jState = getJavaTopicState(env, it->getState());\r
-        std::string topicName = it->getTopicName();\r
+        jobject jState = getJavaTopicState(env, it.getState());\r
+        std::string topicName = it.getTopicName();\r
         jstring jTopicName = env->NewStringUTF(topicName.c_str());\r
         env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);\r
     }\r
@@ -303,7 +303,7 @@ const char *getNativeTopicName(JNIEnv *env,  jobject jTopic)
 \r
 }\r
 \r
-OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList)\r
+std::shared_ptr<OIC::Service::NSTopicsList> getNativeTopicsList(JNIEnv *env, jobject jTopicList)\r
 {\r
     NS_LOGD ("ConsumerService_getNativeTopicsList - IN");\r
 \r
@@ -344,28 +344,25 @@ OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList)
         NS_LOGE ("Error: MethodId for Vector get  not found");\r
         return nullptr;\r
     }\r
-    OIC::Service::NSTopicsList *nsTopicList = new OIC::Service::NSTopicsList();\r
+    std::shared_ptr<OIC::Service::NSTopicsList> nsTopicList = std::make_shared<OIC::Service::NSTopicsList>();\r
     for (int index = 0; index < size; index++)\r
     {\r
         jobject topicObj = env->CallObjectMethod(jobj, getMethod, index);\r
         if (topicObj == NULL)\r
         {\r
             NS_LOGE ("Error: object of field  Topic  is null");\r
-            delete nsTopicList;\r
             return nullptr;\r
         }\r
         const char *name =  getNativeTopicName(env, topicObj);\r
         if (name == nullptr)\r
         {\r
             NS_LOGE ("Error: Couldn't find topic Name");\r
-            delete nsTopicList;\r
             return nullptr;\r
         }\r
         std::string topicName(name);\r
         OIC::Service::NSTopic::NSTopicState state = OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
         if (!getNativeTopicState(env, topicObj, state))\r
         {\r
-            delete nsTopicList;\r
             return nullptr;\r
         }\r
         nsTopicList->addTopic(topicName, state);\r
@@ -1347,7 +1344,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeG
         return NULL;\r
     }\r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
-    OIC::Service::NSTopicsList *topicList = nullptr;\r
+    std::shared_ptr<OIC::Service::NSTopicsList> topicList = nullptr;\r
     if (jProvider)\r
     {\r
         NS_LOGD ("calling subscribe on mNativeHandle");\r
@@ -1387,7 +1384,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUpda
         ThrowNSException(JNI_INVALID_VALUE, "TopicList cannot be null");\r
         return;\r
     }\r
-    OIC::Service::NSTopicsList *nsTopicsList = getNativeTopicsList(env, jTopicsList);\r
+    std::shared_ptr<OIC::Service::NSTopicsList> nsTopicsList = getNativeTopicsList(env, jTopicsList);\r
     if (nsTopicsList == nullptr)\r
     {\r
         ThrowNSException(JNI_INVALID_VALUE, "NSTopicList cannot be created ");\r
index 64771ab..d16c2a6 100755 (executable)
@@ -608,7 +608,7 @@ jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsSta
     return topicState;
 }
 
-jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)
+jobject getJavaTopicsList(JNIEnv *env, std::shared_ptr<OIC::Service::NSTopicsList> topicList)
 {
     NS_LOGD ("JNIProviderService: getJavaTopicsList - IN");
     jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));
@@ -638,8 +638,8 @@ jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)
     }
     for (auto it : topicList->getTopicsList())
     {
-        jobject jState = getJavaTopicState(env, it->getState());
-        std::string topicName = it->getTopicName();
+        jobject jState = getJavaTopicState(env, it.getState());
+        std::string topicName = it.getTopicName();
         jstring jTopicName = env->NewStringUTF(topicName.c_str());
         env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);
     }
@@ -1151,7 +1151,7 @@ Java_org_iotivity_service_ns_provider_ProviderService_nativeGetRegisteredTopicLi
 {
     NS_LOGD ("JNIProviderService: nativeGetRegisteredTopicList - IN");
 
-    OIC::Service::NSTopicsList *topicList  =
+    std::shared_ptr<OIC::Service::NSTopicsList> topicList  =
         OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
     if (topicList == nullptr)
     {
@@ -1160,7 +1160,6 @@ Java_org_iotivity_service_ns_provider_ProviderService_nativeGetRegisteredTopicLi
     }
 
     jobject obj_topicList = getJavaTopicsList(env, topicList);
-    delete topicList;
 
     NS_LOGD ("JNIProviderService: nativeGetRegisteredTopicList - OUT");
     return obj_topicList;
@@ -1281,14 +1280,13 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeG
         return NULL;
     }
     env->ReleaseStringUTFChars(jConsumerId, id);
-    OIC::Service::NSTopicsList *topicList  = nsConsumer->getConsumerTopicList();
+    std::shared_ptr<OIC::Service::NSTopicsList> topicList  = nsConsumer->getConsumerTopicList();
     if (topicList == nullptr)
     {
         ThrowNSException(JNI_NO_NATIVE_POINTER, "Topic List doesn't exist");
         return NULL;
     }
     jobject obj_topicList = getJavaTopicsList(env, topicList);
-    delete topicList;
 
     NS_LOGD ("JNIProviderService: nativeGetConsumerTopicList - OUT");
     return obj_topicList;
index 915547b..ff2b0e3 100755 (executable)
@@ -25,14 +25,16 @@ namespace OIC
 {
     namespace Service
     {
-        NSTopicsList::NSTopicsList(::NSTopicLL *topics)
+        NSTopicsList::NSTopicsList(::NSTopicLL *topics, bool modify)
         {
             ::NSTopicLL *topicsNode = nullptr;
             topicsNode = topics;
+            m_modifiable = modify;
 
             while (topicsNode != nullptr)
             {
-                addTopic(topicsNode->topicName, (NSTopic::NSTopicState)topicsNode->state);
+                m_topicsList.push_back(new NSTopic(
+                    topicsNode->topicName, (NSTopic::NSTopicState)topicsNode->state));
                 topicsNode = topicsNode->next;
             }
 
@@ -41,47 +43,74 @@ namespace OIC
         {
             for (auto it : topicsList.getTopicsList())
             {
-                addTopic(it->getTopicName(), it->getState());
+                m_topicsList.push_back(new NSTopic(it.getTopicName(), it.getState()));
             }
+            m_modifiable = false;
         }
 
         NSTopicsList &NSTopicsList::operator=(const NSTopicsList &topicsList)
         {
             for (auto it : topicsList.getTopicsList())
             {
-                this->addTopic(it->getTopicName(), it->getState());
+                this->m_topicsList.push_back(new NSTopic(it.getTopicName(), it.getState()));
             }
             return *this;
+            m_modifiable = false;
         }
 
         NSTopicsList::~NSTopicsList()
         {
-            for (auto it : getTopicsList())
+            for (auto it : m_topicsList)
             {
                 delete it;
             }
-            getTopicsList().clear();
+            m_topicsList.clear();
         }
 
         void NSTopicsList::addTopic(const std::string &topicName, NSTopic::NSTopicState state)
         {
-            m_topicsList.push_back(new NSTopic(topicName, state));
+            if(m_modifiable)
+            {
+                m_topicsList.push_back(new NSTopic(topicName, state));
+            }
+            else
+            {
+                //TODO: add exception code for Invalid operation
+            }
         }
 
         void NSTopicsList::removeTopic(const std::string &topicName)
         {
-            for (auto it : getTopicsList())
+            if(m_modifiable)
             {
-                if (it->getTopicName().compare(topicName) == 0)
+                for (auto it : m_topicsList)
                 {
-                    m_topicsList.remove(it);
+                    if (it->getTopicName().compare(topicName) == 0)
+                    {
+                        m_topicsList.remove(it);
+                    }
                 }
             }
+            else
+            {
+                //TODO: add exception code for Invalid operation
+            }
+        }
+
+        std::list<NSTopic> NSTopicsList::getTopicsList() const
+        {
+            std::list<NSTopic> topicList;
+            for (auto it : m_topicsList)
+            {
+                NSTopic topic(it->getTopicName(), it->getState());
+                topicList.push_back(topic);
+            }
+            return topicList;
         }
 
-        std::list<NSTopic *> NSTopicsList::getTopicsList() const
+        void NSTopicsList::unsetModifiability()
         {
-            return m_topicsList;
+            m_modifiable = false;
         }
     }
 }
index f868bd2..288882c 100755 (executable)
@@ -46,14 +46,14 @@ namespace OIC
                 /**
                      * Constructor of NSTopicsList.
                      */
-                NSTopicsList() = default;
+                NSTopicsList() : m_modifiable(true) { }
 
                 /**
                      * Constructor of NSTopicsList.
                      *
                      * @param topics - pointer to NSTopicLL struct to initialize.
                      */
-                NSTopicsList(::NSTopicLL *topics);
+                NSTopicsList(::NSTopicLL *topics, bool modify);
 
                 /**
                      * Copy Constructor of NSTopicsList.
@@ -95,10 +95,20 @@ namespace OIC
                      *
                      * @return topic as NSTopics Linked list.
                      */
-                std::list<NSTopic *> getTopicsList() const;
+                std::list<NSTopic> getTopicsList() const;
+
+                /**
+                     * This method is for preventing for add/remove Topic from Topicslist.
+                     * Below method restricts the application from illegally modifying Topics when 
+                     * Provider is in Invalid state. By calling the API, the service prevents and protects
+                     * the integrity of TopicsList updation when the associated object is Invalid.
+                     *
+                     */
+                void unsetModifiability();
 
             private:
                 std::list<NSTopic *> m_topicsList;
+                bool m_modifiable;
 
         };
     }
index 170c4f2..10c26e1 100755 (executable)
@@ -69,7 +69,7 @@ namespace OIC
                 /**
                       * Constructor of NSProvider.
                       */
-                NSProvider(): m_topicList(new NSTopicsList()), m_state(NSProviderState::DENY),
+                NSProvider(): m_topicList(std::make_shared<NSTopicsList>()), m_state(NSProviderState::DENY),
                     m_subscribedState(NSProviderSubscribedState::DENY),
                     m_stateCb(NULL), m_messageCb(NULL), m_syncInfoCb(NULL)
                 {
@@ -81,7 +81,7 @@ namespace OIC
                       * @param providerId - providerId of the Notification.
                       */
                 NSProvider(const std::string &providerId) : m_providerId(providerId),
-                    m_topicList(new NSTopicsList()), m_state(NSProviderState::DENY),
+                    m_topicList(std::make_shared<NSTopicsList>()), m_state(NSProviderState::DENY),
                     m_subscribedState(NSProviderSubscribedState::DENY),
                     m_stateCb(NULL), m_messageCb(NULL), m_syncInfoCb(NULL)
                 {
@@ -93,7 +93,7 @@ namespace OIC
                       * @param providerId - providerId of the Notification.
                       * @param topicList - NSTopicsList of interested Topics.
                       */
-                NSProvider(const std::string &providerId, NSTopicsList *topicList) : m_providerId(
+                NSProvider(const std::string &providerId, std::shared_ptr<NSTopicsList> topicList) : m_providerId(
                         providerId), m_topicList(topicList), m_state(NSProviderState::DENY),
                     m_subscribedState(NSProviderSubscribedState::DENY),
                     m_stateCb(NULL), m_messageCb(NULL), m_syncInfoCb(NULL)
@@ -125,7 +125,7 @@ namespace OIC
                 /**
                       * Destructor of NSProvider.
                       */
-                ~NSProvider();
+                ~NSProvider() = default;
 
                 /**
                       * This method is for getting ProviderId from the Notification service provider.
@@ -139,7 +139,7 @@ namespace OIC
                       *
                       * @return NSTopicsList  as pointer.
                       */
-                NSTopicsList *getTopicList() const;
+                std::shared_ptr<NSTopicsList> getTopicList() const;
 
                 /**
                      * Update Topic list that is wanted to be subscribed from provider
@@ -147,7 +147,7 @@ namespace OIC
                      * @param topicList - NSTopicsList of interested Topics.
                      * @return NSResult
                      */
-                NSResult updateTopicList(NSTopicsList *topicList);
+                NSResult updateTopicList(std::shared_ptr<NSTopicsList> topicList);
 
                 /**
                       * This method is for getting ProviderState from the Notification service provider.
@@ -238,7 +238,7 @@ namespace OIC
                       *
                       * @param topicsList  as NSTopicsList pointer.
                       */
-                void setTopicList(NSTopicsList *topicsList);
+                void setTopicList(std::shared_ptr<NSTopicsList> topicsList);
 
                 /**
                      * This method is for setting ProviderState for the Notification service provider.
@@ -260,7 +260,7 @@ namespace OIC
 
             private:
                 std::string m_providerId;
-                NSTopicsList *m_topicList;
+                std::shared_ptr<NSTopicsList> m_topicList;
                 NSProviderState m_state;
                 NSProviderSubscribedState m_subscribedState;
 
index 1aca21e..48debdf 100755 (executable)
@@ -53,7 +53,7 @@ namespace OIC
                 auto discoveredCallback = NSConsumerService::getInstance()->getProviderDiscoveredCb();
                 nsProvider->setProviderState((NSProviderState)state);
                 auto topicLL = NSConsumerGetTopicList(provider->providerId);
-                nsProvider->setTopicList(new NSTopicsList(topicLL));
+                nsProvider->setTopicList(std::make_shared<NSTopicsList>(topicLL, false));
                 NSConsumerService::getInstance()->getAcceptedProviders()->addProvider(nsProvider);
                 if (state == NS_DISCOVERED)
                 {
@@ -120,7 +120,7 @@ namespace OIC
                 else if (state == NS_TOPIC)
                 {
                     auto topicLL = NSConsumerGetTopicList(provider->providerId);
-                    oldProvider->setTopicList(new NSTopicsList(topicLL));
+                    oldProvider->setTopicList(std::make_shared<NSTopicsList>(topicLL, false));
                     if (changeCallback != NULL)
                     {
                         NS_LOG(DEBUG, "initiating the callback for Response : NS_TOPIC");
@@ -147,6 +147,7 @@ namespace OIC
                 else if (state == NS_STOPPED)
                 {
                     oldProvider->setProviderSubscribedState(NSProviderSubscribedState::DENY);
+                    oldProvider->getTopicList()->unsetModifiability();
                     NSConsumerService::getInstance()->getAcceptedProviders()->removeProvider(
                         oldProvider->getProviderId());
                     NS_LOG(DEBUG, "initiating the State callback : NS_STOPPED");
index 5dd53c1..00bb053 100755 (executable)
@@ -47,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
@@ -58,13 +58,13 @@ 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
+                    getTopicList()->addTopic(it.getTopicName(), it.getState());\r
                 }\r
             }\r
             setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
@@ -76,13 +76,13 @@ 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->getTopicList()->addTopic(it.getTopicName(), it.getState());\r
                 }\r
             }\r
             this->setListener(provider.getProviderStateReceivedCb(), provider.getMessageReceivedCb(),\r
@@ -92,35 +92,28 @@ 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\r
         {\r
             NS_LOG(DEBUG, "getTopicList - IN");\r
             if (!isValid())\r
             {\r
                 return nullptr;\r
             }\r
-            NSTopicsList *topicList = new NSTopicsList();\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
+                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)\r
         {\r
             NS_LOG(DEBUG, "updateTopicList - IN");\r
             if (!isValid())\r
@@ -142,8 +135,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
@@ -295,12 +288,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
index 2276a7c..cb7675c 100755 (executable)
@@ -117,8 +117,8 @@ void onProviderStateChangedCb(OIC::Service::NSProviderState state)
             {
                 for (auto it : topicList->getTopicsList())
                 {
-                    std::cout << "Topic Name: " << it->getTopicName() << std::endl;
-                    std::cout << "Topic state: " << (int) it->getState() << std::endl;
+                    std::cout << "Topic Name: " << it.getTopicName() << std::endl;
+                    std::cout << "Topic state: " << (int) it.getState() << std::endl;
                 }
             }
         }
@@ -288,8 +288,8 @@ int main(void)
                         {
                             for (auto it : topicList->getTopicsList())
                             {
-                                std::cout << "Topic Name: " << it->getTopicName() << std::endl;
-                                std::cout << "Topic state: " << (int) it->getState() << std::endl;
+                                std::cout << "Topic Name: " << it.getTopicName() << std::endl;
+                                std::cout << "Topic state: " << (int) it.getState() << std::endl;
                             }
                         }
                     }
@@ -302,13 +302,12 @@ int main(void)
                         NSConsumerService::getInstance()->getProvider(mainProvider);
                     if (provider != nullptr)
                     {
-                        NSTopicsList *topicList = new NSTopicsList();
+                        std::shared_ptr<NSTopicsList> topicList = std::make_shared<NSTopicsList>();
                         topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::SUBSCRIBED);
                         topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::SUBSCRIBED);
                         topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);
 
                         provider->updateTopicList(topicList);
-                        delete topicList;
                     }
                     break;
                 }
index 03dca85..87d33d6 100755 (executable)
@@ -353,10 +353,9 @@ int main()
                             for (auto it : nsTopics->getTopicsList())
                             {
 
-                                std::cout << it->getTopicName() << std::endl;
-                                std::cout << (int) it->getState() << std::endl;
+                                std::cout << it.getTopicName() << std::endl;
+                                std::cout << (int) it.getState() << std::endl;
                             }
-                            delete nsTopics;
                         }
                         std::cout <<  "GetConsumerTopicList completed" << std::endl;
                     }
@@ -370,10 +369,9 @@ int main()
                     for (auto it : nsTopics->getTopicsList())
                     {
 
-                        std::cout << it->getTopicName() << std::endl;
-                        std::cout << (int) it->getState() << std::endl;
+                        std::cout << it.getTopicName() << std::endl;
+                        std::cout << (int) it.getState() << std::endl;
                     }
-                    delete nsTopics;
                     break;
                 }
 #ifdef WITH_CLOUD
index 36506e8..6a3f89d 100755 (executable)
@@ -29,6 +29,7 @@
 \r
 \r
 #include <string>\r
+#include <memory>\r
 #include "NSCommon.h"\r
 #include "NSUtils.h"\r
 #include "NSTopicsList.h"\r
@@ -104,7 +105,7 @@ namespace OIC
                      * Request topic list with selection state for the consumer\r
                      * @return :: Topic list\r
                      */\r
-                NSTopicsList *getConsumerTopicList();\r
+                std::shared_ptr<NSTopicsList> getConsumerTopicList();\r
 \r
             private:\r
                 ::NSConsumer *getNSConsumer();\r
index 86fa446..575ea93 100755 (executable)
@@ -165,7 +165,7 @@ namespace OIC
                      * Request topics list already registered by provider user\r
                      * @return :: Topic list\r
                      */\r
-                NSTopicsList *getRegisteredTopicList();\r
+                std::shared_ptr<NSTopicsList> getRegisteredTopicList();\r
 \r
                 /**\r
                       *  get Provider config values\r
index 86649e3..0d675ab 100755 (executable)
@@ -89,7 +89,7 @@ namespace OIC
             return result;\r
         }\r
 \r
-        NSTopicsList *NSConsumer::getConsumerTopicList()\r
+        std::shared_ptr<NSTopicsList> NSConsumer::getConsumerTopicList()\r
         {\r
             NS_LOG(DEBUG, "getConsumerTopicList - IN");\r
             if (!isValid())\r
@@ -98,7 +98,7 @@ namespace OIC
             }\r
             ::NSTopicLL *topics = NSProviderGetConsumerTopics(getConsumerId().c_str());\r
 \r
-            NSTopicsList *nsTopics = new NSTopicsList(topics);\r
+            std::shared_ptr<NSTopicsList> nsTopics = std::make_shared<NSTopicsList>(topics, false);\r
             NS_LOG(DEBUG, "getConsumerTopicList - OUT");\r
             return nsTopics;\r
         }\r
index e349795..094c4e4 100755 (executable)
@@ -257,12 +257,12 @@ namespace OIC
             return result;\r
         }\r
 \r
-        NSTopicsList *NSProviderService::getRegisteredTopicList()\r
+        std::shared_ptr<NSTopicsList> NSProviderService::getRegisteredTopicList()\r
         {\r
             NS_LOG(DEBUG, "getRegisteredTopicList - IN");\r
             ::NSTopicLL *topics = NSProviderGetTopics();\r
 \r
-            NSTopicsList *nsTopics = new NSTopicsList(topics);\r
+            std::shared_ptr<NSTopicsList> nsTopics = std::make_shared<NSTopicsList>(topics, false);\r
             NS_LOG(DEBUG, "getRegisteredTopicList - OUT");\r
             return nsTopics;\r
         }\r
index 0168227..caa1502 100755 (executable)
@@ -528,12 +528,12 @@ TEST_F(NotificationServiceConsumerTest, ExpectEQTopicList)
 
     ASSERT_NE(nullptr, g_provider) << "error: discovery failure";
 
-    std::list<OIC::Service::NSTopic *>  retTopic = g_provider->getTopicList()->getTopicsList();
+    auto  retTopic = g_provider->getTopicList()->getTopicsList();
     auto it1 = retTopic.begin();
     auto it2 = topics.begin();
     while ( it1 != retTopic.end() || it2 != topics.end() )
     {
-        if ((*it1)->getTopicName() !=  *it2)
+        if ((*it1).getTopicName() !=  *it2)
         {
             isSame = false; break;
         }
@@ -548,12 +548,12 @@ TEST_F(NotificationServiceConsumerTest, ExpectFailUpdateTopicOnConsumer)
 {
     ASSERT_NE(nullptr, g_provider) << "error: discovery failure";
 
-    OIC::Service::NSTopicsList *retTopic = g_provider->getTopicList();
+    auto retTopic = g_provider->getTopicList();
     for (auto it : retTopic->getTopicsList())
     {
-        std::cout << "Topic Name: " << it->getTopicName() << std::endl;
-        std::cout << "state : " << (int) it->getState() << std::endl;
-        it->setState(OIC::Service::NSTopic::NSTopicState::SUBSCRIBED);
+        std::cout << "Topic Name: " << it.getTopicName() << std::endl;
+        std::cout << "state : " << (int) it.getState() << std::endl;
+        it.setState(OIC::Service::NSTopic::NSTopicState::SUBSCRIBED);
     }
     OIC::Service::NSResult ret = g_provider->updateTopicList(retTopic);
     std::cout << "ret : " << (int) ret << std::endl;
index d2a45b6..7b6cd1c 100755 (executable)
@@ -222,7 +222,6 @@ TEST_F(NotificationProviderServiceTest, NeverCallNotifyOnConsumerByAcceptIsFalse
     ASSERT_NE(nullptr, g_consumer) << "error: discovery failure";
 
     g_consumer->acceptSubscription(false);
-
     OIC::Service::NSMessage msg =  OIC::Service::NSProviderService::getInstance()->createMessage();
     msgID = (int)msg.getMessageId();
     msg.setTitle(std::string("Title"));
@@ -334,7 +333,7 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualAddedTopicsAndRegisteredTopic
     std::unique_lock< std::mutex > lock { mutexForCondition };
     responseCon.wait_for(lock, g_waitForResponse);
     bool isSame = false;
-    OIC::Service::NSTopicsList *topicList =
+    auto topicList =
         OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
     if (!topicList)
     {
@@ -347,7 +346,7 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualAddedTopicsAndRegisteredTopic
         int i = 0;
         for (auto itr : topicList->getTopicsList())
         {
-            compString[i] = itr->getTopicName(); i++;
+            compString[i] = itr.getTopicName(); i++;
         }
         std::cout << compString[0] << std::endl;
         std::cout << compString[1] << std::endl;
@@ -360,10 +359,6 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualAddedTopicsAndRegisteredTopic
 
     OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
     OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
-    if (topicList != nullptr)
-    {
-        delete topicList;
-    }
     responseCon.wait_for(lock, g_waitForResponse);
 }
 
@@ -377,7 +372,7 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualUnregisteredTopicsAndRegister
     std::unique_lock< std::mutex > lock { mutexForCondition };
     responseCon.wait_for(lock, g_waitForResponse);
     bool isSame = false;
-    OIC::Service::NSTopicsList *topicList =
+    auto topicList =
         OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
     if (!topicList)
     {
@@ -386,8 +381,9 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualUnregisteredTopicsAndRegister
     }
     else
     {
-        std::list<OIC::Service::NSTopic *>::iterator it = topicList->getTopicsList().begin();
-        std::string compStr = (*it)->getTopicName() ;
+        auto topic = topicList->getTopicsList();
+        auto it = topic.begin();
+        std::string compStr = (*it).getTopicName() ;
         std::cout << compStr << std::endl;
         if (str1.compare(compStr) == 0 )
         {
@@ -397,10 +393,6 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualUnregisteredTopicsAndRegister
     EXPECT_EQ(isSame, true);
 
     OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
-    if (topicList != nullptr)
-    {
-        delete topicList;
-    }
     responseCon.wait_for(lock, g_waitForResponse);
 }
 
@@ -419,7 +411,7 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualSetConsumerTopicsAndGetConsum
     responseCon.wait_for(lock, g_waitForResponse);
 
     bool isSame = false;
-    OIC::Service::NSTopicsList *topicList =  g_consumer->getConsumerTopicList();
+    auto topicList =  g_consumer->getConsumerTopicList();
 
     if (!topicList)
     {
@@ -432,8 +424,8 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualSetConsumerTopicsAndGetConsum
         int i = 0, state[10] = {0};
         for (auto itr : topicList->getTopicsList())
         {
-            compString[i] = itr->getTopicName();
-            state[i++] = (int) itr->getState();
+            compString[i] = itr.getTopicName();
+            state[i++] = (int) itr.getState();
         }
         std::cout << compString[0] << std::endl;
         std::cout << compString[1] << std::endl;
@@ -448,10 +440,6 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualSetConsumerTopicsAndGetConsum
 
     OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
     OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
-    if (topicList != nullptr)
-    {
-        delete topicList;
-    }
     responseCon.wait_for(lock, g_waitForResponse);
 }
 
@@ -472,7 +460,7 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualUnSetConsumerTopicsAndGetCons
     responseCon.wait_for(lock, g_waitForResponse);
 
     bool isSame = false;
-    OIC::Service::NSTopicsList *topicList =  g_consumer->getConsumerTopicList();
+    auto topicList =  g_consumer->getConsumerTopicList();
 
     if (!topicList)
     {
@@ -485,8 +473,8 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualUnSetConsumerTopicsAndGetCons
         int i = 0, state[10] = {0};
         for (auto itr : topicList->getTopicsList())
         {
-            compString[i] = itr->getTopicName();
-            state[i++] = (int) itr->getState();
+            compString[i] = itr.getTopicName();
+            state[i++] = (int) itr.getState();
         }
         std::cout << compString[0] << std::endl;
         std::cout << compString[1] << std::endl;
@@ -501,11 +489,6 @@ TEST_F(NotificationProviderServiceTest, ExpectEqualUnSetConsumerTopicsAndGetCons
 
     OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
     OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
-
-    if (topicList != nullptr)
-    {
-        delete topicList;
-    }
     responseCon.wait_for(lock, g_waitForResponse);
 }