From a85e0ca99fcb0ae7e173084e259d1ec43e1ae48a Mon Sep 17 00:00:00 2001 From: Sashi Penta Date: Wed, 10 Sep 2014 15:19:16 -0700 Subject: [PATCH] Partial Implementation of US1574: OCRepresentation is now provides simpler interface to setValue and getValue from the applications. Applications doesn't have to go through attributeMaps in OCRepresentation. OCRepresentation now supports serialization/deserialization for primitive attributes (numbers, booleans and strings) so application doesn't have to deal with strings. Change-Id: I09d323fc624d87c0b2a3c9b510935a6d5907a11b --- examples/ocicuc/light_resource.cpp | 41 ++--- examples/ocicuc/light_resource.hpp | 11 +- examples/presenceclient.cpp | 30 ---- examples/presenceserver.cpp | 168 +------------------ examples/roomclient.cpp | 109 +++++------- examples/roomserver.cpp | 334 +++++++++---------------------------- examples/simpleclient.cpp | 138 +++++---------- examples/simpleclientserver.cpp | 112 +++++-------- examples/simpleserver.cpp | 157 ++++++----------- include/OCApi.h | 150 ++++++++++++++++- include/OCResourceRequest.h | 16 +- include/OCResourceResponse.h | 118 ++++++------- src/InProcClientWrapper.cpp | 10 +- src/OCUtilities.cpp | 14 ++ 14 files changed, 511 insertions(+), 897 deletions(-) diff --git a/examples/ocicuc/light_resource.cpp b/examples/ocicuc/light_resource.cpp index 370a54e..3402d5c 100644 --- a/examples/ocicuc/light_resource.cpp +++ b/examples/ocicuc/light_resource.cpp @@ -5,20 +5,22 @@ namespace Intel { namespace OCDemo { std::atomic LightResource::shutdown_flag(false); std::thread LightResource::observe_thread; -void LightResource::setRepresentation(AttributeMap& attributeMap) +void LightResource::setRepresentation(const OCRepresentation& rep) { cout << "\t\t\t" << "Received representation: " << endl; - cout << "\t\t\t\t" << "power: " << attributeMap["power"][0] << endl; - cout << "\t\t\t\t" << "state: " << attributeMap["state"][0] << endl; - m_state = attributeMap["state"][0].compare("true") == 0; - m_power = std::stoi(attributeMap["power"][0]); + rep.getValue("state", m_state); + rep.getValue("power", m_power); + + cout << "\t\t\t\t" << "power: " << m_power << endl; + cout << "\t\t\t\t" << "state: " << m_state << endl; } -void LightResource::getRepresentation(AttributeMap& attributeMap) const +OCRepresentation LightResource::getRepresentation(void) { - attributeMap["state"] = { (m_state ? "true" : "false") }; - attributeMap["power"] = { to_string(m_power) }; + m_rep.setValue("state", m_state); + m_rep.setValue("power", m_power); + return m_rep; } void LightResource::addType(const OC::OCPlatform& platform, const std::string& type) const @@ -159,12 +161,8 @@ void LightResource::handle_get_request(std::shared_ptr reques // ...do any processing of the query here... // Get a representation of the resource and send it back as a response: - AttributeMap attribute_map; - - getRepresentation(attribute_map); - response->setErrorCode(200); - response->setResourceRepresentation(attribute_map); + response->setResourceRepresentation(getRepresentation()); } void LightResource::handle_put_request(std::shared_ptr request, std::shared_ptr response) @@ -173,36 +171,25 @@ void LightResource::handle_put_request(std::shared_ptr reques const auto query_params_map = request->getQueryParameters(); // ...do something with the query parameters (if there were any)... - auto attribute_map = request->getAttributeRepresentation(); + auto rep = request->getResourceRepresentation(); - setRepresentation(attribute_map); - getRepresentation(attribute_map); // in case we changed something + setRepresentation(rep); if(!response) return; response->setErrorCode(200); - response->setResourceRepresentation(attribute_map); + response->setResourceRepresentation(getRepresentation()); } void LightResource::handle_post_request(std::shared_ptr request, std::shared_ptr response) { // ...demo-code... - response->setErrorCode(200); - - auto attribute_map = request->getAttributeRepresentation(); - getRepresentation(attribute_map); - response->setResourceRepresentation(attribute_map); } void LightResource::handle_delete_request(std::shared_ptr request, std::shared_ptr response) { // ...demo-code... - response->setErrorCode(200); - - auto attribute_map = request->getAttributeRepresentation(); - getRepresentation(attribute_map); - response->setResourceRepresentation(attribute_map); } // Set up observation in a separate thread: diff --git a/examples/ocicuc/light_resource.hpp b/examples/ocicuc/light_resource.hpp index 3cd2031..f4b2cd6 100644 --- a/examples/ocicuc/light_resource.hpp +++ b/examples/ocicuc/light_resource.hpp @@ -27,6 +27,7 @@ class LightResource public: bool m_state; // off or on? int m_power; // power level + OCRepresentation m_rep; private: atomic m_observation; // are we under observation? @@ -54,9 +55,11 @@ class LightResource } private: - inline std::string make_URI(const unsigned int resource_number) const + inline std::string make_URI(const unsigned int resource_number) { - return std::string("/a/light") + "_" + std::to_string(resource_number); + std::string uri = std::string("/a/light") + "_" + std::to_string(resource_number); + m_rep.setUri(uri); + return uri; } public: @@ -65,8 +68,8 @@ class LightResource void unregisterResource(OC::OCPlatform& platform); OCResourceHandle getHandle() const { return m_resourceHandle; } - void setRepresentation(AttributeMap& attributeMap); - void getRepresentation(AttributeMap& attributeMap) const; + void setRepresentation(const OCRepresentation& rep); + OCRepresentation getRepresentation(void); void addType(const OC::OCPlatform& platform, const std::string& type) const; void addInterface(const OC::OCPlatform& platform, const std::string& interface) const; diff --git a/examples/presenceclient.cpp b/examples/presenceclient.cpp index 6e1f8be..897c585 100644 --- a/examples/presenceclient.cpp +++ b/examples/presenceclient.cpp @@ -29,7 +29,6 @@ using namespace OC; std::shared_ptr curResource; -static ObserveType OBSERVE_TYPE_TO_USE = ObserveType::Observe; OCPlatform* platformPtr; @@ -56,7 +55,6 @@ void presenceHandler(OCStackResult result, const unsigned int nonce) // Callback to found resources void foundResource(std::shared_ptr resource) { - if(curResource) { std::cout << "Found another resource, ignoring"< resource) } } -void PrintUsage() -{ - std::cout << std::endl; - std::cout << "Usage : simpleclient " << std::endl; - std::cout << " ObserveType : 1 - Observe" << std::endl; - std::cout << " ObserveType : 2 - ObserveAll" << std::endl; -} - - int main(int argc, char* argv[]) { - if (argc == 1) - { - OBSERVE_TYPE_TO_USE = ObserveType::Observe; - } - else if (argc == 2) - { - int value = atoi(argv[1]); - if (value == 1) - OBSERVE_TYPE_TO_USE = ObserveType::Observe; - else if (value == 2) - OBSERVE_TYPE_TO_USE = ObserveType::ObserveAll; - else - OBSERVE_TYPE_TO_USE = ObserveType::Observe; - } - else - { - PrintUsage(); - return -1; - } // Create PlatformConfig object PlatformConfig cfg { diff --git a/examples/presenceserver.cpp b/examples/presenceserver.cpp index 1f2bb67..4fd62aa 100644 --- a/examples/presenceserver.cpp +++ b/examples/presenceserver.cpp @@ -127,59 +127,6 @@ public: return m_resourceHandle; } - void setRepresentation(OCRepresentation& light) - { - AttributeMap attributeMap = light.getAttributeMap(); - - if(attributeMap.find("state") != attributeMap.end() && attributeMap.find("power") != attributeMap.end()) - { - cout << "\t\t\t" << "Received representation: " << endl; - cout << "\t\t\t\t" << "power: " << attributeMap["power"][0] << endl; - cout << "\t\t\t\t" << "state: " << attributeMap["state"][0] << endl; - - m_state = attributeMap["state"][0].compare("true") == 0; - m_power= std::stoi(attributeMap["power"][0]); - } - } - - OCRepresentation getRepresentation() - { - OCRepresentation light; - - light.setUri(m_lightUri); - - std::vector interfaces; - //interfaces.push_back(m_lightInterface); - - light.setResourceInterfaces(interfaces); - - std::vector types; - //types.push_back(m_lightType); - - light.setResourceTypes(types); - - AttributeMap attributeMap; - AttributeValues stateVal; - if(m_state) - { - stateVal.push_back("true"); - } - else - { - stateVal.push_back("false"); - } - - AttributeValues powerVal; - powerVal.push_back(to_string(m_power)); - - attributeMap["state"] = stateVal; - attributeMap["power"] = powerVal; - - light.setAttributeMap(attributeMap); - - return light; - } - void addType(const OC::OCPlatform& platform, const std::string& type) const { OCStackResult result = platform.bindTypeToResource(m_resourceHandle, type); @@ -197,128 +144,15 @@ public: cout << "Binding TypeName to Resource was unsuccessful\n"; } } + }; // Create the instance of the resource class (in this case instance of class 'LightResource'). LightResource myLightResource; -// This is just a sample implementation of entity handler. -// Entity handler can be implemented in several ways by the manufacturer void entityHandler(std::shared_ptr request, std::shared_ptr response) { cout << "\tIn Server CPP entity handler:\n"; - - if(request) - { - // Get the request type and request flag - std::string requestType = request->getRequestType(); - RequestHandlerFlag requestFlag = request->getRequestHandlerFlag(); - - if(requestFlag == RequestHandlerFlag::InitFlag) - { - cout << "\t\trequestFlag : Init\n"; - - // entity handler to perform resource initialization operations - } - else if(requestFlag == RequestHandlerFlag::RequestFlag) - { - cout << "\t\trequestFlag : Request\n"; - - // If the request type is GET - if(requestType == "GET") - { - cout << "\t\t\trequestType : GET\n"; - - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(QueryParamsMap::iterator it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - // Process query params and do required operations .. - - // Get the representation of this resource at this point and send it as response - // AttributeMap attributeMap; - OCRepresentation rep; - rep = myLightResource.getRepresentation(); - - if(response) - { - // TODO Error Code - response->setErrorCode(200); - - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } - } - } - else if(requestType == "PUT") - { - cout << "\t\t\trequestType : PUT\n"; - - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - // Get the representation from the request - OCRepresentation rep = request->getResourceRepresentation(); - - myLightResource.setRepresentation(rep); - - // Do related operations related to PUT request - rep = myLightResource.getRepresentation(); - - if(response) - { - // TODO Error Code - response->setErrorCode(200); - - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } - } - - } - else if(requestType == "POST") - { - // POST request operations - } - else if(requestType == "DELETE") - { - // DELETE request operations - } - } - else if(requestFlag == RequestHandlerFlag::ObserverFlag) - { - // OBSERVE flag operations - } - } - else - { - std::cout << "Request invalid" << std::endl; - } } int main() diff --git a/examples/roomclient.cpp b/examples/roomclient.cpp index b6b2044..67ba8cb 100644 --- a/examples/roomclient.cpp +++ b/examples/roomclient.cpp @@ -47,39 +47,33 @@ void onGet(const OCRepresentation& rep, const int eCode) if(eCode == SUCCESS_RESPONSE) { std::cout << "GET request was successful" << std::endl; - - AttributeMap attributeMap = rep.getAttributeMap(); - std::cout << "Resource URI: " << rep.getUri() << std::endl; - - for(auto it = attributeMap.begin(); it != attributeMap.end(); ++it) - { - std::cout << "\tAttribute name: "<< it->first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } - - std::cout << std::endl; - } + std::cout << "\tResource URI: " << rep.getUri() << std::endl; std::vector children = rep.getChildren(); for(auto oit = children.begin(); oit != children.end(); ++oit) { - std::cout << "Child Resource URI: " << oit->getUri() << std::endl; - - attributeMap = oit->getAttributeMap(); - - for(auto it = attributeMap.begin(); it != attributeMap.end(); ++it) + std::cout << "\t\tChild Resource URI: " << oit->getUri() << std::endl; + if(oit->getUri().find("light") != std::string::npos) { - std::cout << "\tAttribute name: "<< it->first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } - - std::cout << std::endl; + bool state = false; + int color = 0; + oit->getValue("state", state); + oit->getValue("color", color); + + std::cout << "\t\tstate:" << state << std::endl; + std::cout << "\t\tcolor:" << color << std::endl; + } + else if(oit->getUri().find("fan") != std::string::npos) + { + bool state = false; + int speed = 0; + oit->getValue("state", state); + oit->getValue("speed", speed); + + std::cout << "\t\tstate:" << state << std::endl; + std::cout << "\t\tspeed:" << speed << std::endl; } } @@ -99,24 +93,14 @@ void putRoomRepresentation(std::shared_ptr resource) { OCRepresentation rep; std::cout << "Putting room representation..."<put("core.room", BATCH_INTERFACE, rep, qp, &onPut); + resource->put("core.room", BATCH_INTERFACE, rep, QueryParamsMap(), &onPut); } } @@ -127,35 +111,34 @@ void onPut(const OCRepresentation& rep, const int eCode) { std::cout << "PUT request was successful" << std::endl; - AttributeMap attributeMap = rep.getAttributeMap(); - - for(auto it = attributeMap.begin(); it != attributeMap.end(); ++it) - { - std::cout << "\tAttribute name: "<< it->first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } - - std::cout << std::endl; - } + std::cout << "\tResource URI: " << rep.getUri() << std::endl; std::vector children = rep.getChildren(); for(auto oit = children.begin(); oit != children.end(); ++oit) { - attributeMap = oit->getAttributeMap(); - - for(auto it = attributeMap.begin(); it != attributeMap.end(); ++it) + std::cout << "\t\tChild Resource URI: " << oit->getUri() << std::endl; + if(oit->getUri().find("light") != std::string::npos) { - std::cout << "\tAttribute name: "<< it->first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } - - std::cout << std::endl; + bool state = false; + int color = 0; + oit->getValue("state", state); + oit->getValue("color", color); + + std::cout << "\t\tstate:" << state << std::endl; + std::cout << "\t\tcolor:" << color << std::endl; } + else if(oit->getUri().find("fan") != std::string::npos) + { + bool state = false; + int speed = 0; + oit->getValue("state", state); + oit->getValue("speed", speed); + + std::cout << "\t\tstate:" << state << std::endl; + std::cout << "\t\tspeed:" << speed << std::endl; + } + } } diff --git a/examples/roomserver.cpp b/examples/roomserver.cpp index 664479d..89da8de 100644 --- a/examples/roomserver.cpp +++ b/examples/roomserver.cpp @@ -44,45 +44,61 @@ public: // Room members std::string m_roomUri; - std::string m_roomType; - std::string m_roomInterface1; - std::string m_roomInterface2; - std::string m_roomInterface3; + std::vector m_roomTypes; + std::vector m_roomInterfaces; OCResourceHandle m_roomHandle; + OCRepresentation m_roomRep; // light members bool m_lightState; int m_lightColor; - std::string m_lightInterface; std::string m_lightUri; - std::string m_lightType; + std::vector m_lightTypes; + std::vector m_lightInterfaces; OCResourceHandle m_lightHandle; + OCRepresentation m_lightRep; // fan members bool m_fanState; int m_fanSpeed; - std::string m_fanInterface; std::string m_fanUri; - std::string m_fanType; + std::vector m_fanTypes; + std::vector m_fanInterfaces; OCResourceHandle m_fanHandle; + OCRepresentation m_fanRep; public: /// Constructor RoomResource(): m_lightState(false), m_lightColor(0), m_fanState(false), m_fanSpeed(0) { - m_roomUri = "/a/room"; // URI of the resource - m_roomType = "core.room"; // resource type name. In this case, it is light - m_roomInterface1 = DEFAULT_INTERFACE; // resource interface. - m_roomInterface2 = BATCH_INTERFACE; // resource interface. - m_roomInterface3 = LINK_INTERFACE; // resource interface. - m_lightUri = "/a/light"; // URI of the resource - m_lightType = "core.light"; // resource type name. In this case, it is light - m_lightInterface = DEFAULT_INTERFACE; // resource interface. + m_lightTypes.push_back("core.light"); // resource type name. In this case, it is light + m_lightInterfaces.push_back(DEFAULT_INTERFACE); // resource interface. + + m_lightRep.setUri(m_lightUri); + m_lightRep.setResourceTypes(m_lightTypes); + m_lightRep.setResourceInterfaces(m_lightInterfaces); + m_lightRep.setValue("state", m_lightState); + m_lightRep.setValue("color", m_lightColor); m_fanUri = "/a/fan"; // URI of the resource - m_fanType = "core.fan"; // resource type name. In this case, it is light - m_fanInterface = DEFAULT_INTERFACE; // resource interface. + m_fanTypes.push_back("core.fan"); // resource type name. In this case, it is light + m_fanInterfaces.push_back(DEFAULT_INTERFACE); // resource interface. + + m_fanRep.setUri(m_fanUri); + m_fanRep.setResourceTypes(m_fanTypes); + m_fanRep.setResourceInterfaces(m_fanInterfaces); + m_fanRep.setValue("state", m_fanState); + m_fanRep.setValue("speed", m_fanSpeed); + + m_roomUri = "/a/room"; // URI of the resource + m_roomTypes.push_back("core.room"); // resource type name. In this case, it is light + m_roomInterfaces.push_back(DEFAULT_INTERFACE); // resource interface. + m_roomInterfaces.push_back(BATCH_INTERFACE); // resource interface. + m_roomInterfaces.push_back(LINK_INTERFACE); // resource interface. + m_roomRep.setUri(m_roomUri); + m_roomRep.setResourceTypes(m_roomTypes); + m_roomRep.setResourceInterfaces(m_roomInterfaces); } /// This function internally calls registerResource API. @@ -90,8 +106,8 @@ public: { // This will internally create and register the resource. OCStackResult result = platform.registerResource( - m_roomHandle, m_roomUri, m_roomType, - m_roomInterface1, NULL, //entityHandlerRoom, + m_roomHandle, m_roomUri, m_roomTypes[0], + m_roomInterfaces[0], NULL, //entityHandlerRoom, OC_DISCOVERABLE | OC_OBSERVABLE ); @@ -100,21 +116,21 @@ public: cout << "Resource creation (room) was unsuccessful\n"; } - result = platform.bindInterfaceToResource(m_roomHandle, m_roomInterface2); + result = platform.bindInterfaceToResource(m_roomHandle, m_roomInterfaces[1]); if (OC_STACK_OK != result) { cout << "Binding TypeName to Resource was unsuccessful\n"; } - result = platform.bindInterfaceToResource(m_roomHandle, m_roomInterface3); + result = platform.bindInterfaceToResource(m_roomHandle, m_roomInterfaces[2]); if (OC_STACK_OK != result) { cout << "Binding TypeName to Resource was unsuccessful\n"; } result = platform.registerResource( - m_lightHandle, m_lightUri, m_lightType, - m_lightInterface, entityHandlerLight, + m_lightHandle, m_lightUri, m_lightTypes[0], + m_lightInterfaces[0], entityHandlerLight, OC_DISCOVERABLE | OC_OBSERVABLE ); @@ -124,8 +140,8 @@ public: } result = platform.registerResource( - m_fanHandle, m_fanUri, m_fanType, - m_fanInterface, entityHandlerFan, + m_fanHandle, m_fanUri, m_fanTypes[0], + m_fanInterfaces[0], entityHandlerFan, OC_DISCOVERABLE | OC_OBSERVABLE ); @@ -148,128 +164,56 @@ public: } - void setRoomRepresentation(OCRepresentation& rep) + void setLightRepresentation(OCRepresentation& rep) { - setLightRepresentation(rep); - setFanRepresentation(rep); - } + bool tempState = false; + int tempColor = 0; - void setLightRepresentation(OCRepresentation& light) - { - AttributeMap attributeMap = light.getAttributeMap(); - - if(attributeMap.find("state") != attributeMap.end() && attributeMap.find("color") != attributeMap.end()) + // If both entries exist + if(rep.getValue("state", tempState) && rep.getValue("color", tempColor)) { - m_lightState = attributeMap["state"][0].compare("true") == 0; - m_lightColor= std::stoi(attributeMap["color"][0]); + m_lightState = tempState; + m_lightColor= tempColor; + + cout << "\t\t\t\t" << "state: " << m_lightState << endl; + cout << "\t\t\t\t" << "color: " << m_lightColor << endl; } } - void setFanRepresentation(OCRepresentation& fan) + void setFanRepresentation(OCRepresentation& rep) { - AttributeMap attributeMap = fan.getAttributeMap(); + bool tempState = false; + int tempSpeed = 0; - if(attributeMap.find("state") != attributeMap.end() && attributeMap.find("speed") != attributeMap.end()) + // If both entries exist + if(rep.getValue("state", tempState) && rep.getValue("speed", tempSpeed)) { - m_fanState = attributeMap["state"][0].compare("true") == 0; - m_fanSpeed = std::stoi(attributeMap["speed"][0]); + m_fanState = tempState; + m_fanSpeed = tempSpeed; + + cout << "\t\t\t\t" << "state: " << m_fanState << endl; + cout << "\t\t\t\t" << "speed: " << m_fanSpeed << endl; } } - OCRepresentation getLightRepresentation() const + OCRepresentation getLightRepresentation() { - OCRepresentation light; - - light.setUri(m_lightUri); - - std::vector interfaces; - interfaces.push_back(m_lightInterface); - - light.setResourceInterfaces(interfaces); - - std::vector types; - types.push_back(m_lightType); - - light.setResourceTypes(types); - - AttributeMap attributeMap; - AttributeValues stateVal; - if(m_lightState) - { - stateVal.push_back("true"); - } - else - { - stateVal.push_back("false"); - } + m_lightRep.setValue("state", m_lightState); + m_lightRep.setValue("color", m_lightColor); - AttributeValues colorVal; - colorVal.push_back(to_string(m_lightColor)); - - attributeMap["state"] = stateVal; - attributeMap["color"] = colorVal; - - light.setAttributeMap(attributeMap); - - return light; + return m_lightRep; } - OCRepresentation getFanRepresentation() const + OCRepresentation getFanRepresentation() { - OCRepresentation fan; - fan.setUri(m_fanUri); - - std::vector interfaces; - interfaces.push_back(m_fanInterface); - - fan.setResourceInterfaces(interfaces); - - std::vector types; - types.push_back(m_fanType); - - fan.setResourceTypes(types); - - AttributeMap attributeMap; - AttributeValues stateVal; - if(m_fanState) - { - stateVal.push_back("true"); - } - else - { - stateVal.push_back("false"); - } - - AttributeValues speedVal; - speedVal.push_back(to_string(m_fanSpeed)); - - attributeMap["state"] = stateVal; - attributeMap["speed"] = speedVal; - - fan.setAttributeMap(attributeMap); - - return fan; + m_fanRep.setValue("state", m_fanState); + m_fanRep.setValue("speed", m_fanSpeed); + return m_fanRep; } - OCRepresentation getRoomRepresentation(void) const + OCRepresentation getRoomRepresentation(void) { - OCRepresentation room; - - room.setUri(m_roomUri); - - std::vector interfaces; - interfaces.push_back(m_roomInterface1); - interfaces.push_back(m_roomInterface2); - interfaces.push_back(m_roomInterface3); - - room.setResourceInterfaces(interfaces); - - std::vector types; - types.push_back(m_roomType); - - room.setResourceTypes(types); - std::vector children; OCRepresentation light = getLightRepresentation(); @@ -277,9 +221,10 @@ public: OCRepresentation fan = getFanRepresentation(); children.push_back(fan); - room.setChildren(children); + + m_roomRep.setChildren(children); - return room; + return m_roomRep; } }; @@ -346,40 +291,13 @@ void entityHandlerRoom(std::shared_ptr request, std::shared_p { cout << "\t\t\trequestType : PUT\n"; - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - // Get the representation from the request - OCRepresentation rep = request->getResourceRepresentation(); - - myRoomResource.setRoomRepresentation(rep); - - // Do related operations related to PUT request - rep = myRoomResource.getRoomRepresentation(); + entityHandlerLight(request, response); + entityHandlerFan(request, response); if(response) { - // TODO Error Code - response->setErrorCode(200); - - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } + response->setResourceRepresentation(myRoomResource.getRoomRepresentation()); } - } else if(requestType == "POST") { @@ -426,32 +344,11 @@ void entityHandlerLight(std::shared_ptr request, std::shared_ { cout << "\t\t\trequestType : GET\n"; - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - OCRepresentation rep = myRoomResource.getLightRepresentation(); - if(response) { // TODO Error Code response->setErrorCode(200); - - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } + response->setResourceRepresentation(myRoomResource.getLightRepresentation()); } } @@ -459,38 +356,16 @@ void entityHandlerLight(std::shared_ptr request, std::shared_ { cout << "\t\t\trequestType : PUT\n"; - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - // Get the representation from the request OCRepresentation rep = request->getResourceRepresentation(); - myRoomResource.setLightRepresentation(rep); - // Do related operations related to PUT request - rep = myRoomResource.getLightRepresentation(); + myRoomResource.setLightRepresentation(rep); if(response) { // TODO Error Code response->setErrorCode(200); - - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } + response->setResourceRepresentation(myRoomResource.getLightRepresentation()); } } @@ -539,32 +414,12 @@ void entityHandlerFan(std::shared_ptr request, std::shared_pt { cout << "\t\t\trequestType : GET\n"; - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - OCRepresentation rep = myRoomResource.getFanRepresentation(); - if(response) { // TODO Error Code response->setErrorCode(200); - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } + response->setResourceRepresentation(myRoomResource.getFanRepresentation()); } } @@ -572,40 +427,17 @@ void entityHandlerFan(std::shared_ptr request, std::shared_pt { cout << "\t\t\trequestType : PUT\n"; - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - // Get the representation from the request OCRepresentation rep = request->getResourceRepresentation(); - myRoomResource.setFanRepresentation(rep); - // Do related operations related to PUT request - rep = myRoomResource.getFanRepresentation(); + myRoomResource.setFanRepresentation(rep); if(response) { // TODO Error Code response->setErrorCode(200); - - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } + response->setResourceRepresentation(myRoomResource.getFanRepresentation()); } - } else if(requestType == "POST") { diff --git a/examples/simpleclient.cpp b/examples/simpleclient.cpp index 4df1c95..830de5a 100644 --- a/examples/simpleclient.cpp +++ b/examples/simpleclient.cpp @@ -32,6 +32,21 @@ const int SUCCESS_RESPONSE = 0; std::shared_ptr curResource; static ObserveType OBSERVE_TYPE_TO_USE = ObserveType::Observe; +class Light +{ +public: + + bool m_state; + int m_power; + std::string m_name; + + Light() : m_state(false), m_power(0), m_name("") + { + } +}; + +Light mylight; + int observe_count() { static int oc = 0; @@ -42,21 +57,17 @@ void onObserve(const OCRepresentation& rep, const int& eCode, const int& sequenc { if(eCode == SUCCESS_RESPONSE) { - AttributeMap attributeMap = rep.getAttributeMap(); - std::cout << "OBSERVE RESULT:"<first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } - std::cout << std::endl; - } - + rep.getValue("state", mylight.m_state); + rep.getValue("power", mylight.m_power); + rep.getValue("name", mylight.m_name); + + std::cout << "\tstate: " << mylight.m_state << std::endl; + std::cout << "\tpower: " << mylight.m_power << std::endl; + std::cout << "\tname: " << mylight.m_name << std::endl; + if(observe_count() > 30) { std::cout<<"Cancelling Observe..."<first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } - - std::cout << std::endl; - } - - std::vector children = rep.getChildren(); - - for(auto oit = children.begin(); oit != children.end(); ++oit) - { - attributeMap = oit->getAttributeMap(); - - for(auto it = attributeMap.begin(); it != attributeMap.end(); ++it) - { - std::cout << "\tAttribute name: "<< it->first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } + rep.getValue("state", mylight.m_state); + rep.getValue("power", mylight.m_power); + rep.getValue("name", mylight.m_name); - std::cout << std::endl; - } - } + std::cout << "\tstate: " << mylight.m_state << std::endl; + std::cout << "\tpower: " << mylight.m_power << std::endl; + std::cout << "\tname: " << mylight.m_name << std::endl; if (OBSERVE_TYPE_TO_USE == ObserveType::Observe) std::cout << endl << "Observe is used." << endl << endl; else if (OBSERVE_TYPE_TO_USE == ObserveType::ObserveAll) std::cout << endl << "ObserveAll is used." << endl << endl; - QueryParamsMap test; - - curResource->observe(OBSERVE_TYPE_TO_USE, test, &onObserve); + curResource->observe(OBSERVE_TYPE_TO_USE, QueryParamsMap(), &onObserve); } else @@ -136,26 +122,19 @@ void putLightRepresentation(std::shared_ptr resource) if(resource) { OCRepresentation rep; - + std::cout << "Putting light representation..."<put(rep, queryParamsMap, &onPut); } } @@ -166,41 +145,15 @@ void onGet(const OCRepresentation& rep, const int eCode) if(eCode == SUCCESS_RESPONSE) { std::cout << "GET request was successful" << std::endl; - - AttributeMap attributeMap = rep.getAttributeMap(); - std::cout << "Resource URI: " << rep.getUri() << std::endl; - for(auto it = attributeMap.begin(); it != attributeMap.end(); ++it) - { - std::cout << "\tAttribute name: "<< it->first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } - - std::cout << std::endl; - } - - std::vector children = rep.getChildren(); - - for(auto oit = children.begin(); oit != children.end(); ++oit) - { - std::cout << "Child Resource URI: " << oit->getUri() << std::endl; - - attributeMap = oit->getAttributeMap(); - - for(auto it = attributeMap.begin(); it != attributeMap.end(); ++it) - { - std::cout << "\tAttribute name: "<< it->first << " value: "; - for(auto valueItr = it->second.begin(); valueItr != it->second.end(); ++valueItr) - { - std::cout <<"\t"<< *valueItr << " "; - } + rep.getValue("state", mylight.m_state); + rep.getValue("power", mylight.m_power); + rep.getValue("name", mylight.m_name); - std::cout << std::endl; - } - } + std::cout << "\tstate: " << mylight.m_state << std::endl; + std::cout << "\tpower: " << mylight.m_power << std::endl; + std::cout << "\tname: " << mylight.m_name << std::endl; putLightRepresentation(curResource); } @@ -227,7 +180,6 @@ void getLightRepresentation(std::shared_ptr resource) // Callback to found resources void foundResource(std::shared_ptr resource) { - if(curResource) { std::cout << "Found another resource, ignoring"< resource) hostAddress = resource->host(); std::cout << "\tHost address of the resource: " << hostAddress << std::endl; - // Get the resource types + // Get the resource types std::cout << "\tList of resource types: " << std::endl; for(auto &resourceTypes : resource->getResourceTypes()) { std::cout << "\t\t" << resourceTypes << std::endl; } - + // Get the resource interfaces std::cout << "\tList of resource interfaces: " << std::endl; for(auto &resourceInterfaces : resource->getResourceInterfaces()) { std::cout << "\t\t" << resourceInterfaces << std::endl; - } + } if(resourceURI == "/a/light") { diff --git a/examples/simpleclientserver.cpp b/examples/simpleclientserver.cpp index a28fe6d..b824a55 100644 --- a/examples/simpleclientserver.cpp +++ b/examples/simpleclientserver.cpp @@ -36,13 +36,12 @@ using namespace OC; class ClientWorker { private: + bool m_isFoo; + int m_barCount; void putResourceInfo(const OCRepresentation rep, const OCRepresentation rep2, const int eCode) { std::cout << "In PutResourceInfo" << std::endl; - AttributeMap requestedPut = rep.getAttributeMap(); - AttributeMap attrMap = rep2.getAttributeMap(); - std::cout <<"Clientside Put response to get was: "<put(rep2, QueryParamsMap(), PutCallback(std::bind(&ClientWorker::putResourceInfo, this, rep2, std::placeholders::_1, std::placeholders::_2))); } @@ -147,8 +130,8 @@ private: } std::cout<<"Doing a get on q/foo."<get(test, GetCallback(std::bind(&ClientWorker::getResourceInfo, this, std::placeholders::_1, std::placeholders::_2))); + + resource->get(QueryParamsMap(), GetCallback(std::bind(&ClientWorker::getResourceInfo, this, std::placeholders::_1, std::placeholders::_2))); } } @@ -177,8 +160,14 @@ struct FooResource bool m_isFoo; int m_barCount; OCResourceHandle m_resourceHandle; + OCRepresentation m_rep; - FooResource(): m_isFoo(true), m_barCount (0){} + FooResource(): m_isFoo(true), m_barCount (0) + { + m_rep.setUri("/q/foo"); + m_rep.setValue("isFoo", m_isFoo); + m_rep.setValue("barCount", m_barCount); + } bool createResource(OCPlatform& platform) { @@ -201,38 +190,18 @@ struct FooResource return true; } - void getRepresentation(OCRepresentation& rep) + OCRepresentation get() { - AttributeMap attributeMap; - - AttributeValues isFooVal; - isFooVal.push_back(m_isFoo ? "true" : "false"); + m_rep.setValue("isFoo", m_isFoo); + m_rep.setValue("barCount", m_barCount); - AttributeValues barCt; - barCt.push_back(to_string(m_barCount)); - - attributeMap["isFoo"] = isFooVal; - attributeMap["barCount"] = barCt; - - rep.setAttributeMap(attributeMap); + return m_rep; } - void setRepresentation(OCRepresentation& rep) + void put(OCRepresentation& rep) { - AttributeMap attributeMap(rep.getAttributeMap()); - - try - { - auto fooVector = attributeMap.at("isFoo"); - m_isFoo = fooVector[0] == "true"; - auto barVector = attributeMap.at("barCount"); - m_barCount = std::stoi(barVector[0]); - rep.setAttributeMap(attributeMap); - } - catch(std::out_of_range& e) - { - std::cerr << "setRepresentation(): unable to look up values in attributeMap: " << e.what() << '\n'; - } + rep.getValue("isFoo", m_isFoo); + rep.getValue("barCount", m_barCount); } void entityHandler(std::shared_ptr request, std::shared_ptr response) @@ -251,13 +220,10 @@ struct FooResource { std::cout<<"\t\t\trequestType : GET"<setErrorCode(200); - response->setResourceRepresentation(rep, ""); + response->setResourceRepresentation(get(), ""); } } else if (request->getRequestType() == "PUT") @@ -265,14 +231,12 @@ struct FooResource std::cout<<"\t\t\trequestType : PUT"<getResourceRepresentation(); - setRepresentation(rep); + put(rep); if(response) { response->setErrorCode(200); - OCRepresentation rep; - getRepresentation(rep); - response->setResourceRepresentation(rep, ""); + response->setResourceRepresentation(get(), ""); } } else diff --git a/examples/simpleserver.cpp b/examples/simpleserver.cpp index 14f5115..d95ce63 100644 --- a/examples/simpleserver.cpp +++ b/examples/simpleserver.cpp @@ -45,14 +45,23 @@ class LightResource { public: /// Access this property from a TB client + std::string m_name; bool m_state; int m_power; std::string m_lightUri; OCResourceHandle m_resourceHandle; + OCRepresentation m_lightRep; public: /// Constructor - LightResource(): m_state(false), m_power(0), m_lightUri("/a/light") {} + LightResource(): m_name("John's light"), m_state(false), m_power(0), m_lightUri("/a/light") { + // Initialize representation + m_lightRep.setUri(m_lightUri); + + m_lightRep.setValue("state", m_state); + m_lightRep.setValue("power", m_power); + m_lightRep.setValue("name", m_name); + } /* Note that this does not need to be a member function: for classes you do not have access to, you can accomplish this with a free function: */ @@ -83,57 +92,46 @@ public: return m_resourceHandle; } - void setRepresentation(OCRepresentation& light) + // Puts representation. + // Gets values from the representation and + // updates the internal state + void put(OCRepresentation& rep) { - AttributeMap attributeMap = light.getAttributeMap(); - - if(attributeMap.find("state") != attributeMap.end() && attributeMap.find("power") != attributeMap.end()) - { - cout << "\t\t\t" << "Received representation: " << endl; - cout << "\t\t\t\t" << "power: " << attributeMap["power"][0] << endl; - cout << "\t\t\t\t" << "state: " << attributeMap["state"][0] << endl; - - m_state = attributeMap["state"][0].compare("true") == 0; - m_power= std::stoi(attributeMap["power"][0]); - } - } - - OCRepresentation getRepresentation() - { - OCRepresentation light; - - light.setUri(m_lightUri); - - std::vector interfaces; - //interfaces.push_back(m_lightInterface); - - light.setResourceInterfaces(interfaces); - - std::vector types; - //types.push_back(m_lightType); - - light.setResourceTypes(types); + try { + if (rep.getValue("state", m_state)) + { + cout << "\t\t\t\t" << "state: " << m_state << endl; + } + else + { + cout << "\t\t\t\t" << "state not found in the representation" << endl; + } - AttributeMap attributeMap; - AttributeValues stateVal; - if(m_state) - { - stateVal.push_back("true"); + if (rep.getValue("power", m_power)) + { + cout << "\t\t\t\t" << "power: " << m_power << endl; + } + else + { + cout << "\t\t\t\t" << "power not found in the representation" << endl; + } } - else + catch (exception& e) { - stateVal.push_back("false"); + cout << e.what() << endl; } - AttributeValues powerVal; - powerVal.push_back(to_string(m_power)); - - attributeMap["state"] = stateVal; - attributeMap["power"] = powerVal; + } - light.setAttributeMap(attributeMap); + // gets the updated representation. + // Updates the representation with latest internal state before + // sending out. + OCRepresentation get() + { + m_lightRep.setValue("state", m_state); + m_lightRep.setValue("power", m_power); - return light; + return m_lightRep; } void addType(const OC::OCPlatform& platform, const std::string& type) const @@ -156,7 +154,7 @@ public: }; // Create the instance of the resource class (in this case instance of class 'LightResource'). -LightResource myLightResource; +LightResource myLight; // ChangeLightRepresentaion is an observation function, // which notifies any changes to the resource to stack @@ -174,12 +172,12 @@ void * ChangeLightRepresentation (void *param) // we call notifyObservors // // For demostration we are changing the power value and notifying. - myLightResource.m_power += 10; + myLight.m_power += 10; - cout << "\nPower updated to : " << myLightResource.m_power << endl; - cout << "Notifying observers with resource handle: " << myLightResource.getHandle() << endl; + cout << "\nPower updated to : " << myLight.m_power << endl; + cout << "Notifying observers with resource handle: " << myLight.getHandle() << endl; - OCStackResult result = OCPlatform::notifyObservers(myLightResource.getHandle()); + OCStackResult result = OCPlatform::notifyObservers(myLight.getHandle()); if(OC_STACK_NO_OBSERVERS == result) { @@ -220,75 +218,31 @@ void entityHandler(std::shared_ptr request, std::shared_ptrgetQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(QueryParamsMap::iterator it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - // Process query params and do required operations .. - - // Get the representation of this resource at this point and send it as response - // AttributeMap attributeMap; - OCRepresentation rep; - rep = myLightResource.getRepresentation(); - if(response) { // TODO Error Code response->setErrorCode(200); - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } + response->setResourceRepresentation(myLight.get()); } } else if(requestType == "PUT") { cout << "\t\t\trequestType : PUT\n"; - // Check for query params (if any) - QueryParamsMap queryParamsMap = request->getQueryParameters(); - - cout << "\t\t\tquery params: \n"; - for(auto it = queryParamsMap.begin(); it != queryParamsMap.end(); it++) - { - cout << "\t\t\t\t" << it->first << ":" << it->second << endl; - } - - // Get the representation from the request OCRepresentation rep = request->getResourceRepresentation(); - myLightResource.setRepresentation(rep); - // Do related operations related to PUT request - rep = myLightResource.getRepresentation(); + + // Update the lightResource + myLight.put(rep); if(response) { // TODO Error Code response->setErrorCode(200); - auto findRes = queryParamsMap.find("if"); - - if(findRes != queryParamsMap.end()) - { - response->setResourceRepresentation(rep, findRes->second); - } - else - { - response->setResourceRepresentation(rep, DEFAULT_INTERFACE); - } + response->setResourceRepresentation(myLight.get()); } } @@ -344,10 +298,10 @@ int main() OCPlatform platform(cfg); // Invoke createResource function of class light. + myLight.createResource(platform); - myLightResource.createResource(platform); - myLightResource.addType(platform, std::string("core.brightlight")); - myLightResource.addInterface(platform, std::string("oc.mi.ll")); + myLight.addType(platform, std::string("core.brightlight")); + myLight.addInterface(platform, std::string("oc.mi.ll")); // Perform app tasks while(true) { @@ -359,7 +313,6 @@ int main() //log(e.what()); } - // No explicit call to stop the platform. // When OCPlatform destructor is invoked, internally we do platform cleanup } diff --git a/include/OCApi.h b/include/OCApi.h index 8d03c51..b644e3c 100644 --- a/include/OCApi.h +++ b/include/OCApi.h @@ -26,6 +26,9 @@ #include #include #include + +#include + #include "ocstack.h" namespace OC @@ -109,10 +112,122 @@ namespace OC ObserveAll }; - // TODO: To find the complete JSon data structure and modify map value type - // Typedef for attribute values and attribute map. - typedef std::vector AttributeValues; - typedef std::map AttributeMap; + typedef std::map AttributeMap; + + struct AttributeNull {}; + + // Forward declaration + struct AttributeDataValue; + + typedef std::map AttributeMapValue; + typedef std::vector AttributeValueVector; + + typedef boost::variant< + AttributeNull, + int, + bool, + std::string, + AttributeMapValue, + AttributeValueVector> AttributeValue; + + struct AttributeDataValue + { + AttributeValue data; + }; + + class ComposeVisitor : public boost::static_visitor + { + public: + std::string operator() (const AttributeNull& nl) const + { + // TODO Not Implemented + return std::string(); + } + + // TODO different int sizes + std::string operator() (const int i) const + { + return std::to_string(i); + } + + std::string operator() (const std::string& str) const + { + return str; + } + + std::string operator() (const bool b) const + { + if(b) + { + return "true"; + } + else + { + return "false"; + } + } + + std::string operator() (const AttributeMapValue& objValue) const + { + // TODO Not Implemented + return std::string(); + std::ostringstream json; + } + + std::string operator() (const AttributeValueVector& values) const + { + // TODO Not Implemented + return std::string(); + std::ostringstream json; + } + }; + + class ParseVisitor : public boost::static_visitor + { + public: + + ParseVisitor(std::string str): m_str(str) + { + } + + void operator() (AttributeNull& nl) const + { + // TODO Not Implemented + } + + void operator() (int& i) const + { + i = std::stoi(m_str); + } + + void operator() (std::string& str) const + { + str = m_str; + } + + void operator() (bool& b) const + { + b = m_str.compare("true") == 0; + } + + void operator() (AttributeMapValue& objValue) const + { + // TODO Not Implemented + } + + void operator() (AttributeValueVector& values) const + { + // TODO Not Implemented + } + + private: + std::string m_str; + }; + + typedef std::map AttributeMap1; + + std::string getJSON(const AttributeValue& v); + void parseJSON(AttributeValue& v, std::string str); // Typedef for query parameter map typedef std::map QueryParamsMap; @@ -139,7 +254,6 @@ namespace OC AttributeMap m_attributeMap; std::vector m_resourceTypes; std::vector m_resourceInterfaces; - bool m_observable; // TODO : do we need this here??? int errorCode; std::vector m_children; @@ -152,6 +266,30 @@ namespace OC return m_uri; } + template + void setValue(const std::string& str, const T& val) + { + m_attributeMap[str] = getJSON(val); + } + + template + bool getValue(const std::string& str, T& val) const + { + auto x = m_attributeMap.find(str); + + if(m_attributeMap.end() != x) + { + AttributeValue v = val; + parseJSON(v, x->second); + val = boost::get(v); + return true; + } + else + { + return false; + } + } + void setUri(std::string uri) { m_uri = uri; @@ -179,7 +317,7 @@ namespace OC return m_attributeMap; } - void setAttributeMap(AttributeMap map) + void setAttributeMap(const AttributeMap map) { m_attributeMap = map; } diff --git a/include/OCResourceRequest.h b/include/OCResourceRequest.h index 8805f74..c927522 100644 --- a/include/OCResourceRequest.h +++ b/include/OCResourceRequest.h @@ -74,16 +74,14 @@ namespace OC /** * Provides the entire resource attribute representation - * @return std::map AttributeMap reference containing the name value pairs representing the resource's attributes + * @return OCRepresentation reference containing the name value pairs representing the resource's attributes */ - const AttributeMap& getAttributeRepresentation() const {return m_attributeMap;} const OCRepresentation& getResourceRepresentation() const {return m_representation;} private: std::string m_requestType; QueryParamsMap m_queryParameters; RequestHandlerFlag m_requestHandlerFlag; - AttributeMap m_attributeMap; OCRepresentation m_representation; public: @@ -98,10 +96,11 @@ namespace OC // This function will not be exposed in future void setPayload(const std::string& requestPayload) { + AttributeMap attributeMap; // TODO: The following JSON Parse implementation should be seperated into utitilites // and used wherever required. // e.g. parse(std::string& payload, Attributemap& attributeMap) - + std::stringstream requestStream; requestStream << requestPayload; boost::property_tree::ptree root; @@ -124,13 +123,10 @@ namespace OC std::string name = item.first.data(); std::string value = item.second.data(); - AttributeValues values; - values.push_back(value); - - m_attributeMap[name] = values; + attributeMap[name] = value; } - - m_representation.setAttributeMap(m_attributeMap); + + m_representation.setAttributeMap(attributeMap); } // TODO: This is not a public API for app developers. diff --git a/include/OCResourceResponse.h b/include/OCResourceResponse.h index 6c6cfa0..425a82d 100644 --- a/include/OCResourceResponse.h +++ b/include/OCResourceResponse.h @@ -18,9 +18,9 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -/// @file OCResourceResponse.h +/// @file OCResourceResponse.h -/// @brief This file contains the declaration of classes and its members related to +/// @brief This file contains the declaration of classes and its members related to /// ResourceResponse. #ifndef __OCRESOURCERESPONSE_H @@ -44,12 +44,12 @@ namespace OC typedef std::shared_ptr Ptr; /** - * Default destructor + * Default destructor */ OCResourceResponse() {} /** - * Virtual destructor + * Virtual destructor */ virtual ~OCResourceResponse(void) {} @@ -60,10 +60,11 @@ namespace OC void setErrorCode(const int eCode) { m_errorCode = eCode; } /** - * API to set the entire resource attribute representation (BATCH) + * API to set the entire resource attribute representation * @param attributeMap reference containing the name value pairs representing the resource's attributes + * @param interface specifies the interface */ - void setResourceRepresentation(OCRepresentation& rep, std::string interface) { + void setResourceRepresentation(OCRepresentation& rep, std::string interface) { if(!interface.compare(LINK_INTERFACE)) { setResourceRepresentationLL(rep); @@ -80,10 +81,37 @@ namespace OC } /** + * API to set the entire resource attribute representation + * @param attributeMap rvalue reference containing the name value pairs representing the resource's attributes + * @param interface specifies the interface + */ + void setResourceRepresentation(OCRepresentation&& rep, std::string interface) { + setResourceRepresentation(rep, interface); + } + + /** + * API to set the entire resource attribute representation + * @param attributeMap reference containing the name value pairs representing the resource's attributes + */ + void setResourceRepresentation(OCRepresentation& rep) { + // Call the default + setResourceRepresentationDefault(rep); + } + + /** + * API to set the entire resource attribute representation + * @param attributeMap rvalue reference containing the name value pairs representing the resource's attributes + */ + void setResourceRepresentation(OCRepresentation&& rep) { + // Call the above function + setResourceRepresentation(rep); + } + + /** * API to set the entire resource attribute representation (Linked List Interface)) * @param attributeMap reference containing the name value pairs representing the resource's attributes */ - void setResourceRepresentationLL(OCRepresentation& rep) { + void setResourceRepresentationLL(OCRepresentation& rep) { // Default Set @@ -91,7 +119,7 @@ namespace OC // Parent payload << "{"; - payload << "\"href\":"; + payload << "\"href\":"; payload << "\"" ; payload << rep.getUri(); payload << "\"" ; @@ -99,11 +127,11 @@ namespace OC // Children stuff std::vector children = rep.getChildren(); - + for(auto oitr = children.begin(); oitr != children.end(); ++oitr) { - payload << ",{\"href\":"; - + payload << ",{\"href\":"; + payload << "\"" ; payload << oitr->getUri(); payload << "\"" ; @@ -146,7 +174,7 @@ namespace OC * API to set the entire resource attribute representation (Default)) * @param attributeMap reference containing the name value pairs representing the resource's attributes */ - void setResourceRepresentationDefault(OCRepresentation& rep) { + void setResourceRepresentationDefault(OCRepresentation& rep) { // Default Set @@ -154,7 +182,7 @@ namespace OC // Parent payload << "{"; - payload << "\"href\":"; + payload << "\"href\":"; payload << "\"" ; payload << rep.getUri(); payload << "\"" ; @@ -169,17 +197,17 @@ namespace OC { payload << ','; } - payload << "\""<first<<"\":\""<< itr->second.front()<<"\""; + payload << "\""<first<<"\":\""<< itr->second <<"\""; } payload << "}}"; // Children stuff std::vector children = rep.getChildren(); - + for(auto oitr = children.begin(); oitr != children.end(); ++oitr) { - payload << ",{\"href\":"; + payload << ",{\"href\":"; payload << "\"" ; payload << oitr->getUri(); @@ -223,27 +251,27 @@ namespace OC * API to set the entire resource attribute representation (BATCH) * @param attributeMap reference containing the name value pairs representing the resource's attributes */ - void setResourceRepresentationBatch(OCRepresentation& rep) { + void setResourceRepresentationBatch(OCRepresentation& rep) { ostringstream payload; // Parent payload << "{"; - payload << "\"href\":"; + payload << "\"href\":"; payload << "\"" ; payload << rep.getUri(); payload << "\"" ; payload << "}"; std::vector children = rep.getChildren(); - + for(auto oitr = children.begin(); oitr != children.end(); ++oitr) { payload << ','; payload << "{"; - - payload << "\"href\":"; - + + payload << "\"href\":"; + payload << "\"" ; payload << oitr->getUri(); payload << "\"" ; @@ -258,7 +286,7 @@ namespace OC { payload << ','; } - payload << "\""<first<<"\":\""<< itr->second.front()<<"\""; + payload << "\""<first<<"\":\""<< itr->second<<"\""; } payload << "}}"; @@ -267,39 +295,6 @@ namespace OC m_payload = payload.str(); } - - /** TODO remove this once after above function stabilize. - * API to set the entire resource attribute representation - * @param attributeMap reference containing the name value pairs representing the resource's attributes - */ - void setResourceRepresentation(AttributeMap& attributes) { - - // TODO To be refactored - ostringstream payload; - - payload << "{"; - - // TODO fix this (do this programmatically) - payload << "\"href\":\"/a/room\""; - - payload << ",\"rep\":{"; - - for(AttributeMap::const_iterator itr = attributes.begin(); itr!= attributes.end(); ++ itr) - { - if(itr != attributes.begin()) - { - payload << ','; - } - // cout << itr->first << ":" <, itr->second.front() << endl; - payload << "\""<first<<"\":\""<< itr->second.front()<<"\""; - - } - - payload << "}}"; - - m_payload = payload.str(); - } - private: std::string m_payload; int m_errorCode; @@ -307,17 +302,12 @@ namespace OC // TODO only stack should have visibility and apps should not public: - /** - * Get error code - */ - int getErrorCode() const; - /** - * Get the resource attribute representation + * Get error code */ - AttributeMap& getResourceRepresentation() const; + int getErrorCode() const; - // TODO This should go away & just use getResourceRepresentation + // TODO This should go away & just use getResourceRepresentation std::string getPayload() { return m_payload; diff --git a/src/InProcClientWrapper.cpp b/src/InProcClientWrapper.cpp index b7b38e2..c405fd0 100644 --- a/src/InProcClientWrapper.cpp +++ b/src/InProcClientWrapper.cpp @@ -337,9 +337,7 @@ namespace OC { std::string name = item.first.data(); std::string value = item.second.data(); - AttributeValues values; - values.push_back(value); - attrs[name] = values; + attrs[name] = value; } if (isRoot) { @@ -480,14 +478,14 @@ namespace OC payload << ','; } - payload << "\""<first<<"\":\""<< itr->second.front()<<"\""; + payload << "\""<first<<"\":\""<< itr->second <<"\""; } payload << "}}"; return payload.str(); } OCStackResult InProcClientWrapper::SetResourceAttributes(const std::string& host, - const std::string& uri, const OCRepresentation& attributes, + const std::string& uri, const OCRepresentation& rep, const QueryParamsMap& queryParams, PutCallback& callback) { OCStackResult result; @@ -512,7 +510,7 @@ namespace OC OCDoHandle handle; result = OCDoResource(&handle, OC_REST_PUT, os.str().c_str(), nullptr, - assembleSetResourcePayload(attributes).c_str(), + assembleSetResourcePayload(rep).c_str(), static_cast(m_cfg.QoS), &cbdata); } diff --git a/src/OCUtilities.cpp b/src/OCUtilities.cpp index 95da802..6c652ee 100644 --- a/src/OCUtilities.cpp +++ b/src/OCUtilities.cpp @@ -27,7 +27,21 @@ extern "C" { #include // libcoap #include // libcoap } + +#include + namespace OC{ + + std::string getJSON(const AttributeValue& v) + { + return boost::apply_visitor(ComposeVisitor(), v); + } + + void parseJSON(AttributeValue& v, std::string str) + { + boost::apply_visitor(ParseVisitor(str), v); + } + // Helper function to escape special character. std::string escapeString(const std::string& value) { -- 2.7.4