OCStackResult sendResponseForResource(std::shared_ptr< OCResourceRequest > pRequest) { auto pResponse = std::make_shared< OC::OCResourceResponse >(); // Check for query params (if any) QueryParamsMap queryParamsMap = pRequest->getQueryParameters(); pResponse->setRequestHandle(pRequest->getRequestHandle()); pResponse->setResourceHandle(pRequest->getResourceHandle()); getFunc getFunction; getFunction = getGetFunction(pRequest->getResourceUri()); OCRepresentation rep; rep = getFunction(); auto findRes = queryParamsMap.find("if"); if (findRes != queryParamsMap.end()) { pResponse->setResourceRepresentation(rep, findRes->second); } else { pResponse->setResourceRepresentation(rep, DEFAULT_INTERFACE); } pResponse->setErrorCode(200); pResponse->setResponseResult(OC_EH_OK); return OCPlatform::sendResponse(pResponse); }
OCStackResult OCAccountManager::searchUser(const std::string& userUuid, const QueryParamsMap& queryParams, GetCallback cloudConnectHandler) { std::string uri = m_host + OC_RSRVD_ACCOUNT_URI; QueryParamsMap fullQuery = {}; if (!userUuid.empty()) { fullQuery.insert(std::make_pair(OC_RSRVD_USER_UUID, userUuid)); } if (!queryParams.empty()) { std::string searchQuery; for (auto iter : queryParams) { searchQuery.append(iter.first + ":" + iter.second + ","); } searchQuery.resize(searchQuery.size() - 1); fullQuery.insert(std::make_pair(OC_RSRVD_SEARCH, searchQuery)); } return checked_guard(m_clientWrapper.lock(), &IClientWrapper::GetResourceRepresentation, OCDevAddr(), uri, fullQuery, HeaderOptions(), m_connType, cloudConnectHandler, m_defaultQos); }
OCStackResult sendRoomResponse(std::shared_ptr<OCResourceRequest> pRequest) { auto pResponse = std::make_shared<OC::OCResourceResponse>(); pResponse->setRequestHandle(pRequest->getRequestHandle()); pResponse->setResourceHandle(pRequest->getResourceHandle()); // Check for query params (if any) QueryParamsMap queryParamsMap = pRequest->getQueryParameters(); cout << "\t\t\tquery params: \n"; for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) { cout << "\t\t\t\t" << it->first << ":" << it->second << endl; } OCRepresentation rep; rep = myRoomResource.getRoomRepresentation(); auto findRes = queryParamsMap.find("if"); if(findRes != queryParamsMap.end()) { pResponse->setResourceRepresentation(rep, findRes->second); } else { pResponse->setResourceRepresentation(rep, DEFAULT_INTERFACE); } pResponse->setErrorCode(200); pResponse->setResponseResult(OC_EH_OK); return OCPlatform::sendResponse(pResponse); }
std::string InProcClientWrapper::assembleSetResourceUri(std::string uri, const QueryParamsMap& queryParams) { if(uri.back() == '/') { uri.resize(uri.size()-1); } ostringstream paramsList; if(queryParams.size() > 0) { paramsList << '?'; } for(auto& param : queryParams) { paramsList << param.first <<'='<<param.second<<';'; } std::string queryString = paramsList.str(); if(queryString.back() == ';') { queryString.resize(queryString.size() - 1); } std::string ret = uri + queryString; return ret; }
OCStackResult OCAccountManager::signUp(const std::string& authProvider, const std::string& authCode, const QueryParamsMap& options, PostCallback cloudConnectHandler) { std::string uri = m_host + OC_RSRVD_ACCOUNT_URI; OCRepresentation rep; rep.setValue(OC_RSRVD_DEVICE_ID, m_deviceID); rep.setValue(OC_RSRVD_AUTHPROVIDER, authProvider); rep.setValue(OC_RSRVD_AUTHCODE, authCode); if (!options.empty()) { OCRepresentation optionsRep; for (auto iter : options) { optionsRep[iter.first] = iter.second; } rep.setValue(OC_RSRVD_OPTIONS, optionsRep); } return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation, OCDevAddr(), uri, rep, QueryParamsMap(), HeaderOptions(), m_connType, cloudConnectHandler, m_defaultQos); }
// This is just a sample implementation of entity handler. // Entity handler can be implemented in several ways by the manufacturer OCEntityHandlerResult entityHandler(std::shared_ptr<OCResourceRequest> request) { cout << "\tIn Server CPP entity handler:\n"; OCEntityHandlerResult ehResult = OC_EH_ERROR; if(request) { // Get the request type and request flag std::string requestType = request->getRequestType(); int requestFlag = request->getRequestHandlerFlag(); if(requestFlag & RequestHandlerFlag::RequestFlag) { cout << "\t\trequestFlag : Request\n"; auto pResponse = std::make_shared<OC::OCResourceResponse>(); pResponse->setRequestHandle(request->getRequestHandle()); pResponse->setResourceHandle(request->getResourceHandle()); // Check for query params (if any) QueryParamsMap queries = request->getQueryParameters(); if (!queries.empty()) { std::cout << "\nQuery processing upto entityHandler" << std::endl; } for (auto it : queries) { std::cout << "Query key: " << it.first << " value : " << it.second << std:: endl; } // If the request type is GET if(requestType == "GET") { cout << "\t\t\trequestType : GET\n"; if(isSlowResponse) // Slow response case { static int startedThread = 0; if(!startedThread) { std::thread t(handleSlowResponse, (void *)this, request); startedThread = 1; t.detach(); } ehResult = OC_EH_SLOW; } else // normal response case. { pResponse->setErrorCode(200); pResponse->setResponseResult(OC_EH_OK); pResponse->setResourceRepresentation(get()); if(OC_STACK_OK == OCPlatform::sendResponse(pResponse)) { ehResult = OC_EH_OK; } } } else if(requestType == "PUT") { cout << "\t\t\trequestType : PUT\n"; OCRepresentation rep = request->getResourceRepresentation(); // Do related operations related to PUT request // Update the lightResource put(rep); pResponse->setErrorCode(200); pResponse->setResponseResult(OC_EH_OK); pResponse->setResourceRepresentation(get()); if(OC_STACK_OK == OCPlatform::sendResponse(pResponse)) { ehResult = OC_EH_OK; } } else if(requestType == "POST") { cout << "\t\t\trequestType : POST\n"; OCRepresentation rep = request->getResourceRepresentation(); // Do related operations related to POST request OCRepresentation rep_post = post(rep); pResponse->setResourceRepresentation(rep_post); pResponse->setErrorCode(200); if(rep_post.hasAttribute("createduri")) { pResponse->setResponseResult(OC_EH_RESOURCE_CREATED); pResponse->setNewResourceUri(rep_post.getValue<std::string>("createduri")); } else { pResponse->setResponseResult(OC_EH_OK); } if(OC_STACK_OK == OCPlatform::sendResponse(pResponse)) { ehResult = OC_EH_OK; } } else if(requestType == "DELETE") { cout << "Delete request received" << endl; } } if(requestFlag & RequestHandlerFlag::ObserverFlag) { ObservationInfo observationInfo = request->getObservationInfo(); if(ObserveAction::ObserveRegister == observationInfo.action) { m_interestedObservers.push_back(observationInfo.obsId); } else if(ObserveAction::ObserveUnregister == observationInfo.action) { m_interestedObservers.erase(std::remove( m_interestedObservers.begin(), m_interestedObservers.end(), observationInfo.obsId), m_interestedObservers.end()); } pthread_t threadId; cout << "\t\trequestFlag : Observer\n"; gObservation = 1; static int startedThread = 0; // Observation happens on a different thread in ChangeLightRepresentation function. // If we have not created the thread already, we will create one here. if(!startedThread) { pthread_create (&threadId, NULL, ChangeLightRepresentation, (void *)this); startedThread = 1; } ehResult = OC_EH_OK; } } else { std::cout << "Request invalid" << std::endl; } return ehResult; }