1 //******************************************************************
3 // Copyright 2015 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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
23 #include "BrokerTypes.h"
24 #include "ResourceBroker.h"
30 ResourceBroker * ResourceBroker::s_instance = NULL;
31 std::mutex ResourceBroker::s_mutexForCreation;
32 std::unique_ptr<PresenceList> ResourceBroker::s_presenceList(nullptr);
33 std::unique_ptr<BrokerIDMap> ResourceBroker::s_brokerIDMap(nullptr);
35 ResourceBroker::~ResourceBroker()
37 if(s_presenceList != nullptr)
39 OC_LOG_V(DEBUG, BROKER_TAG, "clear the ResourcePresenceList.");
40 s_presenceList->erase(s_presenceList->begin(), s_presenceList->end());
41 s_presenceList->clear();
43 if(s_brokerIDMap != nullptr)
45 OC_LOG_V(DEBUG, BROKER_TAG, "clear the brokerIDMap.");
46 s_brokerIDMap->erase(s_brokerIDMap->begin(), s_brokerIDMap->end());
47 s_brokerIDMap->clear();
51 ResourceBroker * ResourceBroker::getInstance()
55 s_mutexForCreation.lock();
58 s_instance = new ResourceBroker();
59 s_instance->initializeResourceBroker();
61 s_mutexForCreation.unlock();
66 BrokerID ResourceBroker::hostResource(PrimitiveResourcePtr pResource, BrokerCB cb)
68 OC_LOG_V(DEBUG, BROKER_TAG, "hostResource().");
69 if(pResource == nullptr || cb == nullptr || cb == NULL)
71 throw InvalidParameterException("[hostResource] input parameter(PrimitiveResource or BrokerCB) is Invalid");
74 BrokerID retID = generateBrokerID();
76 ResourcePresencePtr presenceItem = findResourcePresence(pResource);
77 if(presenceItem == nullptr)
79 OC_LOG_V(DEBUG, BROKER_TAG, "Not found any Handled Resource.");
80 OC_LOG_V(DEBUG, BROKER_TAG, "Create New Resource Presence Handler.");
84 OC_LOG_V(DEBUG, BROKER_TAG, "create the ResourcePresence.");
85 presenceItem.reset(new ResourcePresence());
86 presenceItem->initializeResourcePresence(pResource);
87 }catch(PlatformException &e)
89 throw FailedSubscribePresenceException(e.getReasonCode());
91 if(s_presenceList != nullptr)
93 OC_LOG_V(DEBUG, BROKER_TAG, "push the ResourcePresence in presenceList.");
94 s_presenceList->push_back(presenceItem);
97 OC_LOG_V(DEBUG, BROKER_TAG, "add the BrokerRequester in ResourcePresence.");
98 presenceItem->addBrokerRequester(retID, cb);
100 BrokerCBResourcePair pair(presenceItem, cb);
101 s_brokerIDMap->insert(std::pair<BrokerID, BrokerCBResourcePair>
102 (retID, BrokerCBResourcePair(presenceItem, cb)));
107 void ResourceBroker::cancelHostResource(BrokerID brokerId)
109 OC_LOG_V(DEBUG,BROKER_TAG,"cancelHostResource().");
112 // input parameter is wrong.
113 // hostResource never return value 0;
114 OC_LOG_V(DEBUG,BROKER_TAG,"brokerId is zero.");
115 throw InvalidParameterException("[cancelHostResource] brokerId is invalid.");
118 BrokerIDMap::iterator it = s_brokerIDMap->find(brokerId);
119 if(it == s_brokerIDMap->end())
121 // not found requested brokerId in BrokerMap;
122 OC_LOG_V(DEBUG,BROKER_TAG,"brokerId is not found in brokerIDMap.");
123 throw InvalidParameterException("[cancelHostResource] brokerId is not found in brokerIDMap.");
127 ResourcePresencePtr presenceItem = it->second.pResource;
128 presenceItem->removeBrokerRequester(brokerId);
129 s_brokerIDMap->erase(brokerId);
131 if(presenceItem->isEmptyRequester())
133 OC_LOG_V(DEBUG,BROKER_TAG,"remove resourcePresence in presenceList because it is not including any requester info.");
134 s_presenceList->remove(presenceItem);
139 BROKER_STATE ResourceBroker::getResourceState(BrokerID brokerId)
141 OC_LOG_V(DEBUG,BROKER_TAG,"getResourceState().");
144 OC_LOG_V(DEBUG,BROKER_TAG,"brokerId is zero.");
145 throw InvalidParameterException("[getResourceState] input BrokerID is Invalid");
148 BROKER_STATE retState = BROKER_STATE::NONE;
150 BrokerIDMap::iterator it = s_brokerIDMap->find(brokerId);
151 if(it == s_brokerIDMap->end())
153 // not found requested brokerId in BrokerMap;
154 OC_LOG_V(DEBUG,BROKER_TAG,"brokerId is not found in brokerIDMap.");
155 throw InvalidParameterException("[getResourceState] input BrokerID is unknown ID");
159 ResourcePresencePtr foundResource = it->second.pResource;
160 retState = foundResource->getResourceState();
166 BROKER_STATE ResourceBroker::getResourceState(PrimitiveResourcePtr pResource)
168 OC_LOG_V(DEBUG,BROKER_TAG,"getResourceState().");
169 if(pResource == nullptr)
171 throw InvalidParameterException("[getResourceState] input PrimitiveResource is Invalid");
174 BROKER_STATE retState = BROKER_STATE::NONE;
176 ResourcePresencePtr foundResource = findResourcePresence(pResource);
177 if(foundResource != nullptr)
179 retState = foundResource->getResourceState();
185 void ResourceBroker::initializeResourceBroker()
187 OC_LOG_V(DEBUG,BROKER_TAG,"initializeResourceBroker().");
188 if(s_presenceList == nullptr)
190 OC_LOG_V(DEBUG,BROKER_TAG,"create the presenceList.");
191 s_presenceList = std::unique_ptr<PresenceList>(new PresenceList);
193 if(s_brokerIDMap == nullptr)
195 OC_LOG_V(DEBUG,BROKER_TAG,"create the brokerIDMap.");
196 s_brokerIDMap = std::unique_ptr<BrokerIDMap>(new BrokerIDMap);
200 ResourcePresencePtr ResourceBroker::findResourcePresence(PrimitiveResourcePtr pResource)
202 OC_LOG_V(DEBUG,BROKER_TAG,"findResourcePresence().");
203 ResourcePresencePtr retResource(nullptr);
205 if(s_presenceList->empty() != true)
207 for(auto & it : * s_presenceList)
209 PrimitiveResourcePtr temp = it->getPrimitiveResource();
210 if(temp == pResource)
221 BrokerID ResourceBroker::generateBrokerID()
223 OC_LOG_V(DEBUG,BROKER_TAG,"generateBrokerID().");
229 if(retID != 0 && s_brokerIDMap->find(retID) == s_brokerIDMap->end())
233 retID = (unsigned int)rand();
238 } // namespace Service