Implemented JSON Serialization using Cereal Library
[iotivity.git] / resource / 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
37 void (processResourceResponse)(OCEntityHandlerFlag,
38                                  OCEntityHandlerRequest*,
39                                  std::shared_ptr<OC::OCResourceResponse> pResponse);
40
41
42 namespace OC
43 {
44     /**
45     *   @brief  OCResourceResponse provides APIs to set the response details
46     */
47     class OCResourceResponse
48     {
49     public:
50         typedef std::shared_ptr<OCResourceResponse> Ptr;
51
52         OCResourceResponse()
53         {}
54
55         virtual ~OCResourceResponse(void) {}
56
57         /**
58         *  This API sets the error code for this response
59         *  @param eCode error code to set
60         */
61         void setErrorCode(const int eCode) { m_errorCode = eCode; }
62
63         /**
64         *  gets new resource uri
65         *  @return std::string new resource uri
66         */
67         std::string getNewResourceUri(void)
68         {
69             return m_newResourceUri;
70         }
71
72         /**
73         *  sets new resource uri
74         *  @param newResourceUri specifies the resource uri of the resource created
75         */
76         void setNewResourceUri(const std::string newResourceUri)
77         {
78             m_newResourceUri = newResourceUri;
79         }
80
81         /**
82         * This API allows to set headerOptions in the response
83         * @param headerOptions HeaderOptions vector consisting of OCHeaderOption objects
84         */
85         void setHeaderOptions(const HeaderOptions& headerOptions)
86         {
87             m_headerOptions = headerOptions;
88         }
89
90         /**
91         *  API to set the entire resource attribute representation
92         *  @param attributeMap reference containing the name value pairs representing
93         *         the resource's attributes
94         *  @param interface specifies the interface
95         */
96         void setResourceRepresentation(OCRepresentation& rep, std::string interface) {
97             m_interface = interface;
98             m_representation = rep;
99         }
100
101         /**
102         *  API to set the entire resource attribute representation
103         *  @param attributeMap rvalue reference containing the name value pairs representing
104         *         the resource's attributes
105         *  @param interface specifies the interface
106         */
107         void setResourceRepresentation(OCRepresentation&& rep, std::string interface) {
108             setResourceRepresentation(rep, interface);
109         }
110
111         /**
112         *  API to set the entire resource attribute representation
113         *  @param attributeMap reference containing the name value pairs representing the resource's
114         *  attributes
115         */
116         void setResourceRepresentation(OCRepresentation& rep) {
117             // Call the default
118             m_interface = DEFAULT_INTERFACE;
119             m_representation = rep;
120         }
121
122         /**
123         *  API to set the entire resource attribute representation
124         *  @param attributeMap rvalue reference containing the name value pairs representing the
125         *  resource's attributes
126         */
127         void setResourceRepresentation(OCRepresentation&& rep) {
128             // Call the above function
129             setResourceRepresentation(rep);
130         }
131     private:
132         std::string m_newResourceUri;
133         int m_errorCode;
134         HeaderOptions m_headerOptions;
135         std::string m_interface;
136         OCRepresentation m_representation;
137     private:
138         friend void (::processResourceResponse)(OCEntityHandlerFlag,
139                             OCEntityHandlerRequest*,
140                             std::shared_ptr<OC::OCResourceResponse> pResponse);
141         std::string getPayload() const
142         {
143             MessageContainer inf;
144             OCRepresentation first(m_representation);
145
146             if(m_interface==LINK_INTERFACE)
147             {
148                 first.setInterfaceType(InterfaceType::LinkParent);
149             }
150             else if(m_interface==BATCH_INTERFACE)
151             {
152                 first.setInterfaceType(InterfaceType::BatchParent);
153             }
154             else
155             {
156                 first.setInterfaceType(InterfaceType::DefaultParent);
157             }
158
159             inf.addRepresentation(first);
160
161             for(const OCRepresentation& rep : m_representation.getChildren())
162             {
163                 OCRepresentation cur(rep);
164
165                 if(m_interface==LINK_INTERFACE)
166                 {
167                     cur.setInterfaceType(InterfaceType::LinkChild);
168                 }
169                 else if(m_interface==BATCH_INTERFACE)
170                 {
171                     cur.setInterfaceType(InterfaceType::BatchChild);
172                 }
173                 else
174                 {
175                     cur.setInterfaceType(InterfaceType::DefaultChild);
176                 }
177
178                 inf.addRepresentation(cur);
179
180             }
181
182             return inf.getJSONRepresentation(OCInfoFormat::ExcludeOC);
183         }
184     public:
185
186         /**
187         * Get error code
188         */
189         int getErrorCode() const;
190
191         /**
192          * Get the Response Representation
193          */
194         const OCRepresentation& getResourceRepresentation() const
195         {
196             return m_representation;
197         }
198         /**
199         * This API allows to retrieve headerOptions from a response
200         */
201         const HeaderOptions& getHeaderOptions() const
202         {
203             return m_headerOptions;
204         }
205     };
206
207 } // namespace OC
208
209 #endif //__OCRESOURCERESPONSE_H