1 //******************************************************************
3 // Copyright 2014 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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 "VirtualRepresentation.h"
23 AttributeMap VirtualRepresentation::s_attributeMap;
25 std::mutex VirtualRepresentation::s_mutexAttributeMap;
26 std::condition_variable VirtualRepresentation::s_conditionAttributeMap;
27 bool VirtualRepresentation::m_isReadyAttributeMap = true;
31 VirtualRepresentation::VirtualRepresentation()
33 m_resourceHandle = NULL;
34 m_resourceProperty = 0x00;
37 VirtualRepresentation::~VirtualRepresentation()
41 std::string VirtualRepresentation::addVirtualTag(std::string uri)
43 std::string ret = uri;
44 return ret.append(VIRTURL_TAG + std::to_string(g_num++));
47 OCResourceHandle VirtualRepresentation::getResourceHandle()
49 return m_resourceHandle;
52 std::string VirtualRepresentation::getUri()
57 std::string VirtualRepresentation::getHostIP()
59 return m_originHostIP;
62 std::string VirtualRepresentation::getResourceTypeName()
64 return m_resourceTypeName;
67 std::string VirtualRepresentation::getResourceInterface()
69 return m_resourceInterface;
72 uint8_t VirtualRepresentation::getResourceProperty()
74 return m_resourceProperty;
77 int VirtualRepresentation::setUri(std::string uri)
79 m_virtualUri = addVirtualTag(uri);
83 int VirtualRepresentation::setHostIP(std::string ip)
89 int VirtualRepresentation::setResourceTypeName(std::string typeName)
91 m_resourceTypeName = typeName;
95 int VirtualRepresentation::setResourceInterface(std::string interface)
97 m_resourceInterface = interface;
101 int VirtualRepresentation::setResourceProperty(uint8_t property)
103 m_resourceProperty = property;
107 int VirtualRepresentation::setResourceHandle(OCResourceHandle & handle)
109 m_resourceHandle = handle;
113 int VirtualRepresentation::getRepresentation(OCRepresentation& oc)
115 oc.setAttributeMap(s_attributeMap);
116 oc.setUri(this->getUri().c_str());
120 OCEntityHandlerResult VirtualRepresentation::entityHandler(const std::shared_ptr<OCResourceRequest> request ,
121 const std::shared_ptr<OCResourceResponse> response)
125 std::string requestType = request->getRequestType();
126 int requestFlag = request->getRequestHandlerFlag();
128 if(requestFlag == RequestHandlerFlag::InitFlag)
131 else if(requestFlag == RequestHandlerFlag::RequestFlag)
133 if(requestType == "GET")
138 std::unique_lock< std::mutex > lck(s_mutexAttributeMap);
139 while(!m_isReadyAttributeMap)
141 s_conditionAttributeMap.wait(lck);
143 m_isReadyAttributeMap = false;
145 NotificationManager::getInstance()->getPrint()(s_attributeMap);
147 OCRepresentation rep;
148 getRepresentation(rep);
150 response->setErrorCode(200);
151 response->setResourceRepresentation(rep , "");
153 m_isReadyAttributeMap = true;
154 s_conditionAttributeMap.notify_all();
161 else if(requestType == "PUT")
164 else if(requestType == "POST")
167 else if(requestType == "DELETE")
174 else if(requestFlag == RequestHandlerFlag::ObserverFlag)
188 void VirtualRepresentation::onObserve(const HeaderOptions &headerOption, const OCRepresentation &rep , const int eCode , const int sequenceNumber)
190 if(eCode == SUCCESS_RESPONSE)
192 AttributeMap tmp = rep.getAttributeMap();
194 if(ResourceManager::getInstance()->isEmptyAttributeMap(tmp))
199 if(NotificationManager::getInstance()->getOnObserve())
201 NotificationManager::getInstance()->getOnObserve()(tmp);
204 NotificationManager::getInstance()->getPrint()(tmp);
206 OCStackResult result = OC_STACK_OK;
208 VirtualRepresentation tmpObj = *this;
209 if(!tmpObj.getUri().empty())
212 AttributeMap tmpAttMap = ResourceManager::getInstance()->copyAttributeMap(tmp);
215 std::unique_lock< std::mutex > lck(s_mutexAttributeMap);
216 while(!m_isReadyAttributeMap)
218 s_conditionAttributeMap.wait(lck);
220 m_isReadyAttributeMap = false;
222 s_attributeMap = tmpAttMap;
224 m_isReadyAttributeMap = true;
225 s_conditionAttributeMap.notify_all();
228 result = notifyAllObservers(tmpObj.getResourceHandle());
234 if(OC_STACK_NO_OBSERVERS == result)