9a7822c146a08bb717be41b16ce96739c5385ab1
[platform/upstream/iotivity.git] / service / basis / resourceBroker / src / ResourceBroker.cpp
1 //******************************************************************
2 //
3 // Copyright 2015 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
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
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
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.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include "BrokerTypes.h"
22 #include "ResourceBroker.h"
23
24 #define OIC_COAP "coap://"
25 #define DEFAULT_CONTEXT_VALUE 0x99
26
27 ResourceBroker * ResourceBroker::s_instance = NULL;
28 std::list< DevicePresence * >  ResourceBroker::s_presenceList = NULL;
29
30 ResourceBroker::ResourceBroker()
31 {
32     // TODO Auto-generated constructor stub
33     if(s_presenceList.empty())
34     {
35         s_presenceList = new std::list< DevicePresence * >();
36     }
37 }
38
39 ResourceBroker::~ResourceBroker()
40 {
41     // TODO Auto-generated destructor stub
42     if(!s_presenceList.empty())
43     {
44         s_presenceList.clear();
45     }
46     delete s_presenceList;
47 }
48
49 ResourceBroker * ResourceBroker::getInstance()
50 {
51     if (!s_instance)
52     {
53         s_mutexForCreation.lock();
54         if (!s_instance)
55         {
56             s_instance = new ResourceBroker();
57         }
58         s_mutexForCreation.unlock();
59     }
60     return s_instance;
61 }
62
63 OCStackResult ResourceBroker::hostResource(PrimitiveResource & pResource, BrokerCB cb)
64 {
65     OCStackResult ret = OC_STACK_INVALID_PARAM;
66     if (pResource.getUri().empty() || pResource.getHost().empty())
67     {
68         return ret;
69     }
70     if (cb == NULL)
71     {
72         ret = OC_STACK_INVALID_CALLBACK;
73         return ret;
74     }
75
76     DevicePresence * presenceItem = findDevicePresence(pResource, cb);
77     if(presenceItem == NULL)
78     {
79         DevicePresence *newItem = new DevicePresence(pResource, cb);
80         s_presenceList.push_back(newItem);
81     }
82     else
83     {
84         presenceItem->addPresenceResource(pResource, cb);
85     }
86
87     return ret;
88 }
89
90 DevicePresence * ResourceBroker::findDevicePresence(PrimitiveResource& pResource, BrokerCB cb)
91 {
92     DevicePresence * retDevice = NULL;
93     if (s_presenceList.empty() || pResource.isEmpty())
94     {
95         return NULL;
96     }
97     else
98     {
99         std::list<DevicePresence *>::iterator it;
100
101         DevicePresence * temp = new DevicePresence(pResource, cb);
102         it = std::find(s_presenceList.begin(), s_presenceList.end(), temp);
103         delete temp;
104
105         if(it == s_presenceList.end())
106         {
107             return NULL;
108         }
109         else
110         {
111             retDevice = it;
112         }
113     }
114
115     return retDevice;
116 }
117
118 ResourcePresence * ResourceBroker::findResourcePresence(PrimitiveResource & pResource, BrokerCB cb)
119 {
120     ResourcePresence * retResource = NULL;
121     if (s_presenceList.empty() || pResource.isEmpty())
122     {
123         return NULL;
124     }
125     else
126     {
127         DevicePresence * foundDevice = findDevicePresence(pResource, cb);
128         retResource = foundDevice->findResourcePresence(pResource, cb);
129     }
130
131     return retResource;
132 }