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;
41 pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;
43 // Default system configuration value's variables
44 // The variable's names should be same as the names of "extern" variables defined in
45 // "ConfigurationResource.h"
46 std::string defaultLocation;
47 std::string defaultRegion;
48 std::string defaultSystemTime;
49 std::string defaultCurrency;
51 static ThingsManager* g_thingsmanager;
53 // Forward declaring the entityHandler (Configuration)
54 bool prepareResponseForResource(std::shared_ptr< OCResourceRequest > request);
55 OCStackResult sendResponseForResource(std::shared_ptr< OCResourceRequest > pRequest);
56 OCEntityHandlerResult entityHandlerForResource(std::shared_ptr< OCResourceRequest > request);
58 ConfigurationResource *myConfigurationResource;
59 DiagnosticsResource *myDiagnosticsResource;
60 FactorySetResource *myFactorySetResource;
62 typedef std::function< void(OCRepresentation&) > putFunc;
63 typedef std::function< OCRepresentation(void) > getFunc;
65 getFunc getGetFunction(std::string uri)
69 if (uri == myConfigurationResource->getUri())
71 res = std::bind(&ConfigurationResource::getConfigurationRepresentation,
72 myConfigurationResource);
74 else if (uri == myDiagnosticsResource->getUri())
76 res = std::bind(&DiagnosticsResource::getDiagnosticsRepresentation,
77 myDiagnosticsResource);
83 putFunc getPutFunction(std::string uri)
87 if (uri == myConfigurationResource->getUri())
89 res = std::bind(&ConfigurationResource::setConfigurationRepresentation,
90 myConfigurationResource, std::placeholders::_1);
92 else if (uri == myDiagnosticsResource->getUri())
94 res = std::bind(&DiagnosticsResource::setDiagnosticsRepresentation,
95 myDiagnosticsResource, std::placeholders::_1);
101 // This function prepares a response for any incoming request to Light resource.
102 bool prepareResponseForResource(std::shared_ptr< OCResourceRequest > request)
104 std::cout << "\tIn Server CPP prepareResponseForResource:\n";
108 // Get the request type and request flag
109 std::string requestType = request->getRequestType();
110 int requestFlag = request->getRequestHandlerFlag();
112 if (requestFlag == RequestHandlerFlag::RequestFlag)
114 std::cout << "\t\trequestFlag : Request\n";
116 // If the request type is GET
117 if (requestType == "GET")
119 std::cout << "\t\t\trequestType : GET\n";
120 // GET operations are directly handled while sending the response
121 // in the sendLightResponse function
124 else if (requestType == "PUT")
126 std::cout << "\t\t\trequestType : PUT\n";
128 OCRepresentation rep = request->getResourceRepresentation();
130 putFunction = getPutFunction(request->getResourceUri());
132 // Do related operations related to PUT request
136 else if (requestType == "POST")
138 // POST request operations
140 else if (requestType == "DELETE")
142 // DELETE request operations
145 else if (requestFlag == RequestHandlerFlag::ObserverFlag)
147 std::cout << "\t\trequestFlag : Observer\n";
152 std::cout << "Request invalid" << std::endl;
158 OCStackResult sendResponseForResource(std::shared_ptr< OCResourceRequest > pRequest)
160 auto pResponse = std::make_shared< OC::OCResourceResponse >();
162 // Check for query params (if any)
163 QueryParamsMap queryParamsMap = pRequest->getQueryParameters();
165 pResponse->setRequestHandle(pRequest->getRequestHandle());
166 pResponse->setResourceHandle(pRequest->getResourceHandle());
169 getFunction = getGetFunction(pRequest->getResourceUri());
171 OCRepresentation rep;
174 auto findRes = queryParamsMap.find("if");
176 if (findRes != queryParamsMap.end())
178 pResponse->setResourceRepresentation(rep, findRes->second);
182 pResponse->setResourceRepresentation(rep, DEFAULT_INTERFACE);
185 pResponse->setErrorCode(200);
186 pResponse->setResponseResult(OC_EH_OK);
188 return OCPlatform::sendResponse(pResponse);
191 OCEntityHandlerResult entityHandlerForResource(std::shared_ptr< OCResourceRequest > request)
193 std::cout << "\tIn Server CPP (entityHandlerForResource) entity handler:\n";
194 OCEntityHandlerResult ehResult = OC_EH_ERROR;
196 QueryParamsMap test = request->getQueryParameters();
198 if (prepareResponseForResource(request))
200 if (OC_STACK_OK == sendResponseForResource(request))
206 std::cout << "sendResponse failed." << std::endl;
211 std::cout << "PrepareResponse failed." << std::endl;
216 // callback handler on GET request
217 void onBootstrap(const HeaderOptions& headerOptions, const OCRepresentation& rep, const int eCode)
219 pthread_mutex_lock(&mutex_lock);
221 pthread_mutex_unlock(&mutex_lock);
223 if (eCode != SUCCESS_RESPONSE)
225 std::cout << "onGET Response error: " << eCode << std::endl;
229 std::cout << "\n\nGET request was successful" << std::endl;
230 std::cout << "\tResource URI: " << rep.getUri() << std::endl;
232 defaultRegion = rep.getValue< std::string >("r");
233 defaultSystemTime = rep.getValue< std::string >("st");
234 defaultCurrency = rep.getValue< std::string >("c");
235 defaultLocation = rep.getValue< std::string >("loc");
237 std::cout << "\tLocation : " << defaultLocation << std::endl;
238 std::cout << "\tSystemTime : " << defaultSystemTime << std::endl;
239 std::cout << "\tCurrency : " << defaultCurrency << std::endl;
240 std::cout << "\tRegion : " << defaultRegion << std::endl;
246 //**************************************************************
248 // Create PlatformConfig object
250 { OC::ServiceType::InProc, OC::ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos };
252 OCPlatform::Configure(cfg);
253 g_thingsmanager = new ThingsManager();
254 //**************************************************************
258 std::cout << "NOTE: You may gain the root privilege (e.g, reboot)\n";
259 std::cout << "NOTE: Now, you don't have it.\n";
267 pthread_mutex_lock(&mutex_lock);
270 pthread_mutex_unlock(&mutex_lock);
275 pthread_mutex_unlock(&mutex_lock);
277 std::cout << endl << endl << "(0) Quit" << std::endl;
278 std::cout << "(1) Bootstrap" << std::endl;
279 std::cout << "(2) Create Configuration Resources" << std::endl;
287 else if (g_Steps == 1)
289 if( g_thingsmanager->doBootstrap(&onBootstrap) == OC_STACK_OK)
291 pthread_mutex_lock(&mutex_lock);
293 pthread_mutex_unlock(&mutex_lock);
297 std::cout << "A callback pointer of the function is NULL." << std::endl;
300 else if (g_Steps == 2)
302 myConfigurationResource = new ConfigurationResource();
303 myConfigurationResource->createResources(&entityHandlerForResource);
305 myDiagnosticsResource = new DiagnosticsResource();
306 myDiagnosticsResource->createResources(&entityHandlerForResource);
309 myFactorySetResource = new FactorySetResource();
310 myFactorySetResource->createResources(&entityHandlerForResource);
311 myDiagnosticsResource->factoryReset = std::function < void()
312 > (std::bind(&ConfigurationResource::factoryReset,
313 myConfigurationResource));
315 pthread_mutex_lock(&mutex_lock);
317 pthread_mutex_unlock(&mutex_lock);
321 catch (OCException e)
323 std::cout << "Exception in main: " << e.what();
326 // No explicit call to stop the platform.
327 // When OCPlatform destructor is invoked, internally we do platform cleanup