Update snapshot(2017-12-14)
[platform/upstream/iotivity.git] / service / resource-encapsulation / src / serverBuilder / src / RCSResourceObject.cpp
index 0e52fdd..cecfb1d 100644 (file)
@@ -21,7 +21,6 @@
 #include "RCSResourceObject.h"
 
 #include <functional>
-#include <vector>
 
 #include "RequestHandler.h"
 #include "AssertUtils.h"
@@ -35,6 +34,9 @@
 #include "logger.h"
 #include "OCPlatform.h"
 
+#ifdef  LOG_TAG
+#undef  LOG_TAG
+#endif
 #define LOG_TAG "RCSResourceObject"
 
 namespace
@@ -86,13 +88,12 @@ namespace
 
     template< typename HANDLER, typename RESPONSE =
             typename std::decay<HANDLER>::type::result_type >
-    RESPONSE invokeHandler(const RCSResourceObject::Ptr& resObj, RCSResourceAttributes& attrs,
-            const std::shared_ptr< OC::OCResourceRequest >& ocRequest,
+    RESPONSE invokeHandler(RCSResourceAttributes& attrs, const RCSRequest& request,
             std::shared_ptr< HANDLER > handler)
     {
-        if (handler)
+        if (handler && *handler)
         {
-            return (*handler)(RCSRequest{ resObj, ocRequest }, attrs);
+            return (*handler)(request, attrs);
         }
 
         return RESPONSE::defaultAction();
@@ -123,6 +124,16 @@ namespace
         return {};
     }
 
+    void insertValue(std::vector<std::string>& container, std::string value)
+    {
+        if (value.empty()) return;
+
+        if (std::find(container.begin(), container.end(), value) == container.end())
+        {
+            container.push_back(std::move(value));
+        }
+    }
+
 } // unnamed namespace
 
 namespace OIC
@@ -134,22 +145,29 @@ namespace OIC
                 std::string interface) :
                 m_uri{ std::move(uri) },
                 m_types{ std::move(type) },
-                m_interfaces{ std::move(interface) },
-                m_defaultInterface { BASELINE_INTERFACE },
+                m_interfaces{ },
+                m_defaultInterface{ interface },
                 m_properties{ OC_DISCOVERABLE | OC_OBSERVABLE },
                 m_resourceAttributes{ }
         {
+            addInterface(interface);
+            addInterface(BASELINE_INTERFACE);
+
+            if (m_defaultInterface.empty())
+            {
+                m_defaultInterface = BASELINE_INTERFACE;
+            }
         }
 
         RCSResourceObject::Builder& RCSResourceObject::Builder::addInterface(std::string interface)
         {
-            m_interfaces.push_back(std::move(interface));
+            insertValue(m_interfaces, std::move(interface));
             return *this;
         }
 
         RCSResourceObject::Builder& RCSResourceObject::Builder::addType(std::string type)
         {
-            m_types.push_back(std::move(type));
+            insertValue(m_types, std::move(type));
             return *this;
         }
 
@@ -576,14 +594,16 @@ namespace OIC
 
             try
             {
+                RCSRequest rcsRequest{ resource, request };
+
                 if (request->getRequestHandlerFlag() & OC::RequestHandlerFlag::RequestFlag)
                 {
-                    return resource->handleRequest(request);
+                    return resource->handleRequest(rcsRequest);
                 }
 
                 if (request->getRequestHandlerFlag() & OC::RequestHandlerFlag::ObserverFlag)
                 {
-                    return resource->handleObserve(request);
+                    return resource->handleObserve(rcsRequest);
                 }
             }
             catch (const std::exception& e)
@@ -601,33 +621,28 @@ namespace OIC
         }
 
         OCEntityHandlerResult RCSResourceObject::handleRequest(
-                const std::shared_ptr< OC::OCResourceRequest >& request)
+                const RCSRequest& request)
         {
-            assert(request != nullptr);
-
-            RCSRequest rcsRequest{ shared_from_this(), request };
-
-            if (rcsRequest.getInterface() != "" && m_interfaceHandlers.find(
-                    rcsRequest.getInterface()) == m_interfaceHandlers.end())
+            if (request.getInterface() != "" &&
+                    m_interfaceHandlers.find(request.getInterface()) == m_interfaceHandlers.end())
             {
                 return OC_EH_ERROR;
             }
 
-            if (request->getRequestType() == "GET")
+            if (request.getOCRequest()->getRequestType() == "GET")
             {
-                return handleRequestGet(rcsRequest);
+                return handleRequestGet(request);
             }
 
-            if (request->getRequestType() == "POST")
+            if (request.getOCRequest()->getRequestType() == "POST")
             {
-                return handleRequestSet(rcsRequest);
+                return handleRequestSet(request);
             }
 
             return OC_EH_ERROR;
         }
 
-        OCEntityHandlerResult RCSResourceObject::handleRequestGet(
-                const RCSRequest& request)
+        OCEntityHandlerResult RCSResourceObject::handleRequestGet(const RCSRequest& request)
         {
             if (!findInterfaceHandler(request.getInterface()).isGetSupported())
             {
@@ -635,8 +650,8 @@ namespace OIC
             }
 
             auto attrs = getAttributesFromOCRequest(request.getOCRequest());
-            auto response = invokeHandler(shared_from_this(), attrs, request.getOCRequest(),
-                    m_getRequestHandler);
+
+            auto response = invokeHandler(attrs, request, m_getRequestHandler);
 
             if (response.isSeparate()) return OC_EH_SLOW;
 
@@ -679,8 +694,7 @@ namespace OIC
             return !replaced.empty();
         }
 
-        OCEntityHandlerResult RCSResourceObject::handleRequestSet(
-                const RCSRequest& request)
+        OCEntityHandlerResult RCSResourceObject::handleRequestSet(const RCSRequest& request)
         {
             if (!findInterfaceHandler(request.getInterface()).isSetSupported())
             {
@@ -689,8 +703,7 @@ namespace OIC
 
             auto attrs = getAttributesFromOCRequest(request.getOCRequest());
 
-            auto response = invokeHandler(shared_from_this(), attrs, request.getOCRequest(),
-                    m_setRequestHandler);
+            auto response = invokeHandler(attrs, request, m_setRequestHandler);
 
             if (response.isSeparate()) return OC_EH_SLOW;
 
@@ -700,8 +713,7 @@ namespace OIC
                     findInterfaceHandler(request.getInterface()).getSetResponseBuilder());
         }
 
-        OCEntityHandlerResult RCSResourceObject::handleObserve(
-                const std::shared_ptr< OC::OCResourceRequest >&)
+        OCEntityHandlerResult RCSResourceObject::handleObserve(const RCSRequest&)
         {
             if (!isObservable())
             {
@@ -806,7 +818,7 @@ namespace OIC
                     m_resourceObject, m_resourceObject.m_resourceAttributes, m_autoNotifyPolicy);
         }
 
-        RCSResourceObject::WeakGuard::WeakGuard(
+      RCSResourceObject::WeakGuard::WeakGuard(
                 const RCSResourceObject& resourceObject) :
                 m_isOwningLock{ false },
                 m_resourceObject(resourceObject)