Add ResourceBroker Sconscript
[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::unique_ptr<std::list< DevicePresencePtr >>  ResourceBroker::s_presenceList(nullptr);
29
30 ResourceBroker::ResourceBroker()
31 {
32     // TODO Auto-generated constructor stub
33     if(s_presenceList == nullptr)
34     {
35         s_presenceList = std::unique_ptr<std::list< DevicePresencePtr >>(new std::list<DevicePresencePtr>);
36     }
37 }
38
39 ResourceBroker::~ResourceBroker()
40 {
41     // TODO Auto-generated destructor stub
42     if(s_presenceList != nullptr)
43     {
44         s_presenceList->clear();
45     }
46 }
47
48 ResourceBroker * ResourceBroker::getInstance()
49 {
50     if (!s_instance)
51     {
52         s_mutexForCreation.lock();
53         if (!s_instance)
54         {
55             s_instance = new ResourceBroker();
56         }
57         s_mutexForCreation.unlock();
58     }
59     return s_instance;
60 }
61
62 OCStackResult ResourceBroker::hostResource(PrimitiveResourcePtr pResource, BrokerCB cb)
63 {
64     OCStackResult ret = OC_STACK_INVALID_PARAM;
65     if (pResource->getUri().empty() || pResource->getHost().empty())
66     {
67         return ret;
68     }
69     if (cb == NULL)
70     {
71         ret = OC_STACK_INVALID_CALLBACK;
72         return ret;
73     }
74
75     DevicePresencePtr presenceItem = findDevicePresence(pResource, cb);
76     if(presenceItem == NULL)
77     {
78         DevicePresencePtr newItem = DevicePresencePtr(new DevicePresence(pResource, cb));
79         s_presenceList->push_back(newItem);
80     }
81     else
82     {
83         presenceItem->addPresenceResource(pResource, cb);
84     }
85
86     return ret;
87 }
88
89 DevicePresencePtr ResourceBroker::findDevicePresence(PrimitiveResourcePtr pResource, BrokerCB cb)
90 {
91     DevicePresencePtr retDevice(nullptr);
92     if (s_presenceList->empty())// || pResource->isEmpty())
93     {
94         return retDevice;
95     }
96     else
97     {
98         std::list<DevicePresencePtr>::iterator it;
99
100         DevicePresencePtr temp = DevicePresencePtr(new DevicePresence(pResource, cb));
101         it = std::find(s_presenceList->begin(), s_presenceList->end(), temp);
102
103         if(it == s_presenceList->end())
104         {
105             return retDevice;
106         }
107         else
108         {
109             retDevice = *it;
110         }
111     }
112
113     return retDevice;
114 }
115
116 ResourcePresencePtr ResourceBroker::findResourcePresence(PrimitiveResourcePtr pResource, BrokerCB cb)
117 {
118     ResourcePresencePtr retResource(nullptr);
119     if (s_presenceList->empty())// || pResource.isEmpty())
120     {
121         return retResource;
122     }
123     else
124     {
125         DevicePresencePtr foundDevice = findDevicePresence(pResource, cb);
126         retResource = foundDevice->findResourcePresence(pResource, cb);
127     }
128
129     return retResource;
130 }