Merge "Patch 1 : Adding Arduino WiFi support. This requires updated Arduino WiFi...
[platform/upstream/iotivity.git] / include / OCResourceResponse.h
1 //******************************************************************
2 //
3 // Copyright 2014 Intel Mobile Communications GmbH 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 /// @file OCResourceResponse.h 
22
23 /// @brief  This file contains the declaration of classes and its members related to 
24 ///         ResourceResponse.
25
26 #ifndef __OCRESOURCERESPONSE_H
27 #define __OCRESOURCERESPONSE_H
28
29 #include "OCApi.h"
30 #include <IServerWrapper.h>
31 #include <ocstack.h>
32 #include <OCRepresentation.h>
33
34 using namespace std;
35
36 namespace OC
37 {
38     /**
39     *   @brief  OCResourceResponse provides APIs to set the response details
40     */
41     class OCResourceResponse
42     {
43     public:
44         typedef std::shared_ptr<OCResourceResponse> Ptr;
45
46         /**
47         *  Default destructor 
48         */
49         OCResourceResponse() {}
50
51         /**
52         *  Virtual destructor 
53         */
54         virtual ~OCResourceResponse(void) {}
55
56         /**
57         *  This API sets the error code for this response
58         *  @param eCode error code to set
59         */
60         void setErrorCode(const int eCode) { m_errorCode = eCode; }
61
62         /**
63         *  API to set the entire resource attribute representation (BATCH)
64         *  @param attributeMap reference containing the name value pairs representing the resource's attributes
65         */
66         void setResourceRepresentation(OCRepresentation& rep, std::string interface) { 
67             if(!interface.compare(LINK_INTERFACE))
68             {
69                 setResourceRepresentationLL(rep);
70             }
71             else if(!interface.compare(BATCH_INTERFACE))
72             {
73                 setResourceRepresentationBatch(rep);
74             }
75             else
76             {
77                 setResourceRepresentationDefault(rep);
78             }
79             // TODO other interfaces
80         }
81
82         /**
83         *  API to set the entire resource attribute representation (Linked List Interface))
84         *  @param attributeMap reference containing the name value pairs representing the resource's attributes
85         */
86         void setResourceRepresentationLL(OCRepresentation& rep) { 
87
88             // Default Set
89
90             ostringstream payload;
91
92             // Parent
93             payload << "{";
94             payload << "\"href\":"; 
95             payload << "\"" ;
96             payload << rep.getUri();
97             payload << "\"" ;
98             payload << "}";
99
100             // Children stuff
101             std::vector<OCRepresentation> children = rep.getChildren();
102             
103             for(auto oitr = children.begin(); oitr != children.end(); ++oitr)
104             {
105                 payload << ",{\"href\":"; 
106         
107                 payload << "\"" ;
108                 payload << oitr->getUri();
109                 payload << "\"" ;
110
111                 payload << ",\"prop\":{";
112
113                 payload << "\"rt\":[";
114                 std::vector<std::string> types = oitr->getResourceTypes();
115                 for(auto itr = types.begin(); itr != types.end(); ++itr)
116                 {
117                     if(itr != types.begin())
118                     {
119                         payload << ',';
120                     }
121
122                     payload << *itr;
123                 }
124                 payload << "],";
125
126                 payload << "\"if\":[";
127                 std::vector<std::string> interfaces = oitr->getResourceInterfaces();
128                 for(auto itr = interfaces.begin(); itr != interfaces.end(); ++itr)
129                 {
130                     if(itr != interfaces.begin())
131                     {
132                         payload << ',';
133                     }
134
135                     payload << "\"" << *itr << "\"";
136                 }
137                 payload << "]";
138
139                 payload << "}}";
140             }
141
142             m_payload = payload.str();
143         }
144
145         /**
146         *  API to set the entire resource attribute representation (Default))
147         *  @param attributeMap reference containing the name value pairs representing the resource's attributes
148         */
149         void setResourceRepresentationDefault(OCRepresentation& rep) { 
150
151             // Default Set
152
153             ostringstream payload;
154
155             // Parent
156             payload << "{";
157             payload << "\"href\":"; 
158             payload << "\"" ;
159             payload << rep.getUri();
160             payload << "\"" ;
161
162             payload << ",\"rep\":{";
163
164             AttributeMap attributes = rep.getAttributeMap();
165
166             for(auto itr = attributes.begin(); itr!= attributes.end(); ++ itr)
167             {
168                 if(itr != attributes.begin())
169                 {
170                     payload << ',';
171                 }
172                 payload << "\""<<itr->first<<"\":\""<< itr->second.front()<<"\"";
173             }
174
175             payload << "}}";
176
177             // Children stuff
178             std::vector<OCRepresentation> children = rep.getChildren();
179             
180             for(auto oitr = children.begin(); oitr != children.end(); ++oitr)
181             {
182                 payload << ",{\"href\":"; 
183
184                 payload << "\"" ;
185                 payload << oitr->getUri();
186                 payload << "\"" ;
187
188                 payload << ",\"prop\":{";
189
190                 payload << "\"rt\":[";
191                 std::vector<std::string> types = oitr->getResourceTypes();
192                 for(auto itr = types.begin(); itr != types.end(); ++itr)
193                 {
194                     if(itr != types.begin())
195                     {
196                         payload << ',';
197                     }
198
199                     payload << "\"" << *itr << "\"";
200                 }
201                 payload << "],";
202
203                 payload << "\"if\":[";
204                 std::vector<std::string> interfaces = oitr->getResourceInterfaces();
205                 for(auto itr = interfaces.begin(); itr != interfaces.end(); ++itr)
206                 {
207                     if(itr != interfaces.begin())
208                     {
209                         payload << ',';
210                     }
211
212                     payload << "\"" << *itr << "\"";
213                 }
214                 payload << "]";
215
216                 payload << "}}";
217             }
218
219             m_payload = payload.str();
220         }
221
222         /**
223         *  API to set the entire resource attribute representation (BATCH)
224         *  @param attributeMap reference containing the name value pairs representing the resource's attributes
225         */
226         void setResourceRepresentationBatch(OCRepresentation& rep) { 
227             ostringstream payload;
228
229             // Parent
230             payload << "{";
231             payload << "\"href\":"; 
232             payload << "\"" ;
233             payload << rep.getUri();
234             payload << "\"" ;
235             payload << "}";
236
237             std::vector<OCRepresentation> children = rep.getChildren();
238             
239             for(auto oitr = children.begin(); oitr != children.end(); ++oitr)
240             {
241                 payload << ',';
242
243                 payload << "{";
244                 
245                 payload << "\"href\":"; 
246         
247                 payload << "\"" ;
248                 payload << oitr->getUri();
249                 payload << "\"" ;
250
251                 payload << ",\"rep\":{";
252
253                 AttributeMap attributes = oitr->getAttributeMap();
254
255                 for(AttributeMap::const_iterator itr = attributes.begin(); itr!= attributes.end(); ++ itr)
256                 {
257                     if(itr != attributes.begin())
258                     {
259                         payload << ',';
260                     }
261                     payload << "\""<<itr->first<<"\":\""<< itr->second.front()<<"\"";
262                 }
263
264                 payload << "}}";
265             }
266
267             m_payload = payload.str();
268         }
269
270
271         /** TODO remove this once after above function stabilize.
272         *  API to set the entire resource attribute representation
273         *  @param attributeMap reference containing the name value pairs representing the resource's attributes
274         */
275         void setResourceRepresentation(AttributeMap& attributes) { 
276
277             // TODO To be refactored
278             ostringstream payload;
279
280             payload << "{";
281             
282             // TODO fix this (do this programmatically)
283             payload << "\"href\":\"/a/room\"";
284
285             payload << ",\"rep\":{";
286
287             for(AttributeMap::const_iterator itr = attributes.begin(); itr!= attributes.end(); ++ itr)
288             {
289                 if(itr != attributes.begin())
290                 {
291                     payload << ',';
292                 }
293                 // cout << itr->first << ":" <, itr->second.front() << endl;
294                 payload << "\""<<itr->first<<"\":\""<< itr->second.front()<<"\"";
295
296             }
297
298             payload << "}}";
299
300             m_payload = payload.str();
301         }
302
303     private:
304         std::string m_payload;
305         int m_errorCode;
306
307     // TODO only stack should have visibility and apps should not
308     public:
309
310         /** 
311         * Get error code 
312         */
313         int getErrorCode() const; 
314
315         /**
316         * Get the resource attribute representation
317         */
318         AttributeMap& getResourceRepresentation() const; 
319
320         // TODO This should go away & just use getResourceRepresentation 
321         std::string getPayload()
322         {
323             return m_payload;
324         }
325     };
326
327 } // namespace OC
328
329 #endif //__OCRESOURCERESPONSE_H