1 //******************************************************************
3 // Copyright 2014 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
11 // http://www.apache.org/licenses/LICENSE-2.0
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.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 /// This sample shows how one could create a resource (collection) with children.
28 #include "OCPlatform.h"
30 #include "ThingsManager.h"
31 #include "ConfigurationCollection.h"
32 #include "DiagnosticsCollection.h"
33 #include "FactorySetCollection.h"
38 const int SUCCESS_RESPONSE = 0;
42 // Default system configuration value's variables
43 // The variable's names should be same as the names of "extern" variables defined in
44 // "ConfigurationResource.h"
45 std::string defaultLocation;
46 std::string defaultRegion;
47 std::string defaultSystemTime;
48 std::string defaultCurrency;
50 static ThingsManager* g_thingsmanager;
52 // Forward declaring the entityHandler (Configuration)
53 bool prepareResponseForResource(std::shared_ptr< OCResourceRequest > request);
54 OCStackResult sendResponseForResource(std::shared_ptr< OCResourceRequest > pRequest);
55 OCEntityHandlerResult entityHandlerForResource(std::shared_ptr< OCResourceRequest > request);
57 ConfigurationResource *myConfigurationResource;
58 DiagnosticsResource *myDiagnosticsResource;
59 FactorySetResource *myFactorySetResource;
61 typedef std::function< void(OCRepresentation&) > putFunc;
62 typedef std::function< OCRepresentation(void) > getFunc;
64 getFunc getGetFunction(std::string uri)
68 if (uri == myConfigurationResource->getUri())
70 res = std::bind(&ConfigurationResource::getConfigurationRepresentation,
71 myConfigurationResource);
73 else if (uri == myDiagnosticsResource->getUri())
75 res = std::bind(&DiagnosticsResource::getDiagnosticsRepresentation,
76 myDiagnosticsResource);
82 putFunc getPutFunction(std::string uri)
86 if (uri == myConfigurationResource->getUri())
88 res = std::bind(&ConfigurationResource::setConfigurationRepresentation,
89 myConfigurationResource, std::placeholders::_1);
91 else if (uri == myDiagnosticsResource->getUri())
93 res = std::bind(&DiagnosticsResource::setDiagnosticsRepresentation,
94 myDiagnosticsResource, std::placeholders::_1);
100 // This function prepares a response for any incoming request to Light resource.
101 bool prepareResponseForResource(std::shared_ptr< OCResourceRequest > request)
103 std::cout << "\tIn Server CPP prepareResponseForResource:\n";
107 // Get the request type and request flag
108 std::string requestType = request->getRequestType();
109 int requestFlag = request->getRequestHandlerFlag();
111 if (requestFlag == RequestHandlerFlag::InitFlag)
113 std::cout << "\t\trequestFlag : Init\n";
115 // entity handler to perform resource initialization operations
117 else if (requestFlag == RequestHandlerFlag::RequestFlag)
119 std::cout << "\t\trequestFlag : Request\n";
121 // If the request type is GET
122 if (requestType == "GET")
124 std::cout << "\t\t\trequestType : GET\n";
125 // GET operations are directly handled while sending the response
126 // in the sendLightResponse function
129 else if (requestType == "PUT")
131 std::cout << "\t\t\trequestType : PUT\n";
133 OCRepresentation rep = request->getResourceRepresentation();
135 putFunction = getPutFunction(request->getResourceUri());
137 // Do related operations related to PUT request
141 else if (requestType == "POST")
143 // POST request operations
145 else if (requestType == "DELETE")
147 // DELETE request operations
150 else if (requestFlag == RequestHandlerFlag::ObserverFlag)
152 std::cout << "\t\trequestFlag : Observer\n";
157 std::cout << "Request invalid" << std::endl;
163 OCStackResult sendResponseForResource(std::shared_ptr< OCResourceRequest > pRequest)
165 auto pResponse = std::make_shared< OC::OCResourceResponse >();
167 // Check for query params (if any)
168 QueryParamsMap queryParamsMap = pRequest->getQueryParameters();
170 pResponse->setRequestHandle(pRequest->getRequestHandle());
171 pResponse->setResourceHandle(pRequest->getResourceHandle());
174 getFunction = getGetFunction(pRequest->getResourceUri());
176 OCRepresentation rep;
179 auto findRes = queryParamsMap.find("if");
181 if (findRes != queryParamsMap.end())
183 pResponse->setResourceRepresentation(rep, findRes->second);
187 pResponse->setResourceRepresentation(rep, DEFAULT_INTERFACE);
190 pResponse->setErrorCode(200);
191 pResponse->setResponseResult(OC_EH_OK);
193 return OCPlatform::sendResponse(pResponse);
196 OCEntityHandlerResult entityHandlerForResource(std::shared_ptr< OCResourceRequest > request)
198 std::cout << "\tIn Server CPP (entityHandlerForResource) entity handler:\n";
199 OCEntityHandlerResult ehResult = OC_EH_ERROR;
201 QueryParamsMap test = request->getQueryParameters();
203 if (prepareResponseForResource(request))
205 if (OC_STACK_OK == sendResponseForResource(request))
211 std::cout << "sendResponse failed." << std::endl;
216 std::cout << "PrepareResponse failed." << std::endl;
221 // callback handler on GET request
222 void onBootstrap(const HeaderOptions& headerOptions, const OCRepresentation& rep, const int eCode)
226 if (eCode != SUCCESS_RESPONSE)
228 std::cout << "onGET Response error: " << eCode << std::endl;
232 std::cout << "\n\nGET request was successful" << std::endl;
233 std::cout << "\tResource URI: " << rep.getUri() << std::endl;
235 defaultRegion = rep.getValue< std::string >("r");
236 defaultSystemTime = rep.getValue< std::string >("st");
237 defaultCurrency = rep.getValue< std::string >("c");
238 defaultLocation = rep.getValue< std::string >("loc");
240 std::cout << "\tLocation : " << defaultLocation << std::endl;
241 std::cout << "\tSystemTime : " << defaultSystemTime << std::endl;
242 std::cout << "\tCurrency : " << defaultCurrency << std::endl;
243 std::cout << "\tRegion : " << defaultRegion << std::endl;
249 //**************************************************************
251 // Create PlatformConfig object
253 { OC::ServiceType::InProc, OC::ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos };
255 OCPlatform::Configure(cfg);
256 g_thingsmanager = new ThingsManager();
257 //**************************************************************
261 std::cout << "NOTE: You may gain the root privilege (e.g, reboot)\n";
262 std::cout << "NOTE: Now, you don't have it.\n";
276 std::cout << endl << endl << "(0) Quit" << std::endl;
277 std::cout << "(1) Bootstrap" << std::endl;
278 std::cout << "(2) Create Configuration Resources" << std::endl;
284 else if (g_Steps == 1)
286 if( g_thingsmanager->doBootstrap(&onBootstrap) == OC_STACK_OK)
289 std::cout << "A callback pointer of the function is NULL." << std::endl;
291 else if (g_Steps == 2)
293 myConfigurationResource = new ConfigurationResource();
294 myConfigurationResource->createResources(&entityHandlerForResource);
296 myDiagnosticsResource = new DiagnosticsResource();
297 myDiagnosticsResource->createResources(&entityHandlerForResource);
300 myFactorySetResource = new FactorySetResource();
301 myFactorySetResource->createResources(&entityHandlerForResource);
302 myDiagnosticsResource->factoryReset = std::function < void()
303 > (std::bind(&ConfigurationResource::factoryReset,
304 myConfigurationResource));
310 catch (OCException e)
312 std::cout << "Exception in main: " << e.what();
315 // No explicit call to stop the platform.
316 // When OCPlatform destructor is invoked, internally we do platform cleanup