[IOT-1430] bug fix for seg fault on start consumer.
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / examples / linux / notificationserviceconsumer.cpp
index b804a59..e005bcf 100755 (executable)
@@ -24,6 +24,7 @@
 #include "NSConsumerService.h"\r
 #include "NSMessage.h"\r
 #include "NSProvider.h"\r
+#include "NSTopicsList.h"\r
 #include "ocstack.h"\r
 \r
 #define TAG "NotiConsumerWrapperExample"\r
@@ -32,6 +33,13 @@ using namespace OIC::Service;
 \r
 bool isExit = false;\r
 std::string REMOTE_SERVER_ADDRESS;\r
+std::string mainProvider;\r
+\r
+FILE* server_fopen(const char *path, const char *mode)\r
+{\r
+    (void)path;\r
+    return fopen("oic_ns_provider_db.dat", mode);\r
+}\r
 \r
 void onNotificationPostedCb(OIC::Service::NSMessage *notification)\r
 {\r
@@ -39,6 +47,14 @@ void onNotificationPostedCb(OIC::Service::NSMessage *notification)
     std::cout << "title : " << notification->getTitle() << std::endl;\r
     std::cout << "content : " <<  notification->getContentText() << std::endl;\r
     std::cout << "source : " <<  notification->getSourceName() << std::endl;\r
+    std::cout << "topic : " <<  notification->getTopic() << std::endl;\r
+\r
+    auto provider = NSConsumerService::getInstance()->getProvider(notification->getProviderId());\r
+    if (provider != nullptr)\r
+    {\r
+        provider->sendSyncInfo(notification->getMessageId(),\r
+                               OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
+    }\r
 }\r
 \r
 void onNotificationSyncCb(OIC::Service::NSSyncInfo *sync)\r
@@ -47,18 +63,53 @@ void onNotificationSyncCb(OIC::Service::NSSyncInfo *sync)
     std::cout << "Sync STATE : " << (int) sync->getState() << std::endl;\r
 }\r
 \r
-void onDiscoverNotificationCb(OIC::Service::NSProvider *provider)\r
+void onProviderStateChangedCb(OIC::Service::NSProviderState state)\r
 {\r
-    std::cout << "notification resource discovered" << std::endl;\r
-    provider->subscribe();\r
-    std::cout << "startSubscribing" << std::endl;\r
+    std::cout << "onProviderStateChangedCb" << std::endl;\r
+    if (state == OIC::Service::NSProviderState::ALLOW)\r
+    {\r
+        std::cout << "Provider Subscription Accepted" << std::endl;\r
+    }\r
+    else if (state == OIC::Service::NSProviderState::DENY)\r
+    {\r
+        std::cout << "Provider Subscription Denied" << std::endl;\r
+    }\r
+    else if (state == OIC::Service::NSProviderState::TOPIC)\r
+    {\r
+        OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
+        if (provider != nullptr)\r
+        {\r
+            auto topicList = provider->getTopicList();\r
+            if (topicList != nullptr)\r
+            {\r
+                for (auto it : topicList->getTopicsList())\r
+                {\r
+                    std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
+                    std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
+                }\r
+            }\r
+        }\r
+    }\r
+    else if (state == OIC::Service::NSProviderState::STOPPED)\r
+    {\r
+        std::cout << "Provider Stopped" << std::endl;\r
+    }\r
 }\r
 \r
-void onSubscriptionAcceptedCb(OIC::Service::NSProvider *provider)\r
+void onDiscoverNotificationCb(OIC::Service::NSProvider *provider)\r
 {\r
-    std::cout << "Subscription accepted" << std::endl;\r
-    std::cout << "subscribed provider Id : " << provider->getProviderId() << std::endl;\r
-    provider->setListener(onNotificationPostedCb, onNotificationSyncCb);\r
+    std::cout << "notification resource discovered" << std::endl;\r
+    std::cout << "SetListeners for callbacks" << std::endl;\r
+    provider->setListener(onProviderStateChangedCb, onNotificationPostedCb, onNotificationSyncCb);\r
+    if (!provider->isSubscribed())\r
+    {\r
+        std::cout << "startSubscribing" << std::endl;\r
+        provider->subscribe();\r
+    }\r
+    if (mainProvider.empty())\r
+    {\r
+        mainProvider = provider->getProviderId();\r
+    }\r
 }\r
 \r
 void *OCProcessThread(void *ptr)\r
