X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fsrc%2FOCRepresentation.cpp;h=3d42719c187b4171f3ec48712eaabe1a103ed1b0;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=88188219535bbd8b7272870a6dd82c9d74c6568e;hpb=98bd99636f3e216562976544be94bc1dd228cb91;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/src/OCRepresentation.cpp b/resource/src/OCRepresentation.cpp index 8818821..3d42719 100644 --- a/resource/src/OCRepresentation.cpp +++ b/resource/src/OCRepresentation.cpp @@ -30,10 +30,12 @@ #include #include +#include #include "ocpayload.h" #include "ocrandom.h" #include "oic_malloc.h" #include "oic_string.h" +#include "ocstack.h" namespace OC { @@ -53,103 +55,16 @@ namespace OC case PAYLOAD_TYPE_REPRESENTATION: setPayload(reinterpret_cast(rep)); break; - case PAYLOAD_TYPE_DEVICE: - setPayload(reinterpret_cast(rep)); - break; - case PAYLOAD_TYPE_PLATFORM: - setPayload(reinterpret_cast(rep)); - break; default: throw OC::OCException("Invalid Payload type in setPayload"); break; } } - void MessageContainer::setPayload(const OCDevicePayload* payload) - { - if (payload == nullptr) - { - return; - } - - OCRepresentation rep; - rep[OC_RSRVD_DEVICE_ID] = (payload->sid) ? - std::string(payload->sid) : - std::string(); - rep[OC_RSRVD_DEVICE_NAME] = payload->deviceName ? - std::string(payload->deviceName) : - std::string(); - rep[OC_RSRVD_SPEC_VERSION] = payload->specVersion ? - std::string(payload->specVersion) : - std::string(); - rep[OC_RSRVD_DATA_MODEL_VERSION] = payload->dataModelVersion ? - std::string(payload->dataModelVersion) : - std::string(); - for (OCStringLL *strll = payload->types; strll; strll = strll->next) - { - rep.addResourceType(strll->value); - } - m_reps.push_back(std::move(rep)); - } - - void MessageContainer::setPayload(const OCPlatformPayload* payload) - { - if (payload == nullptr) - { - return; - } - - OCRepresentation rep; - rep[OC_RSRVD_PLATFORM_ID] = payload->info.platformID ? - std::string(payload->info.platformID) : - std::string(); - rep[OC_RSRVD_MFG_NAME] = payload->info.manufacturerName ? - std::string(payload->info.manufacturerName) : - std::string(); - rep[OC_RSRVD_MFG_URL] = payload->info.manufacturerUrl ? - std::string(payload->info.manufacturerUrl) : - std::string(); - rep[OC_RSRVD_MODEL_NUM] = payload->info.modelNumber ? - std::string(payload->info.modelNumber) : - std::string(); - rep[OC_RSRVD_MFG_DATE] = payload->info.dateOfManufacture ? - std::string(payload->info.dateOfManufacture) : - std::string(); - rep[OC_RSRVD_PLATFORM_VERSION] = payload->info.platformVersion ? - std::string(payload->info.platformVersion) : - std::string(); - rep[OC_RSRVD_OS_VERSION] = payload->info.operatingSystemVersion ? - std::string(payload->info.operatingSystemVersion) : - std::string(); - rep[OC_RSRVD_HARDWARE_VERSION] = payload->info.hardwareVersion ? - std::string(payload->info.hardwareVersion) : - std::string(); - rep[OC_RSRVD_FIRMWARE_VERSION] = payload->info.firmwareVersion ? - std::string(payload->info.firmwareVersion) : - std::string(); - rep[OC_RSRVD_SUPPORT_URL] = payload->info.supportUrl ? - std::string(payload->info.supportUrl) : - std::string(); - rep[OC_RSRVD_SYSTEM_TIME] = payload->info.systemTime ? - std::string(payload->info.systemTime) : - std::string(); - - for (OCStringLL *strll = payload->rt; strll; strll = strll->next) - { - rep.addResourceType(strll->value); - } - for (OCStringLL *strll = payload->interfaces; strll; strll = strll->next) - { - rep.addResourceInterface(strll->value); - } - - m_reps.push_back(std::move(rep)); - } - void MessageContainer::setPayload(const OCRepPayload* payload) { const OCRepPayload* pl = payload; - while(pl) + while (pl) { OCRepresentation cur; cur.setPayload(pl); @@ -314,7 +229,7 @@ namespace OC ((int64_t*)array)[pos] = item; } -#if !defined(_MSC_VER) +#if !(defined(_MSC_VER) || defined(__APPLE__)) template<> void get_payload_array::copy_to_array(std::_Bit_reference br, void* array, size_t pos) { @@ -341,6 +256,24 @@ namespace OC } template<> + void get_payload_array::copy_to_array(OCByteString item, void *array, size_t pos) + { + ((OCByteString *)array)[pos] = item; + } + + template<> + void get_payload_array::copy_to_array(OCByteString &item, void *array, size_t pos) + { + ((OCByteString *)array)[pos] = item; + } + + template<> + void get_payload_array::copy_to_array(const OCByteString &item, void *array, size_t pos) + { + ((OCByteString *)array)[pos] = item; + } + + template<> void get_payload_array::copy_to_array(OC::OCRepresentation item, void* array, size_t pos) { ((OCRepPayload**)array)[pos] = item.getPayload(); @@ -375,6 +308,10 @@ namespace OC (char**)vis.array, vis.dimensions); break; + case AttributeType::OCByteString: + OCRepPayloadSetByteStringArrayAsOwner(payload, item.attrname().c_str(), + (OCByteString *)vis.array, vis.dimensions); + break; case AttributeType::OCRepresentation: OCRepPayloadSetPropObjectArrayAsOwner(payload, item.attrname().c_str(), (OCRepPayload**)vis.array, vis.dimensions); @@ -426,6 +363,9 @@ namespace OC OCRepPayloadSetPropString(root, val.attrname().c_str(), static_cast(val).c_str()); break; + case AttributeType::OCByteString: + OCRepPayloadSetPropByteString(root, val.attrname().c_str(), val.getValue()); + break; case AttributeType::OCRepresentation: OCRepPayloadSetPropObjectAsOwner(root, val.attrname().c_str(), static_cast(val).getPayload()); @@ -501,6 +441,19 @@ namespace OC return std::string{}; } } + + template<> + OCByteString OCRepresentation::payload_array_helper_copy( + size_t index, const OCRepPayloadValue *pl) + { + OCByteString result {NULL, 0}; + if (pl->arr.ocByteStrArray[index].len) + { + result = (pl->arr.ocByteStrArray[index]); + } + return result; + } + template<> OCRepresentation OCRepresentation::payload_array_helper_copy( size_t index, const OCRepPayloadValue* pl) @@ -584,6 +537,9 @@ namespace OC case OCREP_PROP_STRING: payload_array_helper(pl, calcArrayDepth(pl->arr.dimensions)); break; + case OCREP_PROP_BYTE_STRING: + payload_array_helper(pl, calcArrayDepth(pl->arr.dimensions)); + break; case OCREP_PROP_OBJECT: payload_array_helper(pl, calcArrayDepth(pl->arr.dimensions)); break; @@ -677,14 +633,14 @@ namespace OC m_children = children; } - void OCRepresentation::setDevAddr(const OCDevAddr m_devAddr) + void OCRepresentation::setDevAddr(const OCDevAddr& devAddr) { std::ostringstream ss; - if (m_devAddr.flags & OC_SECURE) + if (devAddr.flags & OC_SECURE) { ss << COAPS; } - else if (m_devAddr.adapter & OC_ADAPTER_TCP) + else if (devAddr.adapter & OC_ADAPTER_TCP) { ss << COAP_TCP; } @@ -692,17 +648,26 @@ namespace OC { ss << COAP; } - if (m_devAddr.flags & OC_IP_USE_V6) + if (devAddr.flags & OC_IP_USE_V6) { - ss << '[' << m_devAddr.addr << ']'; + char addressEncoded[128] = {0}; + + OCStackResult result = OCEncodeAddressForRFC6874(addressEncoded, + sizeof(addressEncoded), + devAddr.addr); + if (OC_STACK_OK != result) + { + throw OC::OCException("Invalid address in setDevAddr"); + } + ss << '[' << addressEncoded << ']'; } else { - ss << m_devAddr.addr; + ss << devAddr.addr; } - if (m_devAddr.port) + if (devAddr.port) { - ss << ':' << m_devAddr.port; + ss << ':' << devAddr.port; } m_host = ss.str(); } @@ -757,6 +722,16 @@ namespace OC m_interfaces = resourceInterfaces; } + const std::vector& OCRepresentation::getDataModelVersions() const + { + return m_dataModelVersions; + } + + void OCRepresentation::addDataModelVersion(const std::string& str) + { + m_dataModelVersions.push_back(str); + } + bool OCRepresentation::hasAttribute(const std::string& str) const { return m_values.find(str) != m_values.end(); @@ -777,7 +752,8 @@ namespace OC else if ((m_interfaceType == InterfaceType::None || m_interfaceType==InterfaceType::DefaultChild || m_interfaceType==InterfaceType::LinkChild) - && (m_resourceTypes.size()>0 || m_interfaces.size()>0)) + && (m_resourceTypes.size()>0 || m_interfaces.size()>0 + || m_dataModelVersions.size()>0)) { return false; } @@ -848,6 +824,9 @@ namespace OC case AttributeType::String: os << "String"; break; + case AttributeType::OCByteString: + os << "OCByteString"; + break; case AttributeType::OCRepresentation: os << "OCRepresentation"; break; @@ -1141,6 +1120,24 @@ namespace OC str = "(null)"; } + template <> + void to_string_visitor::operator()(std::vector const &item) + { + std::ostringstream stream; + for (size_t i = 0; i < item.size(); i++ ) + { + stream << "\\x" << std::hex << (int) item[i]; + } + str = stream.str(); + } + + template<> + void to_string_visitor::operator()(OCByteString const &item) + { + std::vector v(item.bytes, item.bytes + item.len); + operator()(v); + } + template<> void to_string_visitor::operator()(OCRepresentation const& /*item*/) {