X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fsrc%2FOCResource.cpp;h=0728df0430cd25a537d82f3c64e28f47b1d7f23c;hb=8229635f6d207516ccbbdf23b13be164e0fc1787;hp=b83061f5227612a0dcbf91e880cfe281eb3a6587;hpb=bf72b57c4f5711f045c34288566c078ef72df990;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/src/OCResource.cpp b/resource/src/OCResource.cpp index b83061f..0728df0 100644 --- a/resource/src/OCResource.cpp +++ b/resource/src/OCResource.cpp @@ -18,6 +18,7 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include "iotivity_config.h" #include "OCResource.h" #include "OCUtilities.h" @@ -32,12 +33,14 @@ #ifdef HAVE_IN6ADDR_H #include #endif +#include "ocstack.h" namespace OC { static const char COAP[] = "coap://"; static const char COAPS[] = "coaps://"; static const char COAP_TCP[] = "coap+tcp://"; +static const char COAPS_TCP[] = "coaps+tcp://"; static const char COAP_GATT[] = "coap+gatt://"; static const char COAP_RFCOMM[] = "coap+rfcomm://"; @@ -49,12 +52,13 @@ OCResource::OCResource(std::weak_ptr clientWrapper, const OCDevAddr& devAddr, const std::string& uri, const std::string& serverId, uint8_t property, const std::vector& resourceTypes, - const std::vector& interfaces) + const std::vector& interfaces, + const std::string& deviceName) : m_clientWrapper(clientWrapper), m_uri(uri), m_resourceId(serverId, m_uri), m_devAddr(devAddr), m_isCollection(false), m_property(property), m_resourceTypes(resourceTypes), m_interfaces(interfaces), - m_observeHandle(nullptr) + m_observeHandle(nullptr), m_deviceName(deviceName) { m_isCollection = std::find(m_interfaces.begin(), m_interfaces.end(), LINK_INTERFACE) != m_interfaces.end(); @@ -64,8 +68,8 @@ OCResource::OCResource(std::weak_ptr clientWrapper, interfaces.empty()|| m_clientWrapper.expired()) { - throw ResourceInitException(m_uri.empty(), resourceTypes.empty(), - interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, resourceTypes.empty(), + interfaces.empty(), m_clientWrapper.expired(), false, false, false); } } @@ -74,18 +78,19 @@ OCResource::OCResource(std::weak_ptr clientWrapper, const std::string& serverId, OCConnectivityType connectivityType, uint8_t property, const std::vector& resourceTypes, - const std::vector& interfaces) + const std::vector& interfaces, + const std::string& deviceName) : m_clientWrapper(clientWrapper), m_uri(uri), m_resourceId(serverId, m_uri), m_isCollection(false), m_property(property), m_resourceTypes(resourceTypes), m_interfaces(interfaces), - m_observeHandle(nullptr) + m_observeHandle(nullptr), m_deviceName(deviceName) { m_devAddr = OCDevAddr{OC_DEFAULT_ADAPTER, OC_DEFAULT_FLAGS, 0, {0}, 0, #if defined (ROUTING_GATEWAY) || defined (ROUTING_EP) - {0} + {0}, #endif - }; + {0}}; m_isCollection = std::find(m_interfaces.begin(), m_interfaces.end(), LINK_INTERFACE) != m_interfaces.end(); @@ -94,20 +99,20 @@ OCResource::OCResource(std::weak_ptr clientWrapper, interfaces.empty()|| m_clientWrapper.expired()) { - throw ResourceInitException(m_uri.empty(), resourceTypes.empty(), - interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, resourceTypes.empty(), + interfaces.empty(), m_clientWrapper.expired(), false, false, false); } if (uri.length() == 1 && uri[0] == '/') { - throw ResourceInitException(m_uri.empty(), resourceTypes.empty(), - interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), true, resourceTypes.empty(), + interfaces.empty(), m_clientWrapper.expired(), false, false, false); } if (uri[0] != '/') { - throw ResourceInitException(m_uri.empty(), resourceTypes.empty(), - interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), true, resourceTypes.empty(), + interfaces.empty(), m_clientWrapper.expired(), false, false, false); } // construct the devAddr from the pieces we have @@ -138,6 +143,11 @@ void OCResource::setHost(const std::string& host) { prefix_len = sizeof(COAP_TCP) - 1; } + else if (host.compare(0, sizeof(COAPS_TCP) - 1, COAPS_TCP) == 0) + { + prefix_len = sizeof(COAPS_TCP) - 1; + m_devAddr.flags = static_cast(m_devAddr.flags | OC_SECURE); + } else if (host.compare(0, sizeof(COAP_GATT) - 1, COAP_GATT) == 0) { prefix_len = sizeof(COAP_GATT) - 1; @@ -148,8 +158,8 @@ void OCResource::setHost(const std::string& host) } else { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, false, true); } // remove 'coap://' or 'coaps://' or 'coap+tcp://' or 'coap+gatt://' or 'coap+rfcomm://' @@ -161,8 +171,8 @@ void OCResource::setHost(const std::string& host) if (std::string::npos == bracket || 0 == bracket) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, true, false); } // extract the ipv6 address std::string ip6Addr = host_token.substr(1, bracket - 1); @@ -178,8 +188,8 @@ void OCResource::setHost(const std::string& host) const char *cAddr = ip6AddrToValidityCheck.c_str(); if (0 == inet_pton(AF_INET6, cAddr, &buf)) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), true, false, false); } //skip ']' and ':' characters in host string @@ -188,19 +198,26 @@ void OCResource::setHost(const std::string& host) if (0 > port || UINT16_MAX < port) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), true, false, false); + } + + OCStackResult result = OCDecodeAddressForRFC6874(m_devAddr.addr, + sizeof(m_devAddr.addr), ip6Addr.c_str(), nullptr); + + if (OC_STACK_OK != result) + { + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, true, false); } - ip6Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); - m_devAddr.addr[ip6Addr.length()] = '\0'; m_devAddr.port = static_cast(port); - m_devAddr.flags = static_cast(m_devAddr.flags & OC_IP_USE_V6); + m_devAddr.flags = static_cast(m_devAddr.flags | OC_IP_USE_V6); } else if (host_token[0] == ':') { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, false, true); } else { @@ -212,8 +229,8 @@ void OCResource::setHost(const std::string& host) // address validity check if (MAC_ADDR_STR_SIZE != macAddr.length()) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, true, false); } for (size_t blockCnt = 0; blockCnt < MAC_ADDR_BLOCKS; blockCnt++) @@ -222,8 +239,8 @@ void OCResource::setHost(const std::string& host) if (std::string::npos != block.find_first_not_of("0123456789ABCDEFabcdef")) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, true, false); } if (MAC_ADDR_BLOCKS - 1 > blockCnt) @@ -232,8 +249,8 @@ void OCResource::setHost(const std::string& host) if (':' != delimiter) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, true, false); } } } @@ -247,8 +264,8 @@ void OCResource::setHost(const std::string& host) if (colon == std::string::npos || colon == 0) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, true, false); } // extract the ipv4 address @@ -259,8 +276,8 @@ void OCResource::setHost(const std::string& host) const char *cAddr = ip4Addr.c_str(); if (0 == inet_pton(AF_INET, cAddr, &buf)) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), true, false, false); } //skip ':' characters in host string @@ -269,8 +286,8 @@ void OCResource::setHost(const std::string& host) if (0 > port || UINT16_MAX < port) { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, false); + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), true, false, false); } ip4Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); @@ -444,11 +461,6 @@ OCStackResult OCResource::observe(ObserveType observeType, const QueryParamsMap& queryParametersMap, ObserveCallback observeHandler, QualityOfService QoS) { - if (m_observeHandle != nullptr) - { - return result_guard(OC_STACK_INVALID_PARAM); - } - return checked_guard(m_clientWrapper.lock(), &IClientWrapper::ObserveResource, observeType, &m_observeHandle, m_devAddr, m_uri, queryParametersMap, m_headerOptions, @@ -506,7 +518,14 @@ std::string OCResource::host() const if (m_devAddr.adapter & OC_ADAPTER_TCP) { - ss << COAP_TCP; + if (m_devAddr.flags & OC_SECURE) + { + ss << COAPS_TCP; + } + else + { + ss << COAP_TCP; + } } else if (m_devAddr.adapter & OC_ADAPTER_GATT_BTLE) { @@ -530,7 +549,17 @@ std::string OCResource::host() const if (m_devAddr.flags & OC_IP_USE_V6) { - ss << '[' << m_devAddr.addr << ']'; + char addressEncoded[128] = {0}; + + OCStackResult result = OCEncodeAddressForRFC6874(addressEncoded, + sizeof(addressEncoded), + m_devAddr.addr); + if (OC_STACK_OK != result) + { + throw ResourceInitException(m_uri.empty(), false, m_resourceTypes.empty(), + m_interfaces.empty(), m_clientWrapper.expired(), false, true, false); + } + ss << '[' << addressEncoded << ']'; } else { @@ -586,6 +615,16 @@ std::string OCResource::sid() const return this->uniqueIdentifier().m_representation; } +std::string OCResource::deviceName() const +{ + return m_deviceName; +} + +OCDevAddr OCResource::getDevAddr() const +{ + return m_devAddr; +} + #ifdef WITH_MQ OCStackResult OCResource::discoveryMQTopics(const QueryParamsMap& queryParametersMap, MQTopicCallback attributeHandler,