@@ -80,30 +131,35 @@ void *OCProcessThread(void *ptr)
 \r
 int main(void)\r
 {\r
-    pthread_t OCThread;\r
+    pthread_t OCThread = NULL;\r
 \r
     std::cout << "start Iotivity" << std::endl;\r
-    if (OCInit1(OC_CLIENT, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)\r
+\r
+    // open oic_db\r
+    static OCPersistentStorage ps = {server_fopen, fread, fwrite, fclose, unlink};\r
+    OCRegisterPersistentStorageHandler(&ps);\r
+\r
+    if (OCInit1(OC_CLIENT_SERVER, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)\r
     {\r
         std::cout << "OCInit fail" << std::endl;\r
         return 0;\r
     }\r
 \r
-    NSConsumerService::ConsumerConfig cfg;\r
-    cfg.m_discoverCb = onDiscoverNotificationCb;\r
-    cfg.m_acceptedCb = onSubscriptionAcceptedCb;\r
-\r
     pthread_create(&OCThread, NULL, OCProcessThread, NULL);\r
 \r
     std::cout << "Start notification consumer service" << std::endl;\r
     while (!isExit)\r
     {\r
-        int num;\r
+        int num = 0;\r
 \r
         std::cout << "1. Start Consumer" << std::endl;\r
         std::cout << "2. Stop Consumer" << std::endl;\r
-        std::cout << "3. Enable  NS Consumer RemoteService" << std::endl;\r
-        std::cout << "5. Exit" << std::endl;\r
+        std::cout << "3. GetTopicList" << std::endl;\r
+        std::cout << "4. UpdateTopicList" << std::endl;\r
+#ifdef WITH_CLOUD\r
+        std::cout << "5. Enable  NS Consumer RemoteService" << std::endl;\r
+#endif\r
+        std::cout << "6. Exit" << std::endl;\r
 \r
         std::cout << "Input: " << std::endl;\r
         std::cin >> num;\r
@@ -111,22 +167,57 @@ int main(void)
         {\r
             case 1:\r
                 std::cout << "1. Start the Notification Consumer" << std::endl;\r
-                NSConsumerService::getInstance()->Start(cfg);\r
+                NSConsumerService::getInstance()->start(onDiscoverNotificationCb);\r
                 break;\r
             case 2:\r
                 std::cout << "2. Stop the Notification Consumer" << std::endl;\r
-                NSConsumerService::getInstance()->Stop();\r
+                NSConsumerService::getInstance()->stop();\r
                 break;\r
             case 3:\r
                 {\r
-                    std::cout << "3. Enable NS Consumer RemoteService" << std::endl;\r
+                    std::cout <<  "GetTopicList" << std::endl;\r
+                    OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
+                    if (provider != nullptr)\r
+                    {\r
+                        auto topicList = provider->getTopicList();\r
+                        if (topicList != nullptr)\r
+                        {\r
+                            for (auto it : topicList->getTopicsList())\r
+                            {\r
+                                std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
+                                std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+                break;\r
+            case 4:\r
+                {\r
+                    std::cout <<  "UpdateTopicList" << std::endl;\r
+                    OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
+                    if (provider != nullptr)\r
+                    {\r
+                        NSTopicsList *topicList = new NSTopicsList();\r
+                        topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::SUBSCRIBED);\r
+                        topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::SUBSCRIBED);\r
+                        topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);\r
+\r
+                        provider->updateTopicList(topicList);\r
+                    }\r
+                }\r
+                break;\r
+#ifdef WITH_CLOUD\r
+            case 5:\r
+                {\r
+                    std::cout << "5. Enable NS Consumer RemoteService" << std::endl;\r
                     std::cout << "Input the Server Address :";\r
                     std::cin >> REMOTE_SERVER_ADDRESS;\r
-                    NSConsumerService::getInstance()->EnableRemoteService(REMOTE_SERVER_ADDRESS);\r
+                    NSConsumerService::getInstance()->enableRemoteService(REMOTE_SERVER_ADDRESS);\r
                     break;\r
                 }\r
-            case 5:\r
-                std::cout << "5. Exit" << std::endl;\r
+#endif\r
+            case 6:\r
+                std::cout << "6. Exit" << std::endl;\r
                 isExit = true;\r
                 break;\r
             default:\r