modify resouce-encapsulation sample server and client
[platform/upstream/iotivity.git] / service / resource-encapsulation / examples / linux / SampleResourceServer.cpp
index e1c07b1..b1c67cf 100644 (file)
  ******************************************************************/
 
 #include "PrimitiveResource.h"
-#include "ResourceObject.h"
+#include "RCSResourceObject.h"
 #include "OCPlatform.h"
 #include "OCApi.h"
 
-using namespace std;
 using namespace OC;
 using namespace OC::OCPlatform;
 using namespace OIC::Service;
 
+constexpr int DEFALUT_VALUE = 0;
+
+constexpr int REQUEST_TEMP = 1;
+constexpr int REQUEST_LIGHT = 2;
+
+constexpr int PRESENCE_ON = 1;
+constexpr int PRESENCE_OFF = 2;
+
+constexpr int DEFALUT_SERVER = 1;
+constexpr int CUSTOM_SERVER = 2;
+constexpr int STOP = 3;
+
+constexpr int INCREASE_TEMPERATURE = 1;
+constexpr int DECREASE_TEMPERATURE = 2;
+constexpr int STOP_TEMPERATURE_SENSOR = 3;
+constexpr int STOP_LIGHT_SENSOR = 1;
+
+constexpr int CORRECT_INPUT = 1;
+constexpr int INCORRECT_INPUT = 2;
+constexpr int QUIT = 3;
+
+
 std::string resourceUri = "/a/TempSensor";
 std::string resourceType = "core.TemperatureSensor";
 std::string resourceInterface = "oic.if.";
 std::string attributeKey = "Temperature";
-ResourceObject::Ptr server;
+int isPresenceOn = PRESENCE_ON;
+
+RCSResourceObject::Ptr server;
+
+int processUserInput();
+
+enum class Control{
+    INCREASE,
+    DECREASE
+};
 
-//display the menu on the screen
 void displayMenu()
 {
-    std::cout << "=====================================================================\n\n";
+    std::cout << "====================================================================="
+              << std::endl;
     std::cout << "   1 - Creation of Resource [Auto control for requests]" << std::endl;
-    std::cout << "   2 - Creation of Resource [Developer control for Get and Set requests]" <<std::endl;
+    std::cout << "   2 - Creation of Resource [Developer control for Get and Set requests]"
+              << std::endl;
     std::cout << "   3 - Quit" << std::endl;
-    std::cout << "=====================================================================\n\n";
+    std::cout << "====================================================================="
+              << std::endl;
 }
 
-//hander for get request (if developer choose second option for resource Creation)
-RCSGetResponse RequestHandlerForGet(const RCSRequest &request,
-        ResourceAttributes &attrs)
-{
-    cout << "Recieved a Get request from Client" << std::endl;
-    ResourceObject::LockGuard lock(*server);
-    ResourceAttributes attr = server->getAttributes();
-    ResourceAttributes::const_iterator iter = attr.begin();
-    cout << "\nSending response to Client : " << std::endl;
-    for (unsigned int i = 0; i < attr.size(); ++i)
+void displayControlTemperatureMenu()
+{
+    std::cout << "========================================================" << std::endl;
+    std::cout << "1. Increase Temperature by 10 degree" << std::endl;
+    std::cout << "2. Decrease Temperature by 10 degree" << std::endl;
+    std::cout << "3. Stop the Sensor" << std::endl;
+    std::cout << "========================================================" << std::endl;
+}
+
+void displayControlLightMenu()
+{
+    std::cout << "========================================================" << std::endl;
+    std::cout << "1. Stop the Sensor" << std::endl;
+    std::cout << "========================================================" << std::endl;
+}
+
+void printAttribute(const RCSResourceAttributes& attrs)
+{
+    for(const auto& attr : attrs)
     {
-        std::cout << "\tkey : " << iter->key() << "\n\tvalue : " << iter->value().toString() << std::endl;
-        ++iter;
+        std::cout << "\tkey : " << attr.key() << "\n\tvalue : "
+                  << attr.value().toString() << std::endl;
     }
-    return RCSGetResponse::create(attr);
+}
+
+//hander for get request (if developer choose second option for resource Creation)
+RCSGetResponse requestHandlerForGet(const RCSRequest& request,
+        RCSResourceAttributes& attrs)
+{
+    std::cout << "Recieved a Get request from Client" << std::endl;
+    RCSResourceObject::LockGuard lock(*server);
+    RCSResourceAttributes attributes = server->getAttributes();
+
+    std::cout << "\nSending response to Client : " << std::endl;
+    printAttribute(attributes);
+
+    return RCSGetResponse::defaultAction();
 }
 
 //hander for set request (if developer choose second option for resource Creation)
-RCSSetResponse RequestHandlerForSet(const RCSRequest &request,
-        ResourceAttributes &attrs)
+RCSSetResponse requestHandlerForSet(const RCSRequest& request,
+        RCSResourceAttributes& attrs)
+{
+    std::cout << "Recieved a Set request from Client" << std::endl;
+
+    std::cout << "\n\nSending response to Client : " << std::endl;
+    RCSResourceObject::LockGuard lock(*server);
+    printAttribute(attrs);
+    return RCSSetResponse::defaultAction();
+}
+
+void createResource()
+{
+    server = RCSResourceObject::Builder(resourceUri, resourceType,resourceInterface).
+            setDiscoverable(true).setObservable(true).build();
+}
+
+void initServer()
 {
-    cout << "Recieved a Set request from Client" << std::endl;
-    ResourceAttributes::const_iterator iter = attrs.begin();
-    for (unsigned int i = 0; i < attrs.size(); ++i)
+    std::cout << "========================================================" << std::endl;
+    std::cout << "Select Resource Type" << std::endl;
+    std::cout << "1. Temperature" << std::endl;
+    std::cout << "2. Light" << std::endl;
+    std::cout << "========================================================" << std::endl;
+
+    switch(processUserInput())
     {
-        std::cout << "\tkey : " << iter->key() << "\n\tvalue : " << iter->value().toString() << std::endl;
-        ++iter;
+    case REQUEST_TEMP:
+        resourceUri = "/a/TempSensor";
+        resourceType = "core.TemperatureSensor";
+        break;
+    case REQUEST_LIGHT:
+        resourceUri = "/a/light";
+        resourceType = "core.light";
+        break;
+    default :
+        std::cout << "Invalid input, please try again" << std::endl;
+        return;
     }
-    iter = attrs.begin();
-    cout << "\n\nSending response to Client : " << std::endl;
-    for (unsigned int i = 0; i < attrs.size(); ++i)
+
+    try
     {
-        std::cout << "\tkey : " << iter->key() << "\n\tvalue : " << iter->value().toString() << std::endl;
-        ++iter;
+        createResource();
     }
-    return RCSSetResponse::create(attrs);
+    catch (const PlatformException& e)
+    {
+        std::cout << "Exception in initServer : " << e.what() << std::endl;
+    }
+
+    server->setAutoNotifyPolicy(RCSResourceObject::AutoNotifyPolicy::UPDATED);
+    server->setSetRequestHandlerPolicy(RCSResourceObject::SetRequestHandlerPolicy::NEVER);
+    server->setAttribute(attributeKey, DEFALUT_VALUE);
 }
 
-int main(void)
+void changeTemperature(Control control)
 {
+    RCSResourceObject::LockGuard lock(server);
+    if(Control::INCREASE == control)
+    {
+        server->getAttributes()[attributeKey] =
+                server->getAttribute<int>(attributeKey) + 10;
+        std::cout << "\nTemperature increased by 10 degree" << std::endl;
+    }
+    else if(Control::DECREASE == control)
+    {
+        server->getAttributes()[attributeKey] =
+                        server->getAttribute<int>(attributeKey) - 10;
+        std::cout << "\nTemperature Decreased by 10 degree" << std::endl;
+    }
+    std::cout << "\nCurrent Temperature : "
+            << server->getAttributeValue(attributeKey).get<int>() << std::endl;
+}
 
+int processUserInput()
+{
     int userInput;
-    int initialTemperature = 0;
-    int temperatureInput;
-    bool flag = true;
-    startPresence(3);
-
-    displayMenu();
-
-    //userInput for creation of Resource
     std::cin >> userInput;
-    std::cin.clear();
-    std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
-    try
+    if (std::cin.fail())
     {
-        while (flag)
-        {
+        std::cin.clear();
+        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+        return -1;
+    }
+    return userInput;
+}
 
-            switch (userInput)
-            {
-
-                case 1:
-               //Creation of Resource & Auto control for all requests from Client
-                    {
-                        //creation of Resource
-                        server = ResourceObject::Builder(resourceUri, resourceType,
-                                                         resourceInterface).setDiscoverable(true).setObservable(false).build();
-                        std::cout << "Resource created successfully " << std::endl;
-
-                        //setting attribute for the Created Resource
-                        server->setAttribute(attributeKey, initialTemperature);
-                        flag = false;
-                        break;
-                    }
-
-                case 2:
-            //Creation of Resource & setting get and set handler for handling get and set request from client in application
-                    {
-                        server = ResourceObject::Builder(resourceUri, resourceType,
-                                                         resourceInterface).setDiscoverable(true).setObservable(false).build();
-                        std::cout << "Resource created successfully " << std::endl;
-
-                        //setting attribute for the Created Resource
-                        server->setAttribute(attributeKey, initialTemperature);
-
-                        //setting handler for handling get request from the client
-                        server->setGetRequestHandler(RequestHandlerForGet);
-
-                        //  setting handler for handling set request from the client
-                        server->setSetRequestHandler(RequestHandlerForSet);
-                        flag = false;
-                        break;
-                    }
-                case 3:
-                    return 0;
-                default :
-                    std::cout << "Invalid Input" << std::endl;
-                    break;
-            }
-        }
+int selectPresenceMenu()
+{
+    std::cout << "========================================================" << std::endl;
+    std::cout << "1. Presence On" << std::endl;
+    std::cout << "2. Presence Off" << std::endl;
+    std::cout << "========================================================" << std::endl;
 
-        while (true)
+    switch(processUserInput())
         {
-            bool end = false;
-            cout << endl;
-            cout << "========================================================" << endl;
-            cout << "1. Increase Temperature by 10 degree" << endl;
-            cout << "2. Decrease Temperature by 10 degree" << endl;
-            cout << "3. Stop the Sensor" << endl;
-            cout << "========================================================" << endl;
-
-            //user Input for increasing/decreasing the temperature
-            cin >> temperatureInput;
-            if (std::cin.fail())
-            {
-                std::cin.clear();
-                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
-                std::cout << "Invalid input type, please try again" << std::endl;
-                continue;
-            }
-
-            switch (temperatureInput)
-            {
-                case 1:
-                    {
-                        ResourceObject::LockGuard lock(*server);
-                        ResourceAttributes attrs = server->getAttributes();
-
-                        attrs[attributeKey] =  (server->getAttribute<int>(attributeKey)  + 10);
-                        server->setAttribute(attributeKey, attrs[attributeKey]);
-                        cout << "\nTemperature increased by 10 degree" << endl;
-
-                        //getting the current attribute and priniting it on the console
-                        attrs = server->getAttributes();
-                        cout << "\nCurrent Temperature : ";
-                        ResourceAttributes::const_iterator iter = attrs.begin();
-                        for (unsigned int i = 0; i < attrs.size(); ++i)
-                        {
-                            std::cout << iter->value().toString() << std::endl;
-                            ++iter;
-                        }
-                        break;
-                    }
-                case 2:
-                    {
-                        ResourceObject::LockGuard lock(*server);
-                        ResourceAttributes attrs = server->getAttributes();
-                        attrs[attributeKey] =  (server->getAttribute<int>(attributeKey)  - 10);
-                        server->setAttribute(attributeKey, attrs[attributeKey]);
-                        cout << "\nTemperature decreased by 10 degree" << endl;
-
-                        //getting the current attribute and priniting it on the console
-                        attrs = server->getAttributes();
-                        cout << "\nCurrent Temperature : ";
-                        ResourceAttributes::const_iterator iter = attrs.begin();
-                        for (unsigned int i = 0; i < attrs.size(); ++i)
-                        {
-                            std::cout << iter->value().toString() << std::endl;
-                            ++iter;
-                        }
-                        break;
-                    }
-                case 3:
-                    {
-                        cout << "Stopping the Resource" << endl;
-                        end = true;
-                        break;
-                    }
-                default:
-                    {
-                        cout << "Invalid input. Please try again." << endl;
-                        break;
-                    }
-            }
-            if (end == true)
-            {
-                break;
-            }
+        case PRESENCE_ON:
+            isPresenceOn = PRESENCE_ON;
+            startPresence(3);
+            return CORRECT_INPUT;
+        case PRESENCE_OFF:
+            isPresenceOn = PRESENCE_OFF;
+            return CORRECT_INPUT;
+        default :
+            std::cout << "Invalid input, please try again" << std::endl;
+            return INCORRECT_INPUT;
         }
+}
+int selectServerMenu()
+{
+    switch (processUserInput())
+    {
+        case DEFALUT_SERVER: // Creation of Resource & Auto control for all requests from Client.
+            initServer();
+            return CORRECT_INPUT;
+
+        case CUSTOM_SERVER:
+            // Creation of Resource & setting get and set handler for handling get and
+            // set request from client in application.
+            initServer();
+
+            server->setGetRequestHandler(requestHandlerForGet);
+            server->setSetRequestHandler(requestHandlerForSet);
+            return CORRECT_INPUT;
+        case STOP :
+            return QUIT;
+
+        default :
+            std::cout << "Invalid input, please try again" << std::endl;
+            return INCORRECT_INPUT;
+    }
+}
+
+int selectControlTemperatureMenu()
+{
+   switch (processUserInput())
+   {
+       case INCREASE_TEMPERATURE:
+           changeTemperature(Control::INCREASE);
+           return CORRECT_INPUT;
+
+       case DECREASE_TEMPERATURE:
+           changeTemperature(Control::DECREASE);
+           return CORRECT_INPUT;
+
+       case STOP_TEMPERATURE_SENSOR:
+           return QUIT;
+
+       default:
+           std::cout << "Invalid input. Please try again." << std::endl;
+           return INCORRECT_INPUT;
+   }
+}
+
+int selectControlLightMenu()
+{
+   switch (processUserInput())
+   {
+       case STOP_LIGHT_SENSOR:
+           return QUIT;
+
+       default:
+           std::cout << "Invalid input. Please try again." << std::endl;
+           return INCORRECT_INPUT;
+   }
+}
+
+void process()
+{
+    while(true)
+    {
+        int ret = selectPresenceMenu();
+        if(ret == CORRECT_INPUT) break;
     }
-    catch (exception &e)
+
+    while(true)
     {
-        cout << "main exception  : " << e.what() << endl;
+        displayMenu();
+        int ret = selectServerMenu();
+
+        if(ret == QUIT) return;
+        if(ret == CORRECT_INPUT) break;
+    }
+
+    while(true)
+    {
+        if(resourceType == "core.TemperatureSensor")
+        {
+            displayControlTemperatureMenu();
+            if (selectControlTemperatureMenu() == QUIT) return;
+        }
+        else if(resourceType == "core.light")
+        {
+            displayControlLightMenu();
+            if (selectControlLightMenu() == QUIT) return;
+        }
     }
 }
 
+int main(void)
+{
+    try
+    {
+        process();
+        server = NULL;
+    }
+    catch (const std::exception& e)
+    {
+        std::cout << "main exception  : " << e.what() << std::endl;
+    }
 
+    if(isPresenceOn == PRESENCE_ON)
+    {
+        stopPresence();
+    }
+    std::cout << "Stopping the Server" << std::endl;
+}