Fixed Fridge sample with constructResourceObject
authorErich Keane <erich.keane@intel.com>
Fri, 10 Jul 2015 23:34:32 +0000 (16:34 -0700)
committerErich Keane <erich.keane@intel.com>
Mon, 13 Jul 2015 16:50:07 +0000 (16:50 +0000)
The constructResourceObject takes a host string, which isn't compatible
with the current OCDevAddr address.  This patch parses said string, and
converts it properly to an OCDevAddr.

Change-Id: Id86f3832e596aa8869794a1d33915e158fe85008
Signed-off-by: Erich Keane <erich.keane@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/1624
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
resource/include/IClientWrapper.h
resource/include/InProcClientWrapper.h
resource/include/OCResource.h
resource/include/OutOfProcClientWrapper.h
resource/src/InProcClientWrapper.cpp
resource/src/OCResource.cpp

index 421d3e5..272cd44 100644 (file)
@@ -54,7 +54,6 @@ namespace OC
 
         virtual OCStackResult GetResourceRepresentation(
                         const OCDevAddr& devAddr,
-                        bool useHostString,
                         const std::string& uri,
                         const QueryParamsMap& queryParams,
                         const HeaderOptions& headerOptions,
@@ -62,7 +61,6 @@ namespace OC
 
         virtual OCStackResult PutResourceRepresentation(
                         const OCDevAddr& devAddr,
-                        bool useHostString,
                         const std::string& uri,
                         const OCRepresentation& rep, const QueryParamsMap& queryParams,
                         const HeaderOptions& headerOptions,
@@ -70,7 +68,6 @@ namespace OC
 
         virtual OCStackResult PostResourceRepresentation(
                         const OCDevAddr& devAddr,
-                        bool useHostString,
                         const std::string& uri,
                         const OCRepresentation& rep, const QueryParamsMap& queryParams,
                         const HeaderOptions& headerOptions,
@@ -78,7 +75,6 @@ namespace OC
 
         virtual OCStackResult DeleteResource(
                         const OCDevAddr& devAddr,
-                        bool useHostString,
                         const std::string& uri,
                         const HeaderOptions& headerOptions,
                         DeleteCallback& callback, QualityOfService QoS) = 0;
@@ -86,7 +82,6 @@ namespace OC
         virtual OCStackResult ObserveResource(
                         ObserveType observeType, OCDoHandle* handle,
                         const OCDevAddr& devAddr,
-                        bool useHostString,
                         const std::string& uri,
                         const QueryParamsMap& queryParams,
                         const HeaderOptions& headerOptions, ObserveCallback& callback,
index 4e116f1..ddcc86c 100644 (file)
@@ -101,32 +101,32 @@ namespace OC
             FindDeviceCallback& callback, QualityOfService QoS);
 
         virtual OCStackResult GetResourceRepresentation(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
             GetCallback& callback, QualityOfService QoS);
 
         virtual OCStackResult PutResourceRepresentation(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const OCRepresentation& attributes, const QueryParamsMap& queryParams,
             const HeaderOptions& headerOptions, PutCallback& callback, QualityOfService QoS);
 
         virtual OCStackResult PostResourceRepresentation(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const OCRepresentation& attributes, const QueryParamsMap& queryParams,
             const HeaderOptions& headerOptions, PostCallback& callback, QualityOfService QoS);
 
         virtual OCStackResult DeleteResource(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const HeaderOptions& headerOptions,
             DeleteCallback& callback, QualityOfService QoS);
 
         virtual OCStackResult ObserveResource(
             ObserveType observeType, OCDoHandle* handle,
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
             ObserveCallback& callback, QualityOfService QoS);
index 57f18db..a648000 100644 (file)
@@ -504,6 +504,7 @@ namespace OC
         bool operator>=(const OCResource &other) const;
 
     private:
+        void setHost(const std::string& host);
         std::weak_ptr<IClientWrapper> m_clientWrapper;
         std::string m_uri;
         OCResourceIdentifier m_resourceId;
index 99aa5a2..e524dfa 100644 (file)
@@ -50,14 +50,14 @@ namespace OC
             {return OC_STACK_NOTIMPL;}
 
         virtual OCStackResult GetResourceRepresentation(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
             GetCallback& callback, QualityOfService QoS)
             {return OC_STACK_NOTIMPL;}
 
         virtual OCStackResult PutResourceRepresentation(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const OCRepresentation& attributes, const QueryParamsMap& queryParams,
             const HeaderOptions& headerOptions, PutCallback& callback,
@@ -65,14 +65,14 @@ namespace OC
             {return OC_STACK_NOTIMPL;}
 
         virtual OCStackResult PostResourceRepresentation(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const OCRepresentation& attributes, const QueryParamsMap& queryParams,
             const HeaderOptions& headerOptions, PostCallback& callback, QualityOfService QoS)
             {return OC_STACK_NOTIMPL;}
 
         virtual OCStackResult DeleteResource(
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const HeaderOptions& headerOptions,
             DeleteCallback& callback, QualityOfService QoS)
@@ -80,7 +80,7 @@ namespace OC
 
         virtual OCStackResult ObserveResource(
             ObserveType observeType, OCDoHandle* handle,
-            const OCDevAddr& devAddr, bool useHostString,
+            const OCDevAddr& devAddr,
             const std::string& uri,
             const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
             ObserveCallback& callback, QualityOfService QoS)
@@ -92,7 +92,7 @@ namespace OC
             const std::string& uri,
             const HeaderOptions& headerOptions, QualityOfService QoS)
             {return OC_STACK_NOTIMPL;}
-        
+
         virtual OCStackResult SubscribePresence(
             OCDoHandle* handle,
             const std::string& host,
index 4968d72..737be63 100644 (file)
@@ -347,53 +347,8 @@ namespace OC
         return OC_STACK_DELETE_TRANSACTION;
     }
 
-    OCStackResult InvokeDoResource(OCDoHandle *handle,
-                                    OCMethod method,
-                                    const char *requestUri,
-                                    const OCDevAddr *destination,
-                                    const char *request,
-                                    OCConnectivityType connectivityType,
-                                    OCQualityOfService qos,
-                                    OCCallbackData *cbData,
-                                    OCHeaderOption *options,
-                                    uint8_t numOptions,
-                                    bool useHostString)
-    {
-        if (useHostString)
-        {
-            ostringstream host;   
-            host << destination << requestUri;
-            connectivityType = (OCConnectivityType)
-                                ((destination->adapter << CT_ADAPTER_SHIFT)
-                                | (destination->flags & CT_MASK_FLAGS));
-            return OCDoResource(handle,
-                                method,
-                                host.str().c_str(),
-                                nullptr,
-                                request,
-                                connectivityType,
-                                qos,
-                                cbData,
-                                options,
-                                numOptions);
-        }
-        else
-        {
-            return OCDoResource(handle,
-                                method,
-                                requestUri,
-                                destination,
-                                request,
-                                connectivityType,
-                                qos,
-                                cbData,
-                                options,
-                                numOptions);
-        }
-    }
-
     OCStackResult InProcClientWrapper::GetResourceRepresentation(
-        const OCDevAddr& devAddr, bool useHostString,
+        const OCDevAddr& devAddr,
         const std::string& resourceUri,
         const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
         GetCallback& callback, QualityOfService QoS)
@@ -420,7 +375,8 @@ namespace OC
             std::lock_guard<std::recursive_mutex> lock(*cLock);
             OCHeaderOption options[MAX_HEADER_OPTIONS];
 
-            result = OCDoResource(nullptr, OC_REST_GET,
+            result = OCDoResource(
+                                  nullptr, OC_REST_GET,
                                   uri.c_str(),
                                   &devAddr, nullptr,
                                   CT_DEFAULT,
@@ -504,7 +460,7 @@ namespace OC
     }
 
     OCStackResult InProcClientWrapper::PostResourceRepresentation(
-        const OCDevAddr& devAddr, bool useHostString,
+        const OCDevAddr& devAddr,
         const std::string& uri,
         const OCRepresentation& rep,
         const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
@@ -550,7 +506,7 @@ namespace OC
     }
 
     OCStackResult InProcClientWrapper::PutResourceRepresentation(
-        const OCDevAddr& devAddr, bool useHostString,
+        const OCDevAddr& devAddr,
         const std::string& uri,
         const OCRepresentation& rep,
         const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
@@ -613,7 +569,7 @@ namespace OC
     }
 
     OCStackResult InProcClientWrapper::DeleteResource(
-        const OCDevAddr& devAddr, bool useHostString,
+        const OCDevAddr& devAddr,
         const std::string& uri,
         const HeaderOptions& headerOptions, DeleteCallback& callback, QualityOfService QoS)
     {
@@ -688,7 +644,7 @@ namespace OC
     }
 
     OCStackResult InProcClientWrapper::ObserveResource(ObserveType observeType, OCDoHandle* handle,
-        const OCDevAddr& devAddr, bool useHostString,
+        const OCDevAddr& devAddr,
         const std::string& uri,
         const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
         ObserveCallback& callback, QualityOfService QoS)
index 44506e0..e1188a2 100644 (file)
@@ -26,6 +26,8 @@
 
 namespace OC {
 
+static const char COAP[] = "coap://";
+static const char COAPS[] = "coaps://";
 using OC::nil_guard;
 using OC::result_guard;
 using OC::checked_guard;
@@ -36,7 +38,7 @@ OCResource::OCResource(std::weak_ptr<IClientWrapper> clientWrapper,
                         const std::vector<std::string>& resourceTypes,
                         const std::vector<std::string>& interfaces)
  :  m_clientWrapper(clientWrapper), m_uri(uri),
-    m_resourceId(serverId, m_uri), m_devAddr(devAddr), m_useHostString(false),
+    m_resourceId(serverId, m_uri), m_devAddr(devAddr),
     m_isObservable(observable), m_isCollection(false),
     m_resourceTypes(resourceTypes), m_interfaces(interfaces),
     m_observeHandle(nullptr)
@@ -63,7 +65,6 @@ OCResource::OCResource(std::weak_ptr<IClientWrapper> clientWrapper,
  :  m_clientWrapper(clientWrapper), m_uri(uri),
     m_resourceId(serverId, m_uri),
     m_devAddr{ OC_DEFAULT_ADAPTER },
-    m_useHostString(true),
     m_isObservable(observable), m_isCollection(false),
     m_resourceTypes(resourceTypes), m_interfaces(interfaces),
     m_observeHandle(nullptr)
@@ -88,20 +89,88 @@ OCResource::OCResource(std::weak_ptr<IClientWrapper> clientWrapper,
     {
         throw std::length_error("host address is too long.");
     }
-    host.copy(m_devAddr.addr, len);
-    m_devAddr.addr[len] = '\0';
+
+    this->setHost(host);
 }
 
 OCResource::~OCResource()
 {
 }
 
+void OCResource::setHost(const std::string& host)
+{
+    size_t prefix_len;
+
+    if(host.compare(0, sizeof(COAP) - 1, COAP) == 0)
+    {
+        prefix_len = sizeof(COAP) - 1;
+    }
+    else if(host.compare(0, sizeof(COAPS) - 1, COAPS) == 0)
+    {
+        prefix_len = sizeof(COAPS) - 1;
+        m_devAddr.flags = static_cast<OCTransportFlags>(m_devAddr.flags & OC_SECURE);
+    }
+    else
+    {
+        throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(),
+            m_interfaces.empty(), m_clientWrapper.expired(), false, false);
+    }
+
+    // removed coap:// or coaps://
+    std::string host_token = host.substr(prefix_len);
+
+    if(host_token[0] == '[')
+    {
+        m_devAddr.flags = static_cast<OCTransportFlags>(m_devAddr.flags & OC_IP_USE_V6);
+
+        size_t found = host_token.find(']');
+
+        if(found == std::string::npos)
+        {
+            throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(),
+                m_interfaces.empty(), m_clientWrapper.expired(), false, false);
+        }
+
+        std::string ip6Addr = host_token.substr(0, found);
+        ip6Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr));
+        m_devAddr.addr[ip6Addr.length()] = '\0';
+        host_token = host_token.substr(found + 1);
+    }
+    else
+    {
+        size_t found = host_token.find(':');
+
+        if(found == std::string::npos)
+        {
+            throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(),
+                m_interfaces.empty(), m_clientWrapper.expired(), false, false);
+        }
+
+        std::string addrPart = host_token.substr(0, found);
+        addrPart.copy(m_devAddr.addr, sizeof(m_devAddr.addr));
+        m_devAddr.addr[addrPart.length()] = '\0';
+
+        host_token = host_token.substr(found + 1);
+    }
+
+    int port = stoi(host_token);
+
+    if( port < 0 || port > UINT16_MAX )
+    {
+        throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(),
+            m_interfaces.empty(), m_clientWrapper.expired(), false, false);
+    }
+
+    m_devAddr.port = static_cast<uint16_t>(port);
+
+}
+
 OCStackResult OCResource::get(const QueryParamsMap& queryParametersMap,
                               GetCallback attributeHandler, QualityOfService QoS)
 {
     return checked_guard(m_clientWrapper.lock(),
                             &IClientWrapper::GetResourceRepresentation,
-                            m_devAddr, m_useHostString, m_uri,
+                            m_devAddr, m_uri,
                             queryParametersMap, m_headerOptions,
                             attributeHandler, QoS);
 }
@@ -147,7 +216,7 @@ OCStackResult OCResource::put(const OCRepresentation& rep,
                               QualityOfService QoS)
 {
     return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PutResourceRepresentation,
-                         m_devAddr, m_useHostString, m_uri, rep, queryParametersMap,
+                         m_devAddr, m_uri, rep, queryParametersMap,
                          m_headerOptions, attributeHandler, QoS);
 }
 
@@ -197,7 +266,7 @@ OCStackResult OCResource::post(const OCRepresentation& rep,
                                QualityOfService QoS)
 {
     return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
-                         m_devAddr, m_useHostString, m_uri, rep, queryParametersMap,
+                         m_devAddr, m_uri, rep, queryParametersMap,
                          m_headerOptions, attributeHandler, QoS);
 }
 
@@ -245,7 +314,7 @@ OCStackResult OCResource::post(const std::string& resourceType,
 OCStackResult OCResource::deleteResource(DeleteCallback deleteHandler, QualityOfService QoS)
 {
     return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource,
-                         m_devAddr, m_useHostString, m_uri, m_headerOptions, deleteHandler, QoS);
+                         m_devAddr, m_uri, m_headerOptions, deleteHandler, QoS);
 }
 
 OCStackResult OCResource::deleteResource(DeleteCallback deleteHandler)
@@ -267,7 +336,7 @@ OCStackResult OCResource::observe(ObserveType observeType,
 
     return checked_guard(m_clientWrapper.lock(), &IClientWrapper::ObserveResource,
                          observeType, &m_observeHandle, m_devAddr,
-                         m_useHostString, m_uri, queryParametersMap, m_headerOptions,
+                         m_uri, queryParametersMap, m_headerOptions,
                          observeHandler, QoS);
 }
 
@@ -308,19 +377,14 @@ OCStackResult OCResource::cancelObserve(QualityOfService QoS)
 
 std::string OCResource::host() const
 {
-    if (m_useHostString)
-    {
-        return std::string(m_devAddr.addr);
-    }
-
     std::ostringstream ss;
     if (m_devAddr.flags & OC_SECURE)
     {
-        ss << "coaps://";
+        ss << COAPS;
     }
     else
     {
-        ss << "coap://";
+        ss << COAP;
     }
     if (m_devAddr.flags & OC_IP_USE_V6)
     {