Merge branch 'easysetup'
[platform/upstream/iotivity.git] / service / resource-container / src / BundleResource.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 "BundleResource.h"
22
23 #include <list>
24 #include <string.h>
25 #include <iostream>
26 #include <boost/thread.hpp>
27 #include "NotificationReceiver.h"
28
29 #include "InternalTypes.h"
30
31 namespace OIC
32 {
33     namespace Service
34     {
35         BundleResource::BundleResource() : m_pNotiReceiver(nullptr)
36         {
37
38         }
39
40         BundleResource::~BundleResource()
41         {
42             m_pNotiReceiver = nullptr;
43         }
44
45         void BundleResource::registerObserver(NotificationReceiver *pNotiReceiver)
46         {
47             m_pNotiReceiver = pNotiReceiver;
48         }
49
50         std::list< std::string > BundleResource::getAttributeNames()
51         {
52             std::list< std::string > ret;
53
54             for (auto &it : m_resourceAttributes){
55                 ret.push_back(it.key());
56             }
57
58             return ret;
59         }
60
61         const RCSResourceAttributes BundleResource::getAttributes()
62         {
63             std::lock_guard<std::mutex> lock(m_resourceAttributes_mutex);
64             return RCSResourceAttributes(m_resourceAttributes);
65         }
66
67         void BundleResource::setAttributes(const RCSResourceAttributes &attrs)
68         {
69             setAttributes(attrs, true);
70         }
71
72         void BundleResource::setAttributes(const RCSResourceAttributes &attrs, bool notify)
73         {
74             std::lock_guard<std::mutex> lock(m_resourceAttributes_mutex);
75
76             for (auto &it : m_resourceAttributes){
77                 OIC_LOG_V(INFO, CONTAINER_TAG, "set attribute \(%s)'",
78                            std::string(it.key() + "\', with " + it.value().toString()).c_str());
79
80                 m_resourceAttributes[it.key()] = it.value();
81             }
82
83             if(notify){
84                 // asynchronous notification
85                 auto notifyFunc = [](NotificationReceiver *notificationReceiver,
86                                         std::string uri)
87                 {
88                     if (notificationReceiver){
89                         notificationReceiver->onNotificationReceived(uri);
90                     }
91                 };
92                 auto f = std::bind(notifyFunc, m_pNotiReceiver, m_uri);
93                 boost::thread notifyThread(f);
94             }
95
96         }
97
98         void BundleResource::setAttribute(const std::string &key,
99                                           RCSResourceAttributes::Value &&value, bool notify)
100         {
101             OIC_LOG_V(INFO, CONTAINER_TAG, "set attribute \(%s)'", std::string(key + "\', with " +
102                      value.toString()).c_str());
103             std::lock_guard<std::mutex> lock(m_resourceAttributes_mutex);
104             m_resourceAttributes[key] = std::move(value);
105
106             if(notify){
107                 // asynchronous notification
108                 auto notifyFunc = [](NotificationReceiver *notificationReceiver,
109                                         std::string uri)
110                 {
111                     if (notificationReceiver){
112                         notificationReceiver->onNotificationReceived(uri);
113                     }
114                 };
115                 auto f = std::bind(notifyFunc, m_pNotiReceiver, m_uri);
116                 boost::thread notifyThread(f);
117             }
118
119         }
120
121         void BundleResource::setAttribute(const std::string &key,
122                                                  RCSResourceAttributes::Value &value, bool notify)
123         {
124             setAttribute(key, RCSResourceAttributes::Value(value), notify);
125         }
126
127         void BundleResource::setAttribute(const std::string &key,
128                 RCSResourceAttributes::Value &&value)
129         {
130             setAttribute(key, std::move(value), true);
131         }
132
133         void BundleResource::setAttribute(const std::string &key,
134                         RCSResourceAttributes::Value &value)
135         {
136             setAttribute(key, value, true);
137         }
138
139         RCSResourceAttributes::Value BundleResource::getAttribute(const std::string &key)
140         {
141             OIC_LOG_V(INFO, CONTAINER_TAG, "get attribute \'(%s)" , std::string(key + "\'").c_str());
142             std::lock_guard<std::mutex> lock(m_resourceAttributes_mutex);
143             return m_resourceAttributes.at(key);
144         }
145     }
146 }