virtual OCStackResult GetResourceRepresentation(
const OCDevAddr& devAddr,
- bool useHostString,
const std::string& uri,
const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions,
virtual OCStackResult PutResourceRepresentation(
const OCDevAddr& devAddr,
- bool useHostString,
const std::string& uri,
const OCRepresentation& rep, const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions,
virtual OCStackResult PostResourceRepresentation(
const OCDevAddr& devAddr,
- bool useHostString,
const std::string& uri,
const OCRepresentation& rep, const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions,
virtual OCStackResult DeleteResource(
const OCDevAddr& devAddr,
- bool useHostString,
const std::string& uri,
const HeaderOptions& headerOptions,
DeleteCallback& callback, QualityOfService QoS) = 0;
virtual OCStackResult ObserveResource(
ObserveType observeType, OCDoHandle* handle,
const OCDevAddr& devAddr,
- bool useHostString,
const std::string& uri,
const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions, ObserveCallback& callback,
FindDeviceCallback& callback, QualityOfService QoS);
virtual OCStackResult GetResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
GetCallback& callback, QualityOfService QoS);
virtual OCStackResult PutResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const OCRepresentation& attributes, const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions, PutCallback& callback, QualityOfService QoS);
virtual OCStackResult PostResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const OCRepresentation& attributes, const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions, PostCallback& callback, QualityOfService QoS);
virtual OCStackResult DeleteResource(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const HeaderOptions& headerOptions,
DeleteCallback& callback, QualityOfService QoS);
virtual OCStackResult ObserveResource(
ObserveType observeType, OCDoHandle* handle,
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
ObserveCallback& callback, QualityOfService QoS);
bool operator>=(const OCResource &other) const;
private:
+ void setHost(const std::string& host);
std::weak_ptr<IClientWrapper> m_clientWrapper;
std::string m_uri;
OCResourceIdentifier m_resourceId;
{return OC_STACK_NOTIMPL;}
virtual OCStackResult GetResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
GetCallback& callback, QualityOfService QoS)
{return OC_STACK_NOTIMPL;}
virtual OCStackResult PutResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const OCRepresentation& attributes, const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions, PutCallback& callback,
{return OC_STACK_NOTIMPL;}
virtual OCStackResult PostResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const OCRepresentation& attributes, const QueryParamsMap& queryParams,
const HeaderOptions& headerOptions, PostCallback& callback, QualityOfService QoS)
{return OC_STACK_NOTIMPL;}
virtual OCStackResult DeleteResource(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const HeaderOptions& headerOptions,
DeleteCallback& callback, QualityOfService QoS)
virtual OCStackResult ObserveResource(
ObserveType observeType, OCDoHandle* handle,
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
ObserveCallback& callback, QualityOfService QoS)
const std::string& uri,
const HeaderOptions& headerOptions, QualityOfService QoS)
{return OC_STACK_NOTIMPL;}
-
+
virtual OCStackResult SubscribePresence(
OCDoHandle* handle,
const std::string& host,
return OC_STACK_DELETE_TRANSACTION;
}
- OCStackResult InvokeDoResource(OCDoHandle *handle,
- OCMethod method,
- const char *requestUri,
- const OCDevAddr *destination,
- const char *request,
- OCConnectivityType connectivityType,
- OCQualityOfService qos,
- OCCallbackData *cbData,
- OCHeaderOption *options,
- uint8_t numOptions,
- bool useHostString)
- {
- if (useHostString)
- {
- ostringstream host;
- host << destination << requestUri;
- connectivityType = (OCConnectivityType)
- ((destination->adapter << CT_ADAPTER_SHIFT)
- | (destination->flags & CT_MASK_FLAGS));
- return OCDoResource(handle,
- method,
- host.str().c_str(),
- nullptr,
- request,
- connectivityType,
- qos,
- cbData,
- options,
- numOptions);
- }
- else
- {
- return OCDoResource(handle,
- method,
- requestUri,
- destination,
- request,
- connectivityType,
- qos,
- cbData,
- options,
- numOptions);
- }
- }
-
OCStackResult InProcClientWrapper::GetResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& resourceUri,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
GetCallback& callback, QualityOfService QoS)
std::lock_guard<std::recursive_mutex> lock(*cLock);
OCHeaderOption options[MAX_HEADER_OPTIONS];
- result = OCDoResource(nullptr, OC_REST_GET,
+ result = OCDoResource(
+ nullptr, OC_REST_GET,
uri.c_str(),
&devAddr, nullptr,
CT_DEFAULT,
}
OCStackResult InProcClientWrapper::PostResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const OCRepresentation& rep,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
}
OCStackResult InProcClientWrapper::PutResourceRepresentation(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const OCRepresentation& rep,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
}
OCStackResult InProcClientWrapper::DeleteResource(
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const HeaderOptions& headerOptions, DeleteCallback& callback, QualityOfService QoS)
{
}
OCStackResult InProcClientWrapper::ObserveResource(ObserveType observeType, OCDoHandle* handle,
- const OCDevAddr& devAddr, bool useHostString,
+ const OCDevAddr& devAddr,
const std::string& uri,
const QueryParamsMap& queryParams, const HeaderOptions& headerOptions,
ObserveCallback& callback, QualityOfService QoS)
namespace OC {
+static const char COAP[] = "coap://";
+static const char COAPS[] = "coaps://";
using OC::nil_guard;
using OC::result_guard;
using OC::checked_guard;
const std::vector<std::string>& resourceTypes,
const std::vector<std::string>& interfaces)
: m_clientWrapper(clientWrapper), m_uri(uri),
- m_resourceId(serverId, m_uri), m_devAddr(devAddr), m_useHostString(false),
+ m_resourceId(serverId, m_uri), m_devAddr(devAddr),
m_isObservable(observable), m_isCollection(false),
m_resourceTypes(resourceTypes), m_interfaces(interfaces),
m_observeHandle(nullptr)
: m_clientWrapper(clientWrapper), m_uri(uri),
m_resourceId(serverId, m_uri),
m_devAddr{ OC_DEFAULT_ADAPTER },
- m_useHostString(true),
m_isObservable(observable), m_isCollection(false),
m_resourceTypes(resourceTypes), m_interfaces(interfaces),
m_observeHandle(nullptr)
{
throw std::length_error("host address is too long.");
}
- host.copy(m_devAddr.addr, len);
- m_devAddr.addr[len] = '\0';
+
+ 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<OCTransportFlags>(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<OCTransportFlags>(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);
+ }
+
+ std::string ip6Addr = host_token.substr(0, found);
+ ip6Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr));
+ m_devAddr.addr[ip6Addr.length()] = '\0';
+ host_token = host_token.substr(found + 1);
+ }
+ 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';
+
+ host_token = host_token.substr(found + 1);
+ }
+
+ int port = 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<uint16_t>(port);
+
+}
+
OCStackResult OCResource::get(const QueryParamsMap& queryParametersMap,
GetCallback attributeHandler, QualityOfService QoS)
{
return checked_guard(m_clientWrapper.lock(),
&IClientWrapper::GetResourceRepresentation,
- m_devAddr, m_useHostString, m_uri,
+ m_devAddr, m_uri,
queryParametersMap, m_headerOptions,
attributeHandler, QoS);
}
QualityOfService QoS)
{
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PutResourceRepresentation,
- m_devAddr, m_useHostString, m_uri, rep, queryParametersMap,
+ m_devAddr, m_uri, rep, queryParametersMap,
m_headerOptions, attributeHandler, QoS);
}
QualityOfService QoS)
{
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
- m_devAddr, m_useHostString, m_uri, rep, queryParametersMap,
+ m_devAddr, m_uri, rep, queryParametersMap,
m_headerOptions, attributeHandler, QoS);
}
OCStackResult OCResource::deleteResource(DeleteCallback deleteHandler, QualityOfService QoS)
{
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource,
- m_devAddr, m_useHostString, m_uri, m_headerOptions, deleteHandler, QoS);
+ m_devAddr, m_uri, m_headerOptions, deleteHandler, QoS);
}
OCStackResult OCResource::deleteResource(DeleteCallback deleteHandler)
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::ObserveResource,
observeType, &m_observeHandle, m_devAddr,
- m_useHostString, m_uri, queryParametersMap, m_headerOptions,
+ m_uri, queryParametersMap, m_headerOptions,
observeHandler, QoS);
}
std::string OCResource::host() const
{
- if (m_useHostString)
- {
- return std::string(m_devAddr.addr);
- }
-
std::ostringstream ss;
if (m_devAddr.flags & OC_SECURE)
{
- ss << "coaps://";
+ ss << COAPS;
}
else
{
- ss << "coap://";
+ ss << COAP;
}
if (m_devAddr.flags & OC_IP_USE_V6)
{