#include <StringConstants.h>
#include "ocpayload.h"
#include "ocrandom.h"
+#include "oic_string.h"
namespace OC
{
public:
ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
- const OCDevAddr& devAddr, OCDiscoveryPayload* payload)
- : m_clientWrapper(cw), m_devAddr(devAddr)
+ OCDevAddr& devAddr, OCDiscoveryPayload* payload)
{
- OCResourcePayload* res = payload->resources;
+ OCDevAddr currentDevAddr = devAddr;
- while(res)
+ while (payload)
{
- char uuidString[UUID_STRING_SIZE];
- if(OCConvertUuidToString(res->sid, uuidString) != RAND_UUID_OK)
+ std::string deviceName;
+ if (payload->name)
{
- uuidString[0]= '\0';
+ deviceName = payload->name;
}
- 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,
- StringLLToVector(res->types),
- StringLLToVector(res->interfaces)
- )));
- res = res->next;
- }
-
- }
-
- const std::vector<std::shared_ptr<OCResource>>& Resources() const
- {
- return m_resources;
- }
- private:
- std::vector<std::shared_ptr<OC::OCResource>> m_resources;
- std::weak_ptr<IClientWrapper> m_clientWrapper;
- const OCDevAddr& m_devAddr;
- };
- /*
- class ListenOCContainer
- {
- private:
- enum class OCSecureType
- {
- NotSecure,
- Secure
- };
-
- class DiscoveredResources
- {
- class Resource
- {
- friend class cereal::access;
-
- class ResourcePolicy
- {
- friend class cereal::access;
- friend class Resource;
-
- template<class Archive>
- void serialize(Archive& ar)
+ OCResourcePayload* res = payload->resources;
+ while (res)
{
- try
- {
- m_observable = false;
- ar(cereal::make_nvp(OC::Key::BMKEY, m_bm));
- if(m_bm & OC_OBSERVABLE)
- {
- m_observable = true;
- }
- }
- catch(cereal::Exception&)
- {
- ar.setNextName(nullptr);
- }
+ currentDevAddr.flags = res->secure ?
+ (OCTransportFlags)(OC_FLAG_SECURE | devAddr.flags) :
+ devAddr.flags;
- try
- {
- m_secure = false;
- int secureTemp;
- ar(cereal::make_nvp(OC::Key::SECUREKEY, secureTemp));
- m_secure = secureTemp != 0;
+ currentDevAddr.port = (res->port != 0) ? res->port : devAddr.port;
- m_port = -1;
- ar(cereal::make_nvp(OC::Key::PORTKEY, m_port));
+ if (payload->baseURI)
+ {
+ OCDevAddr rdPubAddr = currentDevAddr;
+
+ std::string baseURI = std::string(payload->baseURI);
+ size_t len = baseURI.length();
+ int addressLen = baseURI.find_first_of(":");
+ std::string ipaddress = baseURI.substr(0, addressLen);
+ int port = atoi(baseURI.substr(addressLen + 1, len).c_str());
+ OICStrcpy(rdPubAddr.addr, addressLen + 1, ipaddress.c_str());
+ rdPubAddr.port = port;
+ m_resources.push_back(std::shared_ptr<OC::OCResource>(
+ new OC::OCResource(cw, rdPubAddr,
+ std::string(res->uri),
+ std::string(payload->sid),
+ res->bitmap,
+ StringLLToVector(res->types),
+ StringLLToVector(res->interfaces),
+ deviceName
+ )));
}
- catch(cereal::Exception&)
+ else
{
- ar.setNextName(nullptr);
+ m_resources.push_back(std::shared_ptr<OC::OCResource>(
+ new OC::OCResource(cw, currentDevAddr,
+ std::string(res->uri),
+ std::string(payload->sid),
+ res->bitmap,
+ StringLLToVector(res->types),
+ StringLLToVector(res->interfaces),
+ deviceName
+ )));
+
+#ifdef TCP_ADAPTER
+ if (res->tcpPort != 0)
+ {
+ OCDevAddr tcpDevAddr = currentDevAddr;
+ tcpDevAddr.port = res->tcpPort;
+ tcpDevAddr.adapter = OC_ADAPTER_TCP;
+ m_resources.push_back(std::shared_ptr<OC::OCResource>(
+ new OC::OCResource(cw, tcpDevAddr,
+ std::string(res->uri),
+ std::string(payload->sid),
+ res->bitmap,
+ StringLLToVector(res->types),
+ StringLLToVector(res->interfaces),
+ deviceName
+ )));
+ }
+#endif
}
- }
-
- bool m_observable;
- uint8_t m_bm;
- bool m_secure;
- int m_port;
- };
-
- template <class Archive>
- void serialize(Archive& ar)
- {
- try
- {
- ar(cereal::make_nvp(OC::Key::URIKEY, m_uri));
- m_loaded = true;
- }
- catch(cereal::Exception&)
- {
- ar.setNextName(nullptr);
- }
-
- try
- {
- ar(cereal::make_nvp(OC::Key::RESOURCETYPESKEY,m_resourceTypes));
- m_loaded = true;
- }
- catch(cereal::Exception&)
- {
- ar.setNextName(nullptr);
- }
-
- try
- {
- ar(cereal::make_nvp(OC::Key::INTERFACESKEY, m_interfaces));
- m_loaded = true;
- }
- catch(cereal::Exception&)
- {
- ar.setNextName(nullptr);
- }
-
- try
- {
- ar(cereal::make_nvp(OC::Key::POLICYKEY, m_policy));
- m_loaded = true;
- }
- catch(cereal::Exception&)
- {
- ar.setNextName(nullptr);
- }
-
- // Although not expected, a server id as part of a resource's own
- // representation is legal. It may be used if needed.
- try
- {
- ar(cereal::make_nvp(OC::Key::DEVICEIDKEY, m_serverId));
- m_loaded = true;
+ res = res->next;
}
- catch(cereal::Exception&)
- {
- ar.setNextName(nullptr);
- }
- }
- public:
- Resource(): m_loaded(false)
- {}
-
- bool observable() const
- {
- return m_policy.m_observable;
- }
-
- OCSecureType secureType() const
- {
- return m_policy.m_secure ? OCSecureType::Secure : OCSecureType::NotSecure;
- }
-
- int port() const
- {
- return m_policy.m_port;
- }
-
- std::vector<std::string> resourceTypes() const
- {
- return m_resourceTypes;
+ payload = payload->next;
}
+ }
- std::vector<std::string> interfaces() const
- {
- return m_interfaces;
- }
-
- bool loaded() const{
- return m_loaded;
- }
-
- std::string m_uri;
- std::string m_serverId;
- std::vector<std::string> m_resourceTypes;
- std::vector<std::string> m_interfaces;
- ResourcePolicy m_policy;
- bool m_loaded;
- };
-
- public:
- DiscoveredResources()
- {}
-
- private:
- friend class cereal::access;
- friend class ListenOCContainer;
-
- template <class Archive>
- void serialize(Archive& ar)
+#ifdef WITH_MQ
+ ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
+ OCDevAddr& devAddr, OCRepPayload* payload)
{
- try
+ if (payload)
{
- ar(cereal::make_nvp(OC::Key::DEVICEIDKEY, m_serverIdOfThisDevice));
- }
- catch(cereal::Exception&) { ar.setNextName(nullptr); }
+ char**topicList = nullptr;
+ size_t dimensions[MAX_REP_ARRAY_DEPTH] = {0};
+ OCRepPayloadGetStringArray(payload, "topiclist", &topicList, dimensions);
- try
- {
- ar(cereal::make_nvp(OC::Key::LINKS, resources));
+ for(size_t idx = 0; idx < dimensions[0]; idx++)
+ {
+ m_resources.push_back(std::shared_ptr<OC::OCResource>(
+ new OC::OCResource(cw, devAddr,
+ std::string(topicList[idx]),
+ "",
+ OC_OBSERVABLE,
+ {OC_RSRVD_RESOURCE_TYPE_MQ_TOPIC},
+ {DEFAULT_INTERFACE},
+ deviceName
+ )));
+ }
}
- catch(cereal::Exception&) { ar.setNextName(nullptr); }
}
- std::string m_serverIdOfThisDevice;
- std::vector<Resource> resources;
- };
-
- private:
- friend class cereal::access;
- template <class Archive>
- void serialize(Archive& ar)
- {
- std::vector<DiscoveredResources> resources;
- ar(resources);
- }
- public:
ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
- const OCDevAddr& devAddr, std::stringstream& json)
- : m_clientWrapper(cw), m_devAddr(devAddr)
-
+ OCDevAddr& devAddr, const std::string& topicUri)
{
- LoadFromJson(json);
+ m_resources.push_back(std::shared_ptr<OC::OCResource>(
+ new OC::OCResource(cw, devAddr,
+ topicUri,
+ "",
+ OC_OBSERVABLE,
+ {OC_RSRVD_RESOURCE_TYPE_MQ_TOPIC},
+ {DEFAULT_INTERFACE},
+ deviceName
+ )));
}
+#endif
const std::vector<std::shared_ptr<OCResource>>& Resources() const
{
return m_resources;
}
-
private:
- void LoadFromJson(std::stringstream& json)
- {
- cereal::JSONInputArchive archive(json);
-
- std::vector<DiscoveredResources> resources;
- archive(cereal::make_nvp(OC::Key::OCKEY, resources));
-
- m_resources.clear();
-
- for(const auto& resourcesAtDevice : resources)
- {
- std::string serverIDForThisResourceRep = resourcesAtDevice.m_serverIdOfThisDevice;
-
- for (const auto& resource : resourcesAtDevice.resources)
- {
- try
- {
- if(resource.loaded())
- {
- m_resources.push_back(std::shared_ptr<OCResource>
- (
- new OCResource
- (
- m_clientWrapper,
- m_devAddr,
- resource.m_uri,
- serverIDForThisResourceRep,
- resource.observable(),
- resource.resourceTypes(),
- resource.interfaces()
- )
- ));
- }
- }
- catch(ResourceInitException& e)
- {
- oclog() << "listenCallback(): failed to create resource: " << e.what()
- << std::flush;
- }
- }
- }
- }
+ std::vector<std::shared_ptr<OC::OCResource>> m_resources;
};
-*/
}