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::RequestFlag)
113 std::cout << "\t\trequestFlag : Request\n";
115 // If the request type is GET
116 if (requestType == "GET")
118 std::cout << "\t\t\trequestType : GET\n";
119 // GET operations are directly handled while sending the response
120 // in the sendLightResponse function
123 else if (requestType == "PUT")
125 std::cout << "\t\t\trequestType : PUT\n";
127 OCRepresentation rep = request->getResourceRepresentation();
129 putFunction = getPutFunction(request->getResourceUri());
131 // Do related operations related to PUT request
135 else if (requestType == "POST")
137 // POST request operations
139 else if (requestType == "DELETE")
141 // DELETE request operations
144 else if (requestFlag == RequestHandlerFlag::ObserverFlag)
146 std::cout << "\t\trequestFlag : Observer\n";
151 std::cout << "Request invalid" << std::endl;
157 OCStackResult sendResponseForResource(std::shared_ptr< OCResourceRequest > pRequest)
159 auto pResponse = std::make_shared< OC::OCResourceResponse >();
161 // Check for query params (if any)
162 QueryParamsMap queryParamsMap = pRequest->getQueryParameters();
164 pResponse->setRequestHandle(pRequest->getRequestHandle());
165 pResponse->setResourceHandle(pRequest->getResourceHandle());
168 getFunction = getGetFunction(pRequest->getResourceUri());
170 OCRepresentation rep;
173 auto findRes = queryParamsMap.find("if");
175 if (findRes != queryParamsMap.end())
177 pResponse->setResourceRepresentation(rep, findRes->second);
181 pResponse->setResourceRepresentation(rep, DEFAULT_INTERFACE);
184 pResponse->setErrorCode(200);
185 pResponse->setResponseResult(OC_EH_OK);
187 return OCPlatform::sendResponse(pResponse);
190 OCEntityHandlerResult entityHandlerForResource(std::shared_ptr< OCResourceRequest > request)
192 std::cout << "\tIn Server CPP (entityHandlerForResource) entity handler:\n";
193 OCEntityHandlerResult ehResult = OC_EH_ERROR;
195 QueryParamsMap test = request->getQueryParameters();
197 if (prepareResponseForResource(request))
199 if (OC_STACK_OK == sendResponseForResource(request))
205 std::cout << "sendResponse failed." << std::endl;
210 std::cout << "PrepareResponse failed." << std::endl;
215 // callback handler on GET request
216 void onBootstrap(const HeaderOptions& headerOptions, const OCRepresentation& rep, const int eCode)
220 if (eCode != SUCCESS_RESPONSE)
222 std::cout << "onGET Response error: " << eCode << std::endl;
226 std::cout << "\n\nGET request was successful" << std::endl;
227 std::cout << "\tResource URI: " << rep.getUri() << std::endl;
229 defaultRegion = rep.getValue< std::string >("r");
230 defaultSystemTime = rep.getValue< std::string >("st");
231 defaultCurrency = rep.getValue< std::string >("c");
232 defaultLocation = rep.getValue< std::string >("loc");
234 std::cout << "\tLocation : " << defaultLocation << std::endl;
235 std::cout << "\tSystemTime : " << defaultSystemTime << std::endl;
236 std::cout << "\tCurrency : " << defaultCurrency << std::endl;
237 std::cout << "\tRegion : " << defaultRegion << std::endl;
243 //**************************************************************
245 // Create PlatformConfig object
247 { OC::ServiceType::InProc, OC::ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos };
249 OCPlatform::Configure(cfg);
250 g_thingsmanager = new ThingsManager();
251 //**************************************************************
255 std::cout << "NOTE: You may gain the root privilege (e.g, reboot)\n";
256 std::cout << "NOTE: Now, you don't have it.\n";
270 std::cout << endl << endl << "(0) Quit" << std::endl;
271 std::cout << "(1) Bootstrap" << std::endl;
272 std::cout << "(2) Create Configuration Resources" << std::endl;
278 else if (g_Steps == 1)
280 if( g_thingsmanager->doBootstrap(&onBootstrap) == OC_STACK_OK)
283 std::cout << "A callback pointer of the function is NULL." << std::endl;
285 else if (g_Steps == 2)
287 myConfigurationResource = new ConfigurationResource();
288 myConfigurationResource->createResources(&entityHandlerForResource);
290 myDiagnosticsResource = new DiagnosticsResource();
291 myDiagnosticsResource->createResources(&entityHandlerForResource);
294 myFactorySetResource = new FactorySetResource();
295 myFactorySetResource->createResources(&entityHandlerForResource);
296 myDiagnosticsResource->factoryReset = std::function < void()
297 > (std::bind(&ConfigurationResource::factoryReset,
298 myConfigurationResource));
304 catch (OCException e)
306 std::cout << "Exception in main: " << e.what();
309 // No explicit call to stop the platform.
310 // When OCPlatform destructor is invoked, internally we do platform cleanup