bool RCSResourceObject::applyAcceptanceMethod(const RCSSetResponse& response, const RCSResourceAttributes& requstAttrs) { auto requestHandler = response.getHandler(); assert(requestHandler != nullptr); auto replaced = requestHandler->applyAcceptanceMethod(response.getAcceptanceMethod(), *this, requstAttrs); OC_LOG_V(WARNING, LOG_TAG, "replaced num %zu", replaced.size()); for (const auto& attrKeyValPair : replaced) { std::shared_ptr< AttributeUpdatedListener > foundListener; { std::lock_guard< std::mutex > lock(m_mutexAttributeUpdatedListeners); auto it = m_attributeUpdatedListeners.find(attrKeyValPair.first); if (it != m_attributeUpdatedListeners.end()) { foundListener = it->second; } } if (foundListener) { (*foundListener)(attrKeyValPair.second, requstAttrs.at(attrKeyValPair.first)); } } return !replaced.empty(); }
OCEntityHandlerResult RCSResourceObject::handleRequestSet( std::shared_ptr< OC::OCResourceRequest > request) { assert(request != nullptr); auto attrs = getAttributesFromOCRequest(request); auto response = invokeHandler(attrs, request, m_setRequestHandler); auto requestHandler = response.getHandler(); assert(requestHandler != nullptr); AttrKeyValuePairs replaced = requestHandler->applyAcceptanceMethod( response.getAcceptanceMethod(), *this, attrs); for (const auto& attrKeyValPair : replaced) { std::lock_guard<std::mutex> lock(m_mutexKeyAttributeUpdate); auto keyAttrListener = m_keyAttributesUpdatedListeners.find(attrKeyValPair.first); if(keyAttrListener != m_keyAttributesUpdatedListeners.end()) { keyAttrListener-> second(attrKeyValPair.second, attrs[attrKeyValPair.first]); } } autoNotify(!replaced.empty(), m_autoNotifyPolicy); return sendResponse(*this, request, response); }
OCEntityHandlerResult RCSResourceObject::handleRequestSet( std::shared_ptr< OC::OCResourceRequest > request) { assert(request != nullptr); auto attrs = getAttributesFromOCRequest(request); auto response = invokeHandler(attrs, request, m_setRequestHandler); auto attrsChanged = applyAcceptanceMethod(response, attrs); try { autoNotify(attrsChanged, m_autoNotifyPolicy); return sendResponse(*this, request, response); } catch (const RCSPlatformException& e) { OC_LOG_V(ERROR, LOG_TAG, "Error : %s ", e.what()); return OC_EH_ERROR; } }