X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fsrc%2FOCResource.cpp;h=1d35ea2231ba8082b65dd40af5747357020fd694;hb=8c01dff2c5bc5496f7dc1632c498943ec6ecb015;hp=2ad836ad687614dc5170e938e37f78e3b05ca2c1;hpb=935fdb9b67b6c10d007e652e9e2e028fd6ccfe09;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/src/OCResource.cpp b/resource/src/OCResource.cpp index 2ad836a..1d35ea2 100644 --- a/resource/src/OCResource.cpp +++ b/resource/src/OCResource.cpp @@ -22,23 +22,25 @@ #include "OCUtilities.h" #include +#include namespace OC { +static const char COAP[] = "coap://"; +static const char COAPS[] = "coaps://"; using OC::nil_guard; using OC::result_guard; using OC::checked_guard; -OCResource::OCResource(std::weak_ptr clientWrapper, const std::string& host, - const std::string& uri, const std::string& serverId, - OCConnectivityType connectivityType, bool observable, - const std::vector& resourceTypes, - const std::vector& interfaces) - : m_clientWrapper(clientWrapper), m_uri(uri), m_resourceId(serverId, m_uri), - m_host(host), - m_connectivityType(connectivityType), - m_isObservable(observable), - m_isCollection(false), m_resourceTypes(resourceTypes), m_interfaces(interfaces), +OCResource::OCResource(std::weak_ptr clientWrapper, + const OCDevAddr& devAddr, const std::string& uri, + const std::string& serverId, bool observable, + const std::vector& resourceTypes, + const std::vector& interfaces) + : m_clientWrapper(clientWrapper), m_uri(uri), + m_resourceId(serverId, m_uri), m_devAddr(devAddr), + m_isObservable(observable), m_isCollection(false), + m_resourceTypes(resourceTypes), m_interfaces(interfaces), m_observeHandle(nullptr) { m_isCollection = std::find(m_interfaces.begin(), m_interfaces.end(), LINK_INTERFACE) @@ -54,16 +56,124 @@ OCResource::OCResource(std::weak_ptr clientWrapper, const std::s } } +OCResource::OCResource(std::weak_ptr clientWrapper, + const std::string& host, const std::string& uri, + const std::string& serverId, + OCConnectivityType connectivityType, bool observable, + const std::vector& resourceTypes, + const std::vector& interfaces) + : m_clientWrapper(clientWrapper), m_uri(uri), + m_resourceId(serverId, m_uri), + m_devAddr{ OC_DEFAULT_ADAPTER }, + m_isObservable(observable), m_isCollection(false), + m_resourceTypes(resourceTypes), m_interfaces(interfaces), + m_observeHandle(nullptr) +{ + m_isCollection = std::find(m_interfaces.begin(), m_interfaces.end(), LINK_INTERFACE) + != m_interfaces.end(); + + if (m_uri.empty() || + resourceTypes.empty() || + interfaces.empty()|| + m_clientWrapper.expired()) + { + throw ResourceInitException(m_uri.empty(), resourceTypes.empty(), + interfaces.empty(), m_clientWrapper.expired(), false, false); + } + + // construct the devAddr from the pieces we have + m_devAddr.adapter = static_cast(connectivityType >> CT_ADAPTER_SHIFT); + m_devAddr.flags = static_cast(connectivityType & CT_MASK_FLAGS); + size_t len = host.length(); + if (len >= MAX_ADDR_STR_SIZE) + { + throw std::length_error("host address is too long."); + } + + 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(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(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); + } + // extract the ipaddress + std::string ip6Addr = host_token.substr(1, found-1); + ip6Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); + m_devAddr.addr[ip6Addr.length()] = '\0'; + //skip ']' and ':' characters in host string + host_token = host_token.substr(found + 2); + } + 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'; + //skip ':' character in host string + host_token = host_token.substr(found + 1); + } + + int port = std::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(port); + +} + OCStackResult OCResource::get(const QueryParamsMap& queryParametersMap, GetCallback attributeHandler, QualityOfService QoS) { - return checked_guard(m_clientWrapper.lock(), &IClientWrapper::GetResourceRepresentation, - m_host, m_uri, m_connectivityType, queryParametersMap, m_headerOptions, - attributeHandler, QoS); + return checked_guard(m_clientWrapper.lock(), + &IClientWrapper::GetResourceRepresentation, + m_devAddr, m_uri, + queryParametersMap, m_headerOptions, + attributeHandler, QoS); } OCStackResult OCResource::get(const QueryParamsMap& queryParametersMap, @@ -107,7 +217,7 @@ OCStackResult OCResource::put(const OCRepresentation& rep, QualityOfService QoS) { return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PutResourceRepresentation, - m_host, m_uri, m_connectivityType, rep, queryParametersMap, + m_devAddr, m_uri, rep, queryParametersMap, m_headerOptions, attributeHandler, QoS); } @@ -157,7 +267,7 @@ OCStackResult OCResource::post(const OCRepresentation& rep, QualityOfService QoS) { return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation, - m_host, m_uri, m_connectivityType, rep, queryParametersMap, + m_devAddr, m_uri, rep, queryParametersMap, m_headerOptions, attributeHandler, QoS); } @@ -205,7 +315,7 @@ OCStackResult OCResource::post(const std::string& resourceType, OCStackResult OCResource::deleteResource(DeleteCallback deleteHandler, QualityOfService QoS) { return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource, - m_host, m_uri, m_connectivityType, m_headerOptions, deleteHandler, QoS); + m_devAddr, m_uri, m_headerOptions, deleteHandler, QoS); } OCStackResult OCResource::deleteResource(DeleteCallback deleteHandler) @@ -226,8 +336,8 @@ OCStackResult OCResource::observe(ObserveType observeType, } return checked_guard(m_clientWrapper.lock(), &IClientWrapper::ObserveResource, - observeType, &m_observeHandle, m_host, - m_uri, m_connectivityType, queryParametersMap, m_headerOptions, + observeType, &m_observeHandle, m_devAddr, + m_uri, queryParametersMap, m_headerOptions, observeHandler, QoS); } @@ -256,7 +366,7 @@ OCStackResult OCResource::cancelObserve(QualityOfService QoS) OCStackResult result = checked_guard(m_clientWrapper.lock(), &IClientWrapper::CancelObserveResource, - m_observeHandle, m_host, m_uri, m_headerOptions, QoS); + m_observeHandle, "", m_uri, m_headerOptions, QoS); if(result == OC_STACK_OK) { @@ -268,7 +378,28 @@ OCStackResult OCResource::cancelObserve(QualityOfService QoS) std::string OCResource::host() const { - return m_host; + std::ostringstream ss; + if (m_devAddr.flags & OC_SECURE) + { + ss << COAPS; + } + else + { + ss << COAP; + } + if (m_devAddr.flags & OC_IP_USE_V6) + { + ss << '[' << m_devAddr.addr << ']'; + } + else + { + ss << m_devAddr.addr; + } + if (m_devAddr.port) + { + ss << ':' << m_devAddr.port; + } + return ss.str(); } std::string OCResource::uri() const @@ -278,7 +409,8 @@ std::string OCResource::uri() const OCConnectivityType OCResource::connectivityType() const { - return m_connectivityType; + return static_cast( + (m_devAddr.adapter << CT_ADAPTER_SHIFT) | (m_devAddr.flags & CT_MASK_FLAGS)); } bool OCResource::isObservable() const @@ -286,7 +418,6 @@ bool OCResource::isObservable() const return m_isObservable; } - OCResourceIdentifier OCResource::uniqueIdentifier() const { return m_resourceId; @@ -335,7 +466,6 @@ OCResourceIdentifier::OCResourceIdentifier(const std::string& wireServerIdentifi std::ostream& operator <<(std::ostream& os, const OCResourceIdentifier& ri) { - os << ri.m_representation<