X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fsrc%2FInProcClientWrapper.cpp;h=987c0f5727e655aacafd80a466b4cb243513c86d;hb=8c01dff2c5bc5496f7dc1632c498943ec6ecb015;hp=84a8f9395dc6d64fcfeab3fde2540a89ee832b9b;hpb=935fdb9b67b6c10d007e652e9e2e028fd6ccfe09;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/src/InProcClientWrapper.cpp b/resource/src/InProcClientWrapper.cpp index 84a8f93..987c0f5 100644 --- a/resource/src/InProcClientWrapper.cpp +++ b/resource/src/InProcClientWrapper.cpp @@ -23,6 +23,7 @@ #include "OCPlatform.h" #include "OCResource.h" +#include "ocpayload.h" #include using namespace std; @@ -38,7 +39,11 @@ namespace OC if(m_cfg.mode == ModeType::Client) { - OCStackResult result = OCInit(m_cfg.ipAddress.c_str(), m_cfg.port, OC_CLIENT); + OCTransportFlags serverFlags = + static_cast(m_cfg.serverConnectivity & CT_MASK_FLAGS); + OCTransportFlags clientFlags = + static_cast(m_cfg.clientConnectivity & CT_MASK_FLAGS); + OCStackResult result = OCInit1(OC_CLIENT, serverFlags, clientFlags); if(OC_STACK_OK != result) { @@ -94,28 +99,21 @@ namespace OC OCRepresentation parseGetSetCallback(OCClientResponse* clientResponse) { - if(clientResponse->resJSONPayload == nullptr || clientResponse->resJSONPayload[0] == '\0') - { + if(clientResponse->payload == nullptr || + ( + clientResponse->payload->type != PAYLOAD_TYPE_DEVICE && + clientResponse->payload->type != PAYLOAD_TYPE_PLATFORM && + clientResponse->payload->type != PAYLOAD_TYPE_REPRESENTATION + ) + ) + { + //OCPayloadDestroy(clientResponse->payload); return OCRepresentation(); } MessageContainer oc; - try - { - oc.setJSONRepresentation(clientResponse->resJSONPayload); - } - catch (cereal::RapidJSONException& ex) - { - oclog() <<"RapidJSON Exception in parseGetSetCallback: "<resJSONPayload<< ":" << std::flush; - throw OCException(OC::Exception::INVALID_REPRESENTATION, OC_STACK_INVALID_JSON); - } - catch (cereal::Exception& ex) - { - oclog() <<"Cereal Exception in parseGetSetCallback: "<resJSONPayload<< ":" << std::flush; - throw OCException(OC::Exception::INVALID_REPRESENTATION, OC_STACK_INVALID_JSON); - } + oc.setPayload(clientResponse->payload); + //OCPayloadDestroy(clientResponse->payload); std::vector::const_iterator it = oc.representations().begin(); if(it == oc.representations().end()) @@ -149,6 +147,13 @@ namespace OC return OC_STACK_KEEP_TRANSACTION; } + if(!clientResponse->payload || clientResponse->payload->type != PAYLOAD_TYPE_DISCOVERY) + { + oclog() << "listenCallback(): clientResponse payload was null or the wrong type" + << std::flush; + return OC_STACK_KEEP_TRANSACTION; + } + auto clientWrapper = context->clientWrapper.lock(); if(!clientWrapper) @@ -158,40 +163,24 @@ namespace OC return OC_STACK_KEEP_TRANSACTION; } - std::stringstream requestStream; - requestStream << clientResponse->resJSONPayload; - - try + ListenOCContainer container(clientWrapper, clientResponse->devAddr, + reinterpret_cast(clientResponse->payload)); + // loop to ensure valid construction of all resources + for(auto resource : container.Resources()) { - - ListenOCContainer container(clientWrapper, *clientResponse->addr, - clientResponse->connType, requestStream); - // loop to ensure valid construction of all resources - for(auto resource : container.Resources()) - { - std::thread exec(context->callback, resource); - exec.detach(); - } - - } - catch(const std::exception& e) - { - oclog() << "listenCallback failed to parse a malformed message: " - << e.what() - << std::endl - << clientResponse->resJSONPayload - << std::endl - << clientResponse->result - << std::flush; - return OC_STACK_KEEP_TRANSACTION; + std::thread exec(context->callback, resource); + exec.detach(); } + return OC_STACK_KEEP_TRANSACTION; } - OCStackResult InProcClientWrapper::ListenForResource(const std::string& serviceUrl, - const std::string& resourceType, OCConnectivityType connectivityType, - FindCallback& callback, QualityOfService QoS) + OCStackResult InProcClientWrapper::ListenForResource( + const std::string& serviceUrl, + const std::string& resourceType, + OCConnectivityType connectivityType, + FindCallback& callback, QualityOfService QoS) { if(!callback) { @@ -199,23 +188,23 @@ namespace OC } OCStackResult result; + ostringstream resourceUri; + resourceUri << serviceUrl << resourceType; - OCCallbackData cbdata = {0}; - - ClientCallbackContext::ListenContext* context = new ClientCallbackContext::ListenContext(); - context->callback = callback; - context->clientWrapper = shared_from_this(); - - cbdata.context = static_cast(context); - cbdata.cb = listenCallback; - cbdata.cd = [](void* c){delete static_cast(c);}; + ClientCallbackContext::ListenContext* context = + new ClientCallbackContext::ListenContext(callback, shared_from_this()); + OCCallbackData cbdata( + static_cast(context), + listenCallback, + [](void* c){delete static_cast(c);} + ); auto cLock = m_csdkLock.lock(); if(cLock) { std::lock_guard lock(*cLock); - result = OCDoResource(nullptr, OC_REST_GET, - resourceType.c_str(), + result = OCDoResource(nullptr, OC_REST_DISCOVER, + resourceUri.str().c_str(), nullptr, nullptr, connectivityType, static_cast(QoS), &cbdata, @@ -250,31 +239,35 @@ namespace OC return OC_STACK_KEEP_TRANSACTION; } - OCStackResult InProcClientWrapper::ListenForDevice(const std::string& serviceUrl, - const std::string& deviceURI, OCConnectivityType connectivityType, - FindDeviceCallback& callback, QualityOfService QoS) + OCStackResult InProcClientWrapper::ListenForDevice( + const std::string& serviceUrl, + const std::string& deviceURI, + OCConnectivityType connectivityType, + FindDeviceCallback& callback, + QualityOfService QoS) { if(!callback) { return OC_STACK_INVALID_PARAM; } OCStackResult result; + ostringstream deviceUri; + deviceUri << serviceUrl << deviceURI; - OCCallbackData cbdata = {0}; ClientCallbackContext::DeviceListenContext* context = - new ClientCallbackContext::DeviceListenContext(); - context->callback = callback; - context->clientWrapper = shared_from_this(); - cbdata.context = static_cast(context); - cbdata.cb = listenDeviceCallback; - cbdata.cd = [](void* c){delete static_cast(c);}; + new ClientCallbackContext::DeviceListenContext(callback, shared_from_this()); + OCCallbackData cbdata( + static_cast(context), + listenDeviceCallback, + [](void* c){delete static_cast(c);} + ); auto cLock = m_csdkLock.lock(); if(cLock) { std::lock_guard lock(*cLock); - result = OCDoResource(nullptr, OC_REST_GET, - deviceURI.c_str(), + result = OCDoResource(nullptr, OC_REST_DISCOVER, + deviceUri.str().c_str(), nullptr, nullptr, connectivityType, static_cast(QoS), &cbdata, @@ -341,8 +334,9 @@ namespace OC return OC_STACK_DELETE_TRANSACTION; } - OCStackResult InProcClientWrapper::GetResourceRepresentation(const std::string& host, - const std::string& uri, OCConnectivityType connectivityType, + OCStackResult InProcClientWrapper::GetResourceRepresentation( + const OCDevAddr& devAddr, + const std::string& resourceUri, const QueryParamsMap& queryParams, const HeaderOptions& headerOptions, GetCallback& callback, QualityOfService QoS) { @@ -351,26 +345,28 @@ namespace OC return OC_STACK_INVALID_PARAM; } OCStackResult result; - OCCallbackData cbdata = {0}; + ClientCallbackContext::GetContext* ctx = + new ClientCallbackContext::GetContext(callback); + OCCallbackData cbdata( + static_cast(ctx), + getResourceCallback, + [](void* c){delete static_cast(c);} + ); - ClientCallbackContext::GetContext* ctx = new ClientCallbackContext::GetContext(); - ctx->callback = callback; - cbdata.context = static_cast(ctx); - cbdata.cb = &getResourceCallback; - cbdata.cd = [](void* c){delete static_cast(c);}; + std::string uri = assembleSetResourceUri(resourceUri, queryParams); auto cLock = m_csdkLock.lock(); if(cLock) { - std::ostringstream os; - os << host << assembleSetResourceUri(uri, queryParams).c_str(); - std::lock_guard lock(*cLock); OCHeaderOption options[MAX_HEADER_OPTIONS]; - result = OCDoResource(nullptr, OC_REST_GET, os.str().c_str(), - nullptr, nullptr, connectivityType, + result = OCDoResource( + nullptr, OC_REST_GET, + uri.c_str(), + &devAddr, nullptr, + CT_DEFAULT, static_cast(QoS), &cbdata, assembleHeaderOptions(options, headerOptions), @@ -430,11 +426,11 @@ namespace OC for(auto& param : queryParams) { - paramsList << param.first <<'='<(ocInfo.getPayload()); } - OCStackResult InProcClientWrapper::PostResourceRepresentation(const std::string& host, - const std::string& uri, OCConnectivityType connectivityType, const OCRepresentation& rep, + OCStackResult InProcClientWrapper::PostResourceRepresentation( + const OCDevAddr& devAddr, + const std::string& uri, + const OCRepresentation& rep, const QueryParamsMap& queryParams, const HeaderOptions& headerOptions, PostCallback& callback, QualityOfService QoS) { @@ -460,18 +458,14 @@ namespace OC return OC_STACK_INVALID_PARAM; } OCStackResult result; - OCCallbackData cbdata = {0}; - - ClientCallbackContext::SetContext* ctx = new ClientCallbackContext::SetContext(); - ctx->callback = callback; - cbdata.cb = &setResourceCallback; - cbdata.cd = [](void* c){delete static_cast(c);}; - cbdata.context = static_cast(ctx); + ClientCallbackContext::SetContext* ctx = new ClientCallbackContext::SetContext(callback); + OCCallbackData cbdata( + static_cast(ctx), + setResourceCallback, + [](void* c){delete static_cast(c);} + ); - // TODO: in the future the cstack should be combining these two strings! - ostringstream os; - os << host << assembleSetResourceUri(uri, queryParams).c_str(); - // TODO: end of above + std::string url = assembleSetResourceUri(uri, queryParams); auto cLock = m_csdkLock.lock(); @@ -481,8 +475,9 @@ namespace OC OCHeaderOption options[MAX_HEADER_OPTIONS]; result = OCDoResource(nullptr, OC_REST_POST, - os.str().c_str(), nullptr, - assembleSetResourcePayload(rep).c_str(), connectivityType, + url.c_str(), &devAddr, + assembleSetResourcePayload(rep), + CT_DEFAULT, static_cast(QoS), &cbdata, assembleHeaderOptions(options, headerOptions), @@ -497,8 +492,10 @@ namespace OC return result; } - OCStackResult InProcClientWrapper::PutResourceRepresentation(const std::string& host, - const std::string& uri, OCConnectivityType connectivityType, const OCRepresentation& rep, + OCStackResult InProcClientWrapper::PutResourceRepresentation( + const OCDevAddr& devAddr, + const std::string& uri, + const OCRepresentation& rep, const QueryParamsMap& queryParams, const HeaderOptions& headerOptions, PutCallback& callback, QualityOfService QoS) { @@ -507,18 +504,14 @@ namespace OC return OC_STACK_INVALID_PARAM; } OCStackResult result; - OCCallbackData cbdata = {0}; + ClientCallbackContext::SetContext* ctx = new ClientCallbackContext::SetContext(callback); + OCCallbackData cbdata( + static_cast(ctx), + setResourceCallback, + [](void* c){delete static_cast(c);} + ); - ClientCallbackContext::SetContext* ctx = new ClientCallbackContext::SetContext(); - ctx->callback = callback; - cbdata.cb = &setResourceCallback; - cbdata.cd = [](void* c){delete static_cast(c);}; - cbdata.context = static_cast(ctx); - - // TODO: in the future the cstack should be combining these two strings! - ostringstream os; - os << host << assembleSetResourceUri(uri, queryParams).c_str(); - // TODO: end of above + std::string url = assembleSetResourceUri(uri, queryParams).c_str(); auto cLock = m_csdkLock.lock(); @@ -529,8 +522,9 @@ namespace OC OCHeaderOption options[MAX_HEADER_OPTIONS]; result = OCDoResource(&handle, OC_REST_PUT, - os.str().c_str(), nullptr, - assembleSetResourcePayload(rep).c_str(), connectivityType, + url.c_str(), &devAddr, + assembleSetResourcePayload(rep), + CT_DEFAULT, static_cast(QoS), &cbdata, assembleHeaderOptions(options, headerOptions), @@ -561,8 +555,9 @@ namespace OC return OC_STACK_DELETE_TRANSACTION; } - OCStackResult InProcClientWrapper::DeleteResource(const std::string& host, - const std::string& uri, OCConnectivityType connectivityType, + OCStackResult InProcClientWrapper::DeleteResource( + const OCDevAddr& devAddr, + const std::string& uri, const HeaderOptions& headerOptions, DeleteCallback& callback, QualityOfService QoS) { if(!callback) @@ -570,16 +565,13 @@ namespace OC return OC_STACK_INVALID_PARAM; } OCStackResult result; - OCCallbackData cbdata = {0}; - - ClientCallbackContext::DeleteContext* ctx = new ClientCallbackContext::DeleteContext(); - ctx->callback = callback; - cbdata.cb = &deleteResourceCallback; - cbdata.cd = [](void* c){delete static_cast(c);}; - cbdata.context = static_cast(ctx); - - ostringstream os; - os << host << uri; + ClientCallbackContext::DeleteContext* ctx = + new ClientCallbackContext::DeleteContext(callback); + OCCallbackData cbdata( + static_cast(ctx), + deleteResourceCallback, + [](void* c){delete static_cast(c);} + ); auto cLock = m_csdkLock.lock(); @@ -590,8 +582,9 @@ namespace OC std::lock_guard lock(*cLock); result = OCDoResource(nullptr, OC_REST_DELETE, - os.str().c_str(), nullptr, - nullptr, connectivityType, + uri.c_str(), &devAddr, + nullptr, + CT_DEFAULT, static_cast(m_cfg.QoS), &cbdata, assembleHeaderOptions(options, headerOptions), @@ -638,7 +631,8 @@ namespace OC } OCStackResult InProcClientWrapper::ObserveResource(ObserveType observeType, OCDoHandle* handle, - const std::string& host, const std::string& uri, OCConnectivityType connectivityType, + const OCDevAddr& devAddr, + const std::string& uri, const QueryParamsMap& queryParams, const HeaderOptions& headerOptions, ObserveCallback& callback, QualityOfService QoS) { @@ -647,13 +641,14 @@ namespace OC return OC_STACK_INVALID_PARAM; } OCStackResult result; - OCCallbackData cbdata = {0}; - ClientCallbackContext::ObserveContext* ctx = new ClientCallbackContext::ObserveContext(); - ctx->callback = callback; - cbdata.context = static_cast(ctx); - cbdata.cb = &observeResourceCallback; - cbdata.cd = [](void* c){delete static_cast(c);}; + ClientCallbackContext::ObserveContext* ctx = + new ClientCallbackContext::ObserveContext(callback); + OCCallbackData cbdata( + static_cast(ctx), + observeResourceCallback, + [](void* c){delete static_cast(c);} + ); OCMethod method; if (observeType == ObserveType::Observe) @@ -669,19 +664,19 @@ namespace OC method = OC_REST_OBSERVE_ALL; } + std::string url = assembleSetResourceUri(uri, queryParams).c_str(); + auto cLock = m_csdkLock.lock(); if(cLock) { - std::ostringstream os; - os << host << assembleSetResourceUri(uri, queryParams).c_str(); - std::lock_guard lock(*cLock); OCHeaderOption options[MAX_HEADER_OPTIONS]; result = OCDoResource(handle, method, - os.str().c_str(), nullptr, - nullptr, connectivityType, + url.c_str(), &devAddr, + nullptr, + CT_DEFAULT, static_cast(QoS), &cbdata, assembleHeaderOptions(options, headerOptions), @@ -696,9 +691,12 @@ namespace OC return result; } - OCStackResult InProcClientWrapper::CancelObserveResource(OCDoHandle handle, - const std::string& host, const std::string& uri, const HeaderOptions& headerOptions, - QualityOfService QoS) + OCStackResult InProcClientWrapper::CancelObserveResource( + OCDoHandle handle, + const std::string& host, // unused + const std::string& uri, // unused + const HeaderOptions& headerOptions, + QualityOfService QoS) { OCStackResult result; auto cLock = m_csdkLock.lock(); @@ -724,32 +722,19 @@ namespace OC OCStackApplicationResult subscribePresenceCallback(void* ctx, OCDoHandle handle, OCClientResponse* clientResponse) { - ostringstream os; - uint16_t port; - uint8_t a; - uint8_t b; - uint8_t c; - uint8_t d; + ClientCallbackContext::SubscribePresenceContext* context = + static_cast(ctx); - if(OCDevAddrToIPv4Addr(clientResponse->addr, &a, &b, &c, &d) == 0 && - OCDevAddrToPort(clientResponse->addr, &port) == 0) - { - os<(a)<<"."<(b)<<"."<(c) - <<"."<(d)<<":"<(port); + /* + * This a hack while we rethink presence subscription. + */ + std::string url = clientResponse->devAddr.addr; - ClientCallbackContext::SubscribePresenceContext* context = - static_cast(ctx); + std::thread exec(context->callback, clientResponse->result, + clientResponse->sequenceNumber, url); - std::thread exec(context->callback, clientResponse->result, - clientResponse->sequenceNumber, os.str()); + exec.detach(); - exec.detach(); - } - else - { - oclog() << "subscribePresenceCallback(): OCDevAddrToIPv4Addr() or OCDevAddrToPort() " - <<"failed"<< std::flush; - } return OC_STACK_KEEP_TRANSACTION; } @@ -761,19 +746,20 @@ namespace OC { return OC_STACK_INVALID_PARAM; } - OCCallbackData cbdata = {0}; ClientCallbackContext::SubscribePresenceContext* ctx = - new ClientCallbackContext::SubscribePresenceContext(); - ctx->callback = presenceHandler; - cbdata.cb = &subscribePresenceCallback; - cbdata.context = static_cast(ctx); - cbdata.cd = [](void* c) - {delete static_cast(c);}; + new ClientCallbackContext::SubscribePresenceContext(presenceHandler); + OCCallbackData cbdata( + static_cast(ctx), + subscribePresenceCallback, + [](void* c) + {delete static_cast(c);} + ); + auto cLock = m_csdkLock.lock(); std::ostringstream os; - os << host << OC_PRESENCE_URI; + os << host << OC_RSRVD_PRESENCE_URI; if(!resourceType.empty()) { @@ -786,8 +772,10 @@ namespace OC return OC_STACK_ERROR; } - return OCDoResource(handle, OC_REST_PRESENCE, os.str().c_str(), nullptr, nullptr, - connectivityType, OC_LOW_QOS, &cbdata, NULL, 0); + return OCDoResource(handle, OC_REST_PRESENCE, + os.str().c_str(), nullptr, + nullptr, connectivityType, + OC_LOW_QOS, &cbdata, NULL, 0); } OCStackResult InProcClientWrapper::UnsubscribePresence(OCDoHandle handle) @@ -826,11 +814,10 @@ namespace OC for (auto it=headerOptions.begin(); it != headerOptions.end(); ++it) { - options[i].protocolID = OC_COAP_ID; - options[i].optionID = static_cast(it->getOptionID()); - options[i].optionLength = (it->getOptionData()).length() + 1; - memcpy(options[i].optionData, (it->getOptionData()).c_str(), - (it->getOptionData()).length() + 1); + options[i] = OCHeaderOption(OC_COAP_ID, + it->getOptionID(), + it->getOptionData().length() + 1, + reinterpret_cast(it->getOptionData().c_str())); i++; }