IP address plumbing changes to support IPv6
[platform/upstream/iotivity.git] / resource / examples / simpleclientserver.cpp
index 444c4dc..90b7682 100644 (file)
 #include "OCApi.h"
 using namespace OC;
 
+
 class ClientWorker
 {
 private:
-    bool m_isFoo;
-    int m_barCount;
     void putResourceInfo(const HeaderOptions& headerOptions,
             const OCRepresentation rep, const OCRepresentation rep2, const int eCode)
     {
@@ -142,13 +141,20 @@ private:
     }
 
 public:
+    ClientWorker(OCConnectivityType ct):m_connectivityType{ct}
+    {}
+
     void start()
     {
+        std::ostringstream requestURI;
+        requestURI << OC_MULTICAST_DISCOVERY_URI << "?rt=core.foo";
+
         std::cout<<"Starting Client find:"<<std::endl;
         FindCallback f (std::bind(&ClientWorker::foundResource, this, std::placeholders::_1));
         std::cout<<"result:" <<
-            OCPlatform::findResource("", "coap://224.0.1.187/oc/core?rt=core.foo", f)
-            << std::endl;
+        OCPlatform::findResource("", requestURI.str(), CT_DEFAULT, f)
+        << std::endl;
+
         std::cout<<"Finding Resource..."<<std::endl;
 
         {
@@ -161,6 +167,9 @@ private:
     std::mutex m_resourceLock;
     std::condition_variable m_cv;
     std::shared_ptr<OCResource> m_resource;
+    OCConnectivityType m_connectivityType;
+    bool m_isFoo;
+    int m_barCount;
 };
 
 struct FooResource
@@ -186,7 +195,7 @@ struct FooResource
         uint8_t resourceProperty = OC_DISCOVERABLE;
 
         EntityHandler eh(std::bind(&FooResource::entityHandler,
-                    this, std::placeholders::_1, std::placeholders::_2));
+                    this, std::placeholders::_1));
         OCStackResult result = OCPlatform::registerResource(m_resourceHandle,
                 resourceURI, resourceTypeName,
                                     resourceInterface,
@@ -214,14 +223,27 @@ struct FooResource
         rep.getValue("barCount", m_barCount);
     }
 
-    OCEntityHandlerResult entityHandler(std::shared_ptr<OCResourceRequest> request,
-                                        std::shared_ptr<OCResourceResponse> response)
+    OCStackResult sendResponse(std::shared_ptr<OCResourceRequest> pRequest)
+    {
+        auto pResponse = std::make_shared<OC::OCResourceResponse>();
+        pResponse->setRequestHandle(pRequest->getRequestHandle());
+        pResponse->setResourceHandle(pRequest->getResourceHandle());
+        pResponse->setResourceRepresentation(get(), "");
+        pResponse->setErrorCode(200);
+        pResponse->setResponseResult(OC_EH_OK);
+
+        return OCPlatform::sendResponse(pResponse);
+    }
+
+    OCEntityHandlerResult entityHandler(std::shared_ptr<OCResourceRequest> request)
     {
         std::cout<<"\tConsumer Entity Handler:"<<std::endl;
+        OCEntityHandlerResult ehResult = OC_EH_ERROR;
 
         if(request)
         {
-            // Note: Most of the handlers are not here, since this is for demoing client/server co-process existence.
+            // Note: Most of the handlers are not here, since this is for
+            // demoing client/server co-process existence.
             // See simpleserver for a more complete example.
             if(request->getRequestHandlerFlag()  == RequestHandlerFlag::RequestFlag)
             {
@@ -230,11 +252,9 @@ struct FooResource
                 if(request->getRequestType() == "GET")
                 {
                     std::cout<<"\t\t\trequestType : GET"<<std::endl;
-
-                    if(response)
+                    if(OC_STACK_OK == sendResponse(request))
                     {
-                        response->setErrorCode(200);
-                        response->setResourceRepresentation(get(), "");
+                        ehResult = OC_EH_OK;
                     }
                 }
                 else if (request->getRequestType() == "PUT")
@@ -243,27 +263,22 @@ struct FooResource
 
                     OCRepresentation rep = request->getResourceRepresentation();
                     put(rep);
-
-                    if(response)
+                    if(OC_STACK_OK == sendResponse(request))
                     {
-                        response->setErrorCode(200);
-                        response->setResourceRepresentation(get(), "");
+                        ehResult = OC_EH_OK;
                     }
                 }
                 else
                 {
-                    std::cout<<"\t\t\trequestType : UNSUPPORTED: "<<request->getRequestType()<<std::endl;
+                    std::cout<<"\t\t\trequestType : UNSUPPORTED: "<<
+                            request->getRequestType()<<std::endl;
                 }
             }
             else
             {
                 std::cout <<"\t\trequestFlag : UNSUPPORTED: ";
 
-                if(request->getRequestHandlerFlag()==RequestHandlerFlag::InitFlag)
-                {
-                    std::cout<<"InitFlag"<<std::endl;
-                }
-                else if(request->getRequestHandlerFlag()== RequestHandlerFlag::ObserverFlag)
+                if(request->getRequestHandlerFlag()== RequestHandlerFlag::ObserverFlag)
                 {
                     std::cout<<"ObserverFlag"<<std::endl;
                 }
@@ -274,12 +289,50 @@ struct FooResource
             std::cout << "Request Invalid!"<<std::endl;
         }
 
-        return OC_EH_OK;
+        return ehResult;
     }
 
 };
-int main()
+
+int main(int argc, char* argv[])
 {
+    OCConnectivityType connectivityType = CT_ADAPTER_IP;
+
+    if(argc == 2)
+    {
+        try
+        {
+            std::size_t inputValLen;
+            int optionSelected = std::stoi(argv[1], &inputValLen);
+
+            if(inputValLen == strlen(argv[1]))
+            {
+                if(optionSelected == 0)
+                {
+                    connectivityType = CT_ADAPTER_IP;
+                }
+                else
+                {
+                    std::cout << "Invalid connectivity type selected. Using default IP" << std::endl;
+                }
+            }
+            else
+            {
+                std::cout << "Invalid connectivity type selected. Using default IP" << std::endl;
+            }
+        }
+        catch(std::exception& )
+        {
+            std::cout << "Invalid input argument. Using IP as connectivity type" << std::endl;
+        }
+    }
+    else
+    {
+        std::cout<< "Usage simpleclientserver 0>" << std::endl;
+        std::cout<< "    ConnectivityType: Default IP" << std::endl;
+        std::cout << "   ConnectivityType : 0 - IP" << std::endl;
+    }
+
     PlatformConfig cfg {
         OC::ServiceType::InProc,
         OC::ModeType::Both,
@@ -299,11 +352,14 @@ int main()
             return -1;
         }
 
-        ClientWorker cw;
+        ClientWorker cw(connectivityType);
         cw.start();
     }
     catch(OCException& e)
     {
         std::cout<< "Exception in main: "<<e.what()<<std::endl;
     }
+
+    return 0;
 }
+