// 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; }
// 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::InitFlag) { cout << "\t\trequestFlag : Init\n"; // entity handler to perform resource initialization operations } 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 queryParamsMap = request->getQueryParameters(); // Entity handler to check the validity of resourceTypeName and resource interfaces // It is Entity handler's responsibility to keep track of the list of resources prior to call // Requested method std::string interfaceName; std::string typeName; cout << "\t\t\tquery params: \n"; for(auto it : queryParamsMap) { cout << "\t\t\t\t" << it.first << ":" << it.second << endl; std::string firstQuery = it.first; if(firstQuery.find_first_of("if") == 0) { interfaceName = it.second; } else if(firstQuery.find_first_of("rt") == 0 ) { typeName = it.second; } } if(typeName.compare(resourceTypeLight) == 0 && interfaceName.compare(resourceInterfaceDefault) == 0) { ehResult = OC_EH_OK; } else { cout<< "\t\t Invalid ResourceInterface Type & Name received from Client"<<endl; } // If the request type is GET if(requestType == "GET" && ehResult == OC_EH_OK) { 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" && ehResult == OC_EH_OK) { 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" && ehResult == OC_EH_OK) { 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" && ehResult == OC_EH_OK) { // DELETE request operations } } 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; }