Implementation of JNI for subscribe device presence to RD
[platform/upstream/iotivity.git] / resource / include / OCSerialization.h
index b112af1..693f546 100644 (file)
@@ -21,6 +21,7 @@
 #include <StringConstants.h>
 #include "ocpayload.h"
 #include "ocrandom.h"
+#include "oic_string.h"
 
 namespace OC
 {
@@ -43,18 +44,11 @@ namespace OC
                     OCDevAddr& devAddr, OCDiscoveryPayload* payload)
                     : m_clientWrapper(cw), m_devAddr(devAddr)
             {
-                OCResourcePayload* res = payload->resources;
-                OCResourceCollectionPayload* colRes = payload->collectionResources;
-                if (res)
+                while (payload)
                 {
-                    while(res)
+                    OCResourcePayload* res = payload->resources;
+                    while (res)
                     {
-                        char uuidString[UUID_STRING_SIZE];
-                        if(OCConvertUuidToString(res->sid, uuidString) != RAND_UUID_OK)
-                        {
-                            uuidString[0]= '\0';
-                        }
-
                         if (res->secure)
                         {
                             m_devAddr.flags =
@@ -63,48 +57,95 @@ namespace OC
 
                         if (res->port != 0)
                         {
-                             m_devAddr.port = res->port;
+                            m_devAddr.port = res->port;
                         }
 
-                        m_resources.push_back(std::shared_ptr<OC::OCResource>(
+                        if (payload->baseURI)
+                        {
+                            OCDevAddr rdPubAddr = m_devAddr;
+                            OICStrcpy(rdPubAddr.addr, sizeof(rdPubAddr.addr), payload->baseURI);
+                            rdPubAddr.port = res->port;
+                            m_resources.push_back(std::shared_ptr<OC::OCResource>(
+                                        new OC::OCResource(m_clientWrapper, rdPubAddr,
+                                            std::string(res->uri),
+                                            std::string(payload->sid),
+                                            res->bitmap,
+                                            StringLLToVector(res->types),
+                                            StringLLToVector(res->interfaces)
+                                            )));
+                        }
+                        else
+                        {
+                            m_resources.push_back(std::shared_ptr<OC::OCResource>(
                                     new OC::OCResource(m_clientWrapper, m_devAddr,
                                         std::string(res->uri),
-                                        std::string(uuidString),
-                                        (res->bitmap & OC_OBSERVABLE) == OC_OBSERVABLE,
+                                        std::string(payload->sid),
+                                        res->bitmap,
                                         StringLLToVector(res->types),
                                         StringLLToVector(res->interfaces)
                                         )));
+
+#ifdef TCP_ADAPTER
+                            if (res->tcpPort != 0)
+                            {
+                                OCDevAddr tcpDevAddr = m_devAddr;
+                                tcpDevAddr.port = res->tcpPort;
+                                tcpDevAddr.adapter = OC_ADAPTER_TCP;
+                                m_resources.push_back(std::shared_ptr<OC::OCResource>(
+                                            new OC::OCResource(m_clientWrapper, tcpDevAddr,
+                                                std::string(res->uri),
+                                                std::string(payload->sid),
+                                                res->bitmap,
+                                                StringLLToVector(res->types),
+                                                StringLLToVector(res->interfaces)
+                                                )));
+                            }
+#endif
+                        }
                         res = res->next;
                     }
+                    payload = payload->next;
                 }
-                else if (colRes)
-                {
-                    while(colRes)
-                    {
-                        if (colRes->tags->bitmap & OC_SECURE)
-                        {
-                            m_devAddr.flags =
-                                  (OCTransportFlags)(OC_FLAG_SECURE | m_devAddr.flags);
-                        }
+            }
 
-                        if (colRes->tags->port != 0)
-                        {
-                             m_devAddr.port = colRes->tags->port;
-                        }
+#ifdef WITH_MQ
+            ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
+                                OCDevAddr& devAddr, OCRepPayload* payload)
+                                : m_clientWrapper(cw), m_devAddr(devAddr)
+            {
+                if (payload)
+                {
+                    char**topicList = nullptr;
+                    size_t dimensions[MAX_REP_ARRAY_DEPTH] = {0};
+                    OCRepPayloadGetStringArray(payload, "topiclist", &topicList, dimensions);
 
+                    for(size_t idx = 0; idx < dimensions[0]; idx++)
+                    {
                         m_resources.push_back(std::shared_ptr<OC::OCResource>(
-                                    new OC::OCResource(m_clientWrapper, m_devAddr,
-                                        std::string(colRes->setLinks->href),
-                                        std::string((char*)colRes->tags->di.id),
-                                        (colRes->tags->bitmap & OC_OBSERVABLE) == OC_OBSERVABLE,
-                                        StringLLToVector(colRes->setLinks->rt),
-                                        StringLLToVector(colRes->setLinks->itf)
-                                        )));
-                        colRes = colRes->next;
+                                new OC::OCResource(m_clientWrapper, m_devAddr,
+                                                   std::string(topicList[idx]),
+                                                   "",
+                                                   OC_OBSERVABLE,
+                                                   {OC_RSRVD_RESOURCE_TYPE_MQ_TOPIC},
+                                                   {DEFAULT_INTERFACE})));
                     }
                 }
             }
 
+            ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
+                              OCDevAddr& devAddr, const std::string& topicUri)
+                              : m_clientWrapper(cw), m_devAddr(devAddr)
+            {
+                    m_resources.push_back(std::shared_ptr<OC::OCResource>(
+                            new OC::OCResource(m_clientWrapper, m_devAddr,
+                                               topicUri,
+                                               "",
+                                               OC_OBSERVABLE,
+                                               {OC_RSRVD_RESOURCE_TYPE_MQ_TOPIC},
+                                               {DEFAULT_INTERFACE})));
+            }
+#endif
+
             const std::vector<std::shared_ptr<OCResource>>& Resources() const
             {
                 return m_resources;