Updated api description for RCSRepresentation.
[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             std::lock_guard<std::mutex> lock(m_resourceAttributes_mutex);
70
71             for (auto &it : m_resourceAttributes){
72                 OIC_LOG_V(INFO, CONTAINER_TAG, "set attribute \(%s)'",
73                            std::string(it.key() + "\', with " + it.value().toString()).c_str());
74
75                 m_resourceAttributes[it.key()] = it.value();
76             }
77
78             // asynchronous notification
79             auto notifyFunc = [](NotificationReceiver *notificationReceiver,
80                                     std::string uri)
81             {
82                 if (notificationReceiver){
83                     notificationReceiver->onNotificationReceived(uri);
84                 }
85             };
86             auto f = std::bind(notifyFunc, m_pNotiReceiver, m_uri);
87             boost::thread notifyThread(f);
88
89         }
90
91         void BundleResource::setAttribute(const std::string &key,
92                                           RCSResourceAttributes::Value &&value, bool notify)
93         {
94             OIC_LOG_V(INFO, CONTAINER_TAG, "set attribute \(%s)'", std::string(key + "\', with " +
95                      value.toString()).c_str());
96             std::lock_guard<std::mutex> lock(m_resourceAttributes_mutex);
97             m_resourceAttributes[key] = std::move(value);
98
99             if(notify){
100                 // asynchronous notification
101                 auto notifyFunc = [](NotificationReceiver *notificationReceiver,
102                                         std::string uri)
103                 {
104                     if (notificationReceiver){
105                         notificationReceiver->onNotificationReceived(uri);
106                     }
107                 };
108                 auto f = std::bind(notifyFunc, m_pNotiReceiver, m_uri);
109                 boost::thread notifyThread(f);
110             }
111
112         }
113
114         void BundleResource::setAttribute(const std::string &key,
115                                                  RCSResourceAttributes::Value &value, bool notify)
116         {
117             setAttribute(key, RCSResourceAttributes::Value(value), notify);
118         }
119
120         void BundleResource::setAttribute(const std::string &key,
121                 RCSResourceAttributes::Value &&value)
122         {
123             setAttribute(key, std::move(value), true);
124         }
125
126         void BundleResource::setAttribute(const std::string &key,
127                         RCSResourceAttributes::Value &value)
128         {
129             setAttribute(key, value, true);
130         }
131
132         RCSResourceAttributes::Value BundleResource::getAttribute(const std::string &key)
133         {
134             OIC_LOG_V(INFO, CONTAINER_TAG, "get attribute \'(%s)" , std::string(key + "\'").c_str());
135             std::lock_guard<std::mutex> lock(m_resourceAttributes_mutex);
136             return m_resourceAttributes.at(key);
137         }
138     }
139 }