modified RCSResourceObject to generate responses according to the interface of requests.
[platform/upstream/iotivity.git] / service / resource-encapsulation / src / serverBuilder / src / InterfaceHandler.cpp
1 #include "InterfaceHandler.h"\r
2 \r
3 #include "OCApi.h"\r
4 #include "OCResourceRequest.h"\r
5 \r
6 #include "RCSRepresentation.h"\r
7 #include "RCSRequest.h"\r
8 #include "RCSResourceObject.h"\r
9 #include "RCSResourceAttributes.h"\r
10 #include "ResourceAttributesConverter.h"\r
11 \r
12 #include <unordered_map>\r
13 \r
14 namespace\r
15 {\r
16     using namespace OIC::Service;\r
17 \r
18     RCSRepresentation buildGetBaselineResponse(const RCSRequest&, RCSResourceObject& resource)\r
19     {\r
20         RCSResourceObject::LockGuard lock(resource);\r
21 \r
22         return RCSRepresentation{ resource.getUri(), resource.getInterfaces(), resource.getTypes(),\r
23             resource.getAttributes()};\r
24     }\r
25 \r
26     RCSRepresentation buildSetBaselineResponse(const RCSRequest& rcsRequest, RCSResourceObject& resource)\r
27     {\r
28         return buildGetBaselineResponse(rcsRequest, resource);\r
29     }\r
30 \r
31     RCSRepresentation buildGetRequestResponse(const RCSRequest&, RCSResourceObject& resource)\r
32     {\r
33         RCSResourceObject::LockGuard lock(resource);\r
34 \r
35         return RCSRepresentation{resource.getAttributes()};\r
36     }\r
37 \r
38     RCSRepresentation buildSetRequestResponse(const RCSRequest& rcsRequest, RCSResourceObject& resource)\r
39     {\r
40         auto requestAttr = ResourceAttributesConverter::fromOCRepresentation(\r
41                 (rcsRequest.getOCRequest())->getResourceRepresentation());\r
42 \r
43         RCSResourceObject::LockGuard lock(resource);\r
44 \r
45         const RCSResourceAttributes& updatedAttr = resource.getAttributes();\r
46 \r
47         for (auto& kvPair : requestAttr)\r
48         {\r
49             if(updatedAttr.contains(kvPair.key()))\r
50             {\r
51                 kvPair.value() = updatedAttr.at(kvPair.key());\r
52             }\r
53             else\r
54             {\r
55                 //FIXME erase item with iterator.\r
56                 requestAttr.erase(kvPair.key());\r
57             }\r
58         }\r
59 \r
60         return RCSRepresentation{ requestAttr };\r
61     }\r
62 \r
63     RCSRepresentation buildGetBatchResponse(RCSRequest, RCSResourceObject& resource)\r
64     {\r
65         RCSRepresentation rcsRep;\r
66 \r
67         for (const auto& bound : resource.getBoundResources())\r
68         {\r
69             rcsRep.addChild(bound->toRepresentation());\r
70         }\r
71 \r
72         return rcsRep;\r
73     }\r
74 \r
75     const std::unordered_map< std::string, InterfaceHandler > g_defaultHandlers {\r
76 \r
77             { BASELINE_INTERFACE,\r
78                 InterfaceHandler(buildGetBaselineResponse, buildSetBaselineResponse) },\r
79 \r
80             { ACTUATOR_INTERFACE,\r
81                 InterfaceHandler(buildGetRequestResponse, buildSetRequestResponse) },\r
82 \r
83             { SENSOR_INTERFACE,\r
84                 InterfaceHandler(buildGetRequestResponse, nullptr) },\r
85 \r
86             { BATCH_INTERFACE,\r
87                 InterfaceHandler(buildGetBatchResponse, buildSetBaselineResponse) }\r
88     };\r
89 }\r
90 \r
91 namespace OIC\r
92 {\r
93     namespace Service\r
94     {\r
95 \r
96         InterfaceHandler::InterfaceHandler(GetResponseBuilder getBuilder,\r
97                 SetResponseBuilder setBuilder) :\r
98                 m_getBuilder{ std::move(getBuilder) },\r
99                 m_setBuilder{ std::move(setBuilder) }\r
100         {\r
101         }\r
102 \r
103         bool InterfaceHandler::isGetSupported() const\r
104         {\r
105             return m_getBuilder != nullptr;\r
106         }\r
107 \r
108         bool InterfaceHandler::isSetSupported() const\r
109         {\r
110             return m_setBuilder != nullptr;\r
111         }\r
112 \r
113         InterfaceHandler::GetResponseBuilder InterfaceHandler::getGetResponseBuilder() const\r
114         {\r
115             return m_getBuilder;\r
116         }\r
117 \r
118         InterfaceHandler::SetResponseBuilder InterfaceHandler::getSetResponseBuilder() const\r
119         {\r
120             return m_setBuilder;\r
121         }\r
122 \r
123         InterfaceHandler getDefaultInterfaceHandler(const std::string& interfaceName,\r
124                 const std::string& defaultInterfaceName)\r
125         {\r
126             auto it = g_defaultHandlers.find(interfaceName);\r
127             if (it != g_defaultHandlers.end()) return it->second;\r
128 \r
129             it = g_defaultHandlers.find(defaultInterfaceName);\r
130             if (it != g_defaultHandlers.end()) return it->second;\r
131 \r
132             return g_defaultHandlers.find(OIC::Service::BASELINE_INTERFACE)->second;\r
133         }\r
134     }\r
135 }\r