OCStackApplicationResult observeResourceCallback(void* ctx, OCDoHandle handle, OCClientResponse* clientResponse) { ClientCallbackContext::ObserveContext* context = static_cast<ClientCallbackContext::ObserveContext*>(ctx); OCRepresentation attrs; HeaderOptions serverHeaderOptions; uint32_t sequenceNumber = clientResponse->sequenceNumber; OCStackResult result = clientResponse->result; if(clientResponse->result == OC_STACK_OK) { parseServerHeaderOptions(clientResponse, serverHeaderOptions); try { attrs = parseGetSetCallback(clientResponse); } catch(OC::OCException& e) { result = e.code(); } } std::thread exec(context->callback, serverHeaderOptions, attrs, result, sequenceNumber); exec.detach(); if(sequenceNumber == OC_OBSERVE_DEREGISTER) { return OC_STACK_DELETE_TRANSACTION; } return OC_STACK_KEEP_TRANSACTION; }
OCStackApplicationResult setResourceCallback(void* ctx, OCDoHandle handle, OCClientResponse* clientResponse) { ClientCallbackContext::SetContext* context = static_cast<ClientCallbackContext::SetContext*>(ctx); OCRepresentation attrs; HeaderOptions serverHeaderOptions; OCStackResult result = clientResponse->result; if (OC_STACK_OK == result || OC_STACK_RESOURCE_CREATED == result || OC_STACK_RESOURCE_DELETED == result) { parseServerHeaderOptions(clientResponse, serverHeaderOptions); try { attrs = parseGetSetCallback(clientResponse); } catch(OC::OCException& e) { result = e.code(); } } std::thread exec(context->callback, serverHeaderOptions, attrs, result); exec.detach(); return OC_STACK_DELETE_TRANSACTION; }
OCStackApplicationResult getResourceCallback(void* ctx, OCDoHandle /*handle*/, OCClientResponse* clientResponse) { ClientCallbackContext::GetContext* context = static_cast<ClientCallbackContext::GetContext*>(ctx); OCRepresentation rep; HeaderOptions serverHeaderOptions; OCStackResult result = clientResponse->result; if(result == OC_STACK_OK) { parseServerHeaderOptions(clientResponse, serverHeaderOptions); try { rep = parseGetSetCallback(clientResponse); } catch(OC::OCException& e) { result = e.code(); } } std::thread exec(context->callback, serverHeaderOptions, rep, result); exec.detach(); return OC_STACK_DELETE_TRANSACTION; }
OCStackApplicationResult listenDeviceCallback(void* ctx, OCDoHandle handle, OCClientResponse* clientResponse) { ClientCallbackContext::DeviceListenContext* context = static_cast<ClientCallbackContext::DeviceListenContext*>(ctx); OCRepresentation rep = parseGetSetCallback(clientResponse); std::thread exec(context->callback, rep); exec.detach(); return OC_STACK_KEEP_TRANSACTION; }
OCStackApplicationResult listenDeviceCallback(void* ctx, OCDoHandle handle, OCClientResponse* clientResponse) { ClientCallbackContext::DeviceListenContext* context = static_cast<ClientCallbackContext::DeviceListenContext*>(ctx); try { OCRepresentation rep = parseGetSetCallback(clientResponse); std::thread exec(context->callback, rep); exec.detach(); } catch(OC::OCException& e) { oclog() <<"Exception in listenDeviceCallback, ignoring response: " <<e.what() <<std::flush; } return OC_STACK_KEEP_TRANSACTION; }
OCStackApplicationResult createMQTopicCallback(void* ctx, OCDoHandle /*handle*/, OCClientResponse* clientResponse) { ClientCallbackContext::CreateMQTopicContext* context = static_cast<ClientCallbackContext::CreateMQTopicContext*>(ctx); OCRepresentation rep; HeaderOptions serverHeaderOptions; if (!clientResponse) { return OC_STACK_DELETE_TRANSACTION; } std::string createdUri; OCStackResult result = clientResponse->result; if (OC_STACK_OK == result || OC_STACK_RESOURCE_CREATED == result) { parseServerHeaderOptions(clientResponse, serverHeaderOptions); try { rep = parseGetSetCallback(clientResponse); } catch(OC::OCException& e) { result = e.code(); } bool isLocationOption = false; for (auto headerOption : serverHeaderOptions) { if (HeaderOption::LOCATION_PATH_OPTION_ID == headerOption.getOptionID()) { createdUri += "/"; createdUri += headerOption.getOptionData(); if (!isLocationOption) { isLocationOption = true; } } } if (!isLocationOption) { createdUri = clientResponse->resourceUri; } } auto clientWrapper = context->clientWrapper.lock(); if (!clientWrapper) { oclog() << "createMQTopicCallback(): failed to get a shared_ptr to the client wrapper" << std::flush; return OC_STACK_DELETE_TRANSACTION; } try{ if (OC_STACK_OK == result || OC_STACK_RESOURCE_CREATED == result) { ListenOCContainer container(clientWrapper, clientResponse->devAddr, createdUri); for (auto resource : container.Resources()) { std::thread exec(context->callback, serverHeaderOptions, rep, result, resource); exec.detach(); } } else { std::thread exec(context->callback, serverHeaderOptions, rep, result, nullptr); exec.detach(); } } catch (std::exception &e){ oclog() << "Exception in createMQTopicCallback, ignoring response: " << e.what() << std::flush; } return OC_STACK_DELETE_TRANSACTION; }