1 /******************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
21 #include "simulator_single_resource_impl.h"
22 #include "simulator_utils.h"
23 #include "oc_interface_details.h"
24 #include "simulator_logger.h"
27 #define TAG "SIMULATOR_SINGLE_RESOURCE"
29 SimulatorSingleResourceImpl::SimulatorSingleResourceImpl()
31 m_type = SimulatorResource::Type::SINGLE_RESOURCE;
32 m_interfaces.push_back(OC::DEFAULT_INTERFACE);
33 m_property = static_cast<OCResourceProperty>(OC_DISCOVERABLE | OC_OBSERVABLE);
34 m_resModelSchema = SimulatorResourceModelSchema::build();
36 // Set resource supports GET, PUT and POST by default
37 m_requestModels["GET"] = nullptr;
38 m_requestModels["POST"] = nullptr;
39 m_requestModels["PUT"] = nullptr;
41 m_resourceHandle = nullptr;
44 void SimulatorSingleResourceImpl::setName(const std::string &name)
46 VALIDATE_INPUT(name.empty(), "Name is empty!")
50 void SimulatorSingleResourceImpl::setURI(const std::string &uri)
52 VALIDATE_INPUT(uri.empty(), "Uri is empty!")
54 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
57 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
58 "URI can not be set when resource is started!");
64 void SimulatorSingleResourceImpl::setResourceType(const std::string &resourceType)
66 VALIDATE_INPUT(resourceType.empty(), "Resource type is empty!")
68 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
71 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
72 "Resource type cannot be set when resource is started!");
75 m_resourceType = resourceType;
78 void SimulatorSingleResourceImpl::setInterface(const std::string &interfaceType)
80 VALIDATE_INPUT(interfaceType.empty(), "Interface type list is empty!")
82 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
85 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
86 "Resource interface can not be reset when resource is started!");
89 m_interfaces = {interfaceType};
92 void SimulatorSingleResourceImpl::setInterface(const std::vector<std::string> &interfaceTypes)
94 VALIDATE_INPUT(interfaceTypes.empty(), "Interface type list is empty!")
96 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
99 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
100 "Resource interface can not be reset when resource is started!");
103 m_interfaces.clear();
104 for (auto &interfaceType : interfaceTypes)
106 if (m_interfaces.end() ==
107 std::find(m_interfaces.begin(), m_interfaces.end(), interfaceType))
109 m_interfaces.push_back(interfaceType);
114 void SimulatorSingleResourceImpl::addInterface(const std::string &interfaceType)
116 VALIDATE_INPUT(interfaceType.empty(), "Interface type is empty!")
118 if (m_interfaces.end() != std::find(m_interfaces.begin(), m_interfaces.end(), interfaceType))
120 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
121 << "Resource already supporting this Interface: " << interfaceType)
125 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
126 if (m_resourceHandle)
128 typedef OCStackResult (*bindInterfaceToResource)(const OCResourceHandle &,
129 const std::string &);
131 invokeocplatform(static_cast<bindInterfaceToResource>(
132 OC::OCPlatform::bindInterfaceToResource), m_resourceHandle,
136 m_interfaces.push_back(interfaceType);
139 void SimulatorSingleResourceImpl::setObservable(bool state)
141 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
142 if (m_resourceHandle)
144 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
145 "Observation state can not be changed when resource is started!");
149 m_property = static_cast<OCResourceProperty>(m_property | OC_OBSERVABLE);
151 m_property = static_cast<OCResourceProperty>(m_property ^ OC_OBSERVABLE);
154 void SimulatorSingleResourceImpl::setDiscoverable(bool state)
156 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
157 if (m_resourceHandle)
159 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
160 "Discoverable state can not be changed when resource is started!");
164 m_property = static_cast<OCResourceProperty>(m_property | OC_DISCOVERABLE);
166 m_property = static_cast<OCResourceProperty>(m_property ^ OC_DISCOVERABLE);
169 void SimulatorSingleResourceImpl::setObserverCallback(ObserverCallback callback)
171 VALIDATE_CALLBACK(callback)
172 m_observeCallback = callback;
175 void SimulatorSingleResourceImpl::setModelChangeCallback(ResourceModelUpdateCallback callback)
177 VALIDATE_CALLBACK(callback)
178 m_modelCallback = callback;
181 bool SimulatorSingleResourceImpl::isObservable() const
183 return ((m_property & OC_OBSERVABLE) == OC_OBSERVABLE);
186 bool SimulatorSingleResourceImpl::isDiscoverable() const
188 return ((m_property & OC_DISCOVERABLE) == OC_DISCOVERABLE);
191 bool SimulatorSingleResourceImpl::isStarted() const
193 return (nullptr != m_resourceHandle);
196 void SimulatorSingleResourceImpl::start()
198 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
199 if (m_resourceHandle)
201 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Resource already started!")
205 if (m_uri.empty() || m_resourceType.empty())
207 throw SimulatorException(SIMULATOR_ERROR, "Incomplete data to start resource!");
210 typedef OCStackResult (*RegisterResource)(OCResourceHandle &, std::string &,
211 const std::string &, const std::string &, OC::EntityHandler, uint8_t);
213 invokeocplatform(static_cast<RegisterResource>(OC::OCPlatform::registerResource),
214 m_resourceHandle, m_uri, m_resourceType, m_interfaces[0],
215 std::bind(&SimulatorSingleResourceImpl::handleRequests,
216 this, std::placeholders::_1), m_property);
218 for (size_t index = 1; m_interfaces.size() > 1 && index < m_interfaces.size(); index++)
220 typedef OCStackResult (*bindInterfaceToResource)(const OCResourceHandle &,
221 const std::string &);
225 invokeocplatform(static_cast<bindInterfaceToResource>(
226 OC::OCPlatform::bindInterfaceToResource), m_resourceHandle,
227 m_interfaces[index]);
229 catch (SimulatorException &e)
237 void SimulatorSingleResourceImpl::stop()
239 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
240 if (!m_resourceHandle)
242 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Resource is not started yet!")
246 // Stop all the update automation of this resource
247 m_updateAutomationMgr.stopAll();
249 // Clear all the observers
250 removeAllObservers();
252 // Unregister the resource from stack
253 typedef OCStackResult (*UnregisterResource)(const OCResourceHandle &);
255 invokeocplatform(static_cast<UnregisterResource>(OC::OCPlatform::unregisterResource),
258 m_resourceHandle = nullptr;
261 SimulatorResourceModel SimulatorSingleResourceImpl::getResourceModel()
263 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
267 std::vector<ObserverInfo> SimulatorSingleResourceImpl::getObservers() const
269 return m_observersList;
272 void SimulatorSingleResourceImpl::notify(int observerID)
274 SimulatorResourceModel resModel;
276 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
277 resModel = m_resModel;
280 notify(observerID, resModel);
283 void SimulatorSingleResourceImpl::notifyAll()
285 SimulatorResourceModel resModel;
287 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
288 resModel = m_resModel;
294 bool SimulatorSingleResourceImpl::getAttribute(const std::string &attrName,
295 SimulatorResourceAttribute &attribute)
297 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
298 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
300 if (m_resModel.contains(attrName))
302 attribute.setName(attrName);
303 attribute.setValue(m_resModel.getAttributeValue(attrName));
304 attribute.setProperty(m_resModelSchema->get(attrName));
311 std::map<std::string, SimulatorResourceAttribute>
312 SimulatorSingleResourceImpl::getAttributes()
314 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
315 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
317 std::map<std::string, SimulatorResourceAttribute> attributes;
318 for (auto &attributeEntry : m_resModel.getAttributeValues())
320 SimulatorResourceAttribute attribute(attributeEntry.first);
321 attribute.setValue(attributeEntry.second);
323 attribute.setProperty(m_resModelSchema->get(attributeEntry.first));
324 attributes[attributeEntry.first] = attribute;
330 bool SimulatorSingleResourceImpl::addAttribute(
331 const SimulatorResourceAttribute &attribute, bool notify)
333 if (attribute.getName().empty() || nullptr == attribute.getProperty())
338 // Add attribute to resource representation and its schema
339 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
340 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
342 if (!m_resModel.add(attribute.getName(), attribute.getValue()))
347 m_resModelSchema->add(attribute.getName(), attribute.getProperty());
349 if (notify && isStarted())
355 catch (SimulatorException &e)
357 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
365 bool SimulatorSingleResourceImpl::updateAttributeValue(
366 const SimulatorResourceAttribute &attribute, bool notify)
368 if (attribute.getName().empty())
373 // Validate the new value against attribute schema property
374 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
375 auto property = m_resModelSchema->get(attribute.getName());
376 if (!(property->validate(attribute.getValue())))
381 // Update the attribute value
382 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
383 if (!m_resModel.update(attribute.getName(), attribute.getValue()))
388 if (notify && isStarted())
394 catch (SimulatorException &e)
396 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
404 bool SimulatorSingleResourceImpl::removeAttribute(
405 const std::string &attrName, bool notify)
407 if (attrName.empty())
412 // Remove attribute from resource representation and its schema
413 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
414 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
416 m_resModelSchema->remove(attrName);
417 if (!m_resModel.remove(attrName))
422 if (notify && isStarted())
428 catch (SimulatorException &e)
430 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
438 int SimulatorSingleResourceImpl::startResourceUpdation(AutoUpdateType type,
439 int updateInterval, AutoUpdateCompleteCallback callback)
441 VALIDATE_CALLBACK(callback)
443 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
444 if (!m_resourceHandle)
446 throw SimulatorException(SIMULATOR_NO_RESOURCE, "Resource is not started!");
449 return m_updateAutomationMgr.startResourceAutomation(shared_from_this(), type,
450 updateInterval, callback);
453 int SimulatorSingleResourceImpl::startAttributeUpdation(const std::string &attrName,
454 AutoUpdateType type, int updateInterval, AutoUpdateCompleteCallback callback)
456 VALIDATE_CALLBACK(callback)
458 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
459 if (!m_resourceHandle)
461 throw SimulatorException(SIMULATOR_NO_RESOURCE, "Resource is not started!");
464 return m_updateAutomationMgr.startAttributeAutomation(shared_from_this(), attrName,
465 type, updateInterval, callback);
468 std::vector<int> SimulatorSingleResourceImpl::getResourceUpdations()
470 return m_updateAutomationMgr.getResourceAutomationIds();
473 std::vector<int> SimulatorSingleResourceImpl::getAttributeUpdations()
475 return m_updateAutomationMgr.getAttributeAutomationIds();
478 void SimulatorSingleResourceImpl::stopUpdation(const int id)
480 m_updateAutomationMgr.stop(id);
483 void SimulatorSingleResourceImpl::notifyApp()
487 m_modelCallback(m_uri, m_resModel);
491 void SimulatorSingleResourceImpl::notifyApp(const SimulatorResourceModel &resModel)
495 m_modelCallback(m_uri, resModel);
499 void SimulatorSingleResourceImpl::setResourceModel(const SimulatorResourceModel &resModel)
501 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
502 m_resModel = resModel;
505 void SimulatorSingleResourceImpl::setResourceModelSchema(
506 const std::shared_ptr<SimulatorResourceModelSchema> &resModelSchema)
508 std::lock_guard<std::mutex> lock(m_modelSchemaLock);
509 m_resModelSchema = resModelSchema;
512 void SimulatorSingleResourceImpl::setRequestModel(
513 const std::unordered_map<std::string, std::shared_ptr<RequestModel>> &requestModels)
515 m_requestModels = requestModels;
518 bool SimulatorSingleResourceImpl::updateResourceModel(const SimulatorResourceModel &reqResModel,
519 SimulatorResourceModel &updatedResModel, bool overwrite, bool notify)
521 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
522 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
524 size_t reqModelSize = reqResModel.size();
525 SimulatorResourceModel tempResModel;
527 for (auto &attributeName : m_resModel.getAttributeNameSet())
529 // Break the loop if update request model has no more attributes for validation.
535 // Check attribute presence criteria
536 if (!reqResModel.contains(attributeName))
546 if (!(m_resModel.getType(attributeName) == reqResModel.getType(attributeName)))
551 // Validate the new value against attribute schema property
552 auto property = m_resModelSchema->get(attributeName);
553 if (!(property->validate(reqResModel.getAttributeValue(attributeName))))
558 tempResModel.add(attributeName, reqResModel.getAttributeValue(attributeName));
561 // Validation is success, now update the attribute values.
562 for (auto &valueEntry : tempResModel.getAttributeValues())
564 m_resModel.update(valueEntry.first, valueEntry.second);
567 updatedResModel = m_resModel;
569 if (notify && isStarted())
575 catch (SimulatorException &e)
577 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
585 void SimulatorSingleResourceImpl::notify(int observerID, const SimulatorResourceModel &resModel)
587 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
588 if (!m_resourceHandle)
591 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse);
592 response->setErrorCode(200);
593 response->setResponseResult(OC_EH_OK);
594 response->setResourceRepresentation(resModel.asOCRepresentation(), m_interfaces[0]);
596 OC::ObservationIds observers;
597 observers.push_back(observerID);
599 typedef OCStackResult (*NotifyListOfObservers)(OCResourceHandle, OC::ObservationIds &,
600 const std::shared_ptr<OC::OCResourceResponse>);
602 invokeocplatform(static_cast<NotifyListOfObservers>(OC::OCPlatform::notifyListOfObservers),
603 m_resourceHandle, observers, response);
606 void SimulatorSingleResourceImpl::notifyAll(const SimulatorResourceModel &resModel)
608 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
609 if (!m_resourceHandle)
612 if (!m_observersList.size())
615 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse);
616 response->setErrorCode(200);
617 response->setResponseResult(OC_EH_OK);
618 response->setResourceRepresentation(resModel.asOCRepresentation(), m_interfaces[0]);
620 OC::ObservationIds observers;
621 for (auto &observer : m_observersList)
622 observers.push_back(observer.id);
624 typedef OCStackResult (*NotifyListOfObservers)(OCResourceHandle, OC::ObservationIds &,
625 const std::shared_ptr<OC::OCResourceResponse>);
627 invokeocplatform(static_cast<NotifyListOfObservers>(OC::OCPlatform::notifyListOfObservers),
628 m_resourceHandle, observers, response);
631 void SimulatorSingleResourceImpl::setCommonProperties(OC::OCRepresentation &ocResRep)
633 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
634 ocResRep.setValue("rt", m_resourceType);
635 ocResRep.setValue("if", m_interfaces);
636 ocResRep.setValue("n", m_name);
639 OCEntityHandlerResult SimulatorSingleResourceImpl::handleRequests(
640 std::shared_ptr<OC::OCResourceRequest> request)
644 OC_LOG(ERROR, TAG, "Request received from stack is null!");
648 OCEntityHandlerResult result = OC_EH_OK;
650 // Handle GET, PUT, POST and DELETE requests
651 if (OC::RequestHandlerFlag::RequestFlag & request->getRequestHandlerFlag())
654 OC::OCRepresentation rep = request->getResourceRepresentation();
655 std::string payload = getPayloadString(rep);
656 SIM_LOG(ILogger::INFO, "[" << m_uri << "] " << request->getRequestType()
657 << " request received. \n**Payload details**\n" << payload)
660 if ("GET" == request->getRequestType())
662 result = handleGET(request);
664 else if ("PUT" == request->getRequestType())
666 result = handlePUT(request);
668 else if ("POST" == request->getRequestType())
670 result = handlePOST(request);
672 else if ("DELETE" == request->getRequestType())
674 result = handleDELETE(request);
678 // Handle OBSERVE requests
679 if ((OC::RequestHandlerFlag::ObserverFlag & request->getRequestHandlerFlag())
682 OC::ObservationInfo observationInfo = request->getObservationInfo();
683 if (OC::ObserveAction::ObserveRegister == observationInfo.action)
685 addObserver(observationInfo);
686 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Observer added [id: "
687 << (int)observationInfo.obsId << ", address: " << observationInfo.address
688 << ", port: " << observationInfo.port << "].");
690 else if (OC::ObserveAction::ObserveUnregister == observationInfo.action)
692 removeObserver(observationInfo);
693 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Observer removed [id: "
694 << (int)observationInfo.obsId << ", address: " << observationInfo.address
695 << ", port: " << observationInfo.port << "].");
702 void SimulatorSingleResourceImpl::addObserver(const OC::ObservationInfo &ocObserverInfo)
704 ObserverInfo info {ocObserverInfo.obsId, ocObserverInfo.address, ocObserverInfo.port};
705 m_observersList.push_back(info);
707 if (m_observeCallback)
708 m_observeCallback(m_uri, ObservationStatus::REGISTER, info);
711 void SimulatorSingleResourceImpl::removeObserver(const OC::ObservationInfo &ocObserverInfo)
715 for (auto iter = m_observersList.begin(); iter != m_observersList.end(); iter++)
717 if ((*iter).id == ocObserverInfo.obsId)
721 m_observersList.erase(iter);
726 if (found && m_observeCallback)
727 m_observeCallback(m_uri, ObservationStatus::UNREGISTER, info);
730 void SimulatorSingleResourceImpl::removeAllObservers()
732 std::vector<ObserverInfo> observerList = m_observersList;
733 m_observersList.clear();
734 for (size_t index = 0; index < observerList.size(); index++)
736 if (m_observeCallback)
737 m_observeCallback(m_uri, ObservationStatus::UNREGISTER, observerList[index]);
741 OCEntityHandlerResult SimulatorSingleResourceImpl::handleGET(
742 const std::shared_ptr<OC::OCResourceRequest> &request)
744 // Check if resource support GET request
745 if (m_requestModels.end() == m_requestModels.find("GET"))
747 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
748 << "Resource does not support GET request!")
749 return sendResponse(request, 405, OC_EH_ERROR);
752 // Handling interface query parameter "if"
753 auto interfaceType = m_interfaces[0];
754 auto requestQueryParams = request->getQueryParameters();
755 if (requestQueryParams.end() != requestQueryParams.find("if"))
757 interfaceType = requestQueryParams["if"];
760 if (!isValidInterface(interfaceType, "GET"))
762 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
763 << "GET request received on invalid interface : " << interfaceType)
767 OC::OCRepresentation resourceRep = getResourceModel().asOCRepresentation();
769 // Add common properties to resource representation if interface is
770 // neither "oic.if.a" nor "oic.if.s".
771 if (OC::ACTUATOR_INTERFACE != interfaceType &&
772 OC::SENSOR_INTERFACE != interfaceType)
774 setCommonProperties(resourceRep);
777 return sendResponse(request, 200, OC_EH_OK, resourceRep, interfaceType);
780 OCEntityHandlerResult SimulatorSingleResourceImpl::handlePUT(
781 const std::shared_ptr<OC::OCResourceRequest> &request)
783 // Check if resource support PUT request
784 if (m_requestModels.end() == m_requestModels.find("PUT"))
786 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
787 << "Resource does not support PUT request!")
788 return sendResponse(request, 405, OC_EH_ERROR);
791 // Handling interface query parameter "if"
792 auto interfaceType = m_interfaces[0];
793 auto requestQueryParams = request->getQueryParameters();
794 if (requestQueryParams.end() != requestQueryParams.find("if"))
796 interfaceType = requestQueryParams["if"];
799 if (!isValidInterface(interfaceType, "PUT"))
801 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
802 << "PUT request received on invalid interface : " << interfaceType)
806 OC::OCRepresentation reqOcRep = request->getResourceRepresentation();
807 SimulatorResourceModel reqResModel = SimulatorResourceModel::build(reqOcRep);
808 SimulatorResourceModel updatedResModel;
809 if (true == updateResourceModel(reqResModel, updatedResModel, true, false))
811 auto ocRep = updatedResModel.asOCRepresentation();
812 auto result = sendResponse(request, 200, OC_EH_OK,
813 ocRep, m_interfaces[0]);
814 notifyApp(updatedResModel);
819 catch (SimulatorException &e)
821 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
822 << "Error when notifying the observers!")
828 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Updating resource representation failed!")
829 return sendResponse(request, 400, OC_EH_ERROR);
832 OCEntityHandlerResult SimulatorSingleResourceImpl::handlePOST(
833 const std::shared_ptr<OC::OCResourceRequest> &request)
835 // Check if resource support PUT request
836 if (m_requestModels.end() == m_requestModels.find("POST"))
838 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
839 << "Resource does not support POST request!")
840 return sendResponse(request, 405, OC_EH_ERROR);
843 // Handling interface query parameter "if"
844 auto interfaceType = m_interfaces[0];
845 auto requestQueryParams = request->getQueryParameters();
846 if (requestQueryParams.end() != requestQueryParams.find("if"))
848 interfaceType = requestQueryParams["if"];
851 if (!isValidInterface(interfaceType, "POST"))
853 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
854 << "POST request received on invalid interface : " << interfaceType)
858 OC::OCRepresentation reqOcRep = request->getResourceRepresentation();
859 SimulatorResourceModel reqResModel = SimulatorResourceModel::build(reqOcRep);
860 SimulatorResourceModel updatedResModel;
861 if (true == updateResourceModel(reqResModel, updatedResModel, false, false))
863 auto ocRep = updatedResModel.asOCRepresentation();
864 auto result = sendResponse(request, 200, OC_EH_OK,
865 ocRep, m_interfaces[0]);
866 notifyApp(updatedResModel);
871 catch (SimulatorException &e)
873 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
874 << "Error when notifying the observers!")
880 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Updating resource representation failed!")
881 return sendResponse(request, 400, OC_EH_ERROR);
884 OCEntityHandlerResult SimulatorSingleResourceImpl::handleDELETE(
885 const std::shared_ptr<OC::OCResourceRequest> &request)
887 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
888 << "Resource does not support DELETE request!")
889 return sendResponse(request, 405, OC_EH_ERROR);;
892 bool SimulatorSingleResourceImpl::isValidInterface(const std::string &interfaceType,
893 const std::string &requestType)
895 // Is this OIC defined interface ?
897 OCInterfaceDetails::getInstance()->isRequestSupported(interfaceType, requestType))
902 // Does resource support this interface ?
903 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
904 if (m_interfaces.end() ==
905 std::find(m_interfaces.begin(), m_interfaces.end(), interfaceType))
913 OCEntityHandlerResult SimulatorSingleResourceImpl::sendResponse(
914 const std::shared_ptr<OC::OCResourceRequest> &request, const int errorCode,
915 OCEntityHandlerResult responseResult)
917 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse());
918 response->setRequestHandle(request->getRequestHandle());
919 response->setResourceHandle(request->getResourceHandle());
920 response->setErrorCode(errorCode);
921 response->setResponseResult(responseResult);
922 if (OC_STACK_OK != OC::OCPlatform::sendResponse(response))
924 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] Failed to send response for " <<
925 request->getRequestType() <<" request!")
929 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Sent response for " <<
930 request->getRequestType() << " request.")
935 OCEntityHandlerResult SimulatorSingleResourceImpl::sendResponse(
936 const std::shared_ptr<OC::OCResourceRequest> &request, const int errorCode,
937 OCEntityHandlerResult responseResult, OC::OCRepresentation &payload,
938 const std::string &interfaceType)
940 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse());
941 response->setRequestHandle(request->getRequestHandle());
942 response->setResourceHandle(request->getResourceHandle());
943 response->setErrorCode(errorCode);
944 response->setResponseResult(responseResult);
945 response->setResourceRepresentation(payload, interfaceType);
946 if (OC_STACK_OK != OC::OCPlatform::sendResponse(response))
948 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] Failed to send response for " <<
949 request->getRequestType() <<" request!")
953 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Sent response for " <<
954 request->getRequestType() << " request \n\n" <<
955 "**Payload details**" << getPayloadString(payload))