X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsamples%2Flinux%2Fsecure%2Focserverbasicops.cpp;h=9e161ef75280cefd0018c8528ca108c3332b969e;hb=8229635f6d207516ccbbdf23b13be164e0fc1787;hp=5635802219dd114a0e69c34e77891963046f0455;hpb=d77842b219057f672a02b6a60a0320357419f86c;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp b/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp index 5635802..9e161ef 100644 --- a/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp +++ b/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp @@ -18,16 +18,26 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include "iotivity_config.h" #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif #include +#ifdef HAVE_PTHREAD_H #include +#endif #include "ocstack.h" #include "logger.h" -#include "cJSON.h" +#include "ocpayload.h" #include "ocserverbasicops.h" +#include "common.h" + int gQuitFlag = 0; @@ -40,100 +50,116 @@ static LEDResource gLedInstance[SAMPLE_MAX_NUM_POST_INSTANCE]; char *gResourceUri= (char *)"/a/led"; -static uint16_t OC_WELL_KNOWN_PORT = 5683; +//Secure Virtual Resource database for Iotivity Server +//It contains Server's Identity and the PSK credentials +//of other devices which the server trusts +static char CRED_FILE[] = "oic_svr_db_server.dat"; + +OCRepPayload* getPayload(const char* uri, int64_t power, bool state) +{ + OCRepPayload* payload = OCRepPayloadCreate(); + if(!payload) + { + OIC_LOG(ERROR, TAG, PCF("Failed to allocate Payload")); + return nullptr; + } + + OCRepPayloadSetUri(payload, uri); + OCRepPayloadSetPropBool(payload, "state", state); + OCRepPayloadSetPropInt(payload, "power", power); + + return payload; +} //This function takes the request as an input and returns the response -//in JSON format. -char* constructJsonResponse (OCEntityHandlerRequest *ehRequest) +OCRepPayload* constructResponse (OCEntityHandlerRequest *ehRequest) { - cJSON *json = cJSON_CreateObject(); - cJSON *format; - char *jsonResponse; + if(ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) + { + OIC_LOG(ERROR, TAG, PCF("Incoming payload not a representation")); + return nullptr; + } + + OCRepPayload* input = reinterpret_cast(ehRequest->payload); + LEDResource *currLEDResource = &LED; if (ehRequest->resource == gLedInstance[0].handle) { currLEDResource = &gLedInstance[0]; - gResourceUri = (char *) "a/led/0"; + gResourceUri = (char *) "/a/led/0"; } else if (ehRequest->resource == gLedInstance[1].handle) { currLEDResource = &gLedInstance[1]; - gResourceUri = (char *) "a/led/1"; + gResourceUri = (char *) "/a/led/1"; } - if(OC_REST_PUT == ehRequest->method) + if(OC_REST_PUT == ehRequest->method + || OC_REST_POST == ehRequest->method) { - cJSON *putJson = cJSON_Parse((char *)ehRequest->reqJSONPayload); - currLEDResource->state = ( !strcmp(cJSON_GetObjectItem(putJson,"state")->valuestring , - "on") ? true:false); - currLEDResource->power = cJSON_GetObjectItem(putJson,"power")->valuedouble; - cJSON_Delete(putJson); - } + // Get pointer to query + int64_t pow; + if(OCRepPayloadGetPropInt(input, "power", &pow)) + { + currLEDResource->power =pow; + } - cJSON_AddStringToObject(json,"href",gResourceUri); - cJSON_AddItemToObject(json, "rep", format=cJSON_CreateObject()); - cJSON_AddStringToObject(format, "state", (char *) (currLEDResource->state ? "on":"off")); - cJSON_AddNumberToObject(format, "power", currLEDResource->power); + bool state; + if(OCRepPayloadGetPropBool(input, "state", &state)) + { + currLEDResource->state = state; + } + } - jsonResponse = cJSON_Print(json); - cJSON_Delete(json); - return jsonResponse; + return getPayload(gResourceUri, currLEDResource->power, currLEDResource->state); } OCEntityHandlerResult ProcessGetRequest (OCEntityHandlerRequest *ehRequest, - char *payload, size_t maxPayloadSize) + OCRepPayload **payload) { OCEntityHandlerResult ehResult; - char *getResp = constructJsonResponse(ehRequest); - if (maxPayloadSize > strlen (getResp)) + OCRepPayload *getResp = constructResponse(ehRequest); + + if(getResp) { - strcpy(payload, getResp); + *payload = getResp; ehResult = OC_EH_OK; } else { - OC_LOG_V (INFO, TAG, "Response buffer: %d bytes is too small", - maxPayloadSize); ehResult = OC_EH_ERROR; } - free(getResp); - return ehResult; } OCEntityHandlerResult ProcessPutRequest (OCEntityHandlerRequest *ehRequest, - char *payload, size_t maxPayloadSize) + OCRepPayload **payload) { OCEntityHandlerResult ehResult; - char *putResp = constructJsonResponse(ehRequest); - if (maxPayloadSize > strlen (putResp)) + OCRepPayload *putResp = constructResponse(ehRequest); + + if(putResp) { - strcpy(payload, putResp); + *payload = putResp; ehResult = OC_EH_OK; } else { - OC_LOG_V (INFO, TAG, "Response buffer: %d bytes is too small", - maxPayloadSize); ehResult = OC_EH_ERROR; } - free(putResp); - return ehResult; } OCEntityHandlerResult ProcessPostRequest (OCEntityHandlerRequest *ehRequest, - char *payload, size_t maxPayloadSize) + OCEntityHandlerResponse *response, OCRepPayload **payload) { - char *respPLPost_led = NULL; - cJSON *json; - cJSON *format; - OCEntityHandlerResult ehResult; + OCRepPayload *respPLPost_led = nullptr; + OCEntityHandlerResult ehResult = OC_EH_OK; /* * The entity handler determines how to process a POST request. @@ -143,7 +169,7 @@ OCEntityHandlerResult ProcessPostRequest (OCEntityHandlerRequest *ehRequest, * resource is created with default representation (if representation is included in * POST payload it can be used as initial values) as long as the instance is * lesser than max new instance count. Once max instance count is reached, POST on - * /a/led updated the representation of /a/led (just like PUT) + * /a/led updated the representation of /a/led. */ if (ehRequest->resource == LED.handle) @@ -152,28 +178,26 @@ OCEntityHandlerResult ProcessPostRequest (OCEntityHandlerRequest *ehRequest, { // Create new LED instance char newLedUri[15] = "/a/led/"; - sprintf (newLedUri + strlen(newLedUri), "%d", gCurrLedInstance); - - json = cJSON_CreateObject(); + int newLedUriLength = strlen(newLedUri); + snprintf (newLedUri + newLedUriLength, sizeof(newLedUri)-newLedUriLength, "%d", gCurrLedInstance); - cJSON_AddStringToObject(json,"href",gResourceUri); - cJSON_AddItemToObject(json, "rep", format=cJSON_CreateObject()); - cJSON_AddStringToObject(format, "createduri", (char *) newLedUri); + respPLPost_led = OCRepPayloadCreate(); + OCRepPayloadSetUri(respPLPost_led, gResourceUri); + OCRepPayloadSetPropString(respPLPost_led, "createduri", newLedUri); if (0 == createLEDResource (newLedUri, &gLedInstance[gCurrLedInstance], false, 0)) { - OC_LOG (INFO, TAG, "Created new LED instance"); + OIC_LOG (INFO, TAG, "Created new LED instance"); gLedInstance[gCurrLedInstance].state = 0; gLedInstance[gCurrLedInstance].power = 0; gCurrLedInstance++; - respPLPost_led = cJSON_Print(json); + strncpy ((char *)response->resourceUri, newLedUri, MAX_URI_LENGTH); + ehResult = OC_EH_RESOURCE_CREATED; } - - cJSON_Delete(json); } else { - respPLPost_led = constructJsonResponse(ehRequest); + respPLPost_led = constructResponse(ehRequest); } } else @@ -184,83 +208,83 @@ OCEntityHandlerResult ProcessPostRequest (OCEntityHandlerRequest *ehRequest, { if (i == 0) { - respPLPost_led = constructJsonResponse(ehRequest); + respPLPost_led = constructResponse(ehRequest); break; } else if (i == 1) { - respPLPost_led = constructJsonResponse(ehRequest); + respPLPost_led = constructResponse(ehRequest); } } } } - if ((respPLPost_led != NULL) && (maxPayloadSize > strlen (respPLPost_led))) + if (respPLPost_led != NULL) { - strcpy(payload, respPLPost_led); + *payload = respPLPost_led; ehResult = OC_EH_OK; } else { - OC_LOG_V (INFO, TAG, "Response buffer: %d bytes is too small", - maxPayloadSize); + OIC_LOG_V (INFO, TAG, "Payload was NULL"); ehResult = OC_EH_ERROR; } - free(respPLPost_led); - return ehResult; } OCEntityHandlerResult OCEntityHandlerCb (OCEntityHandlerFlag flag, - OCEntityHandlerRequest *entityHandlerRequest) + OCEntityHandlerRequest *entityHandlerRequest, + void* /*callbackParam*/) { - OC_LOG_V (INFO, TAG, "Inside entity handler - flags: 0x%x", flag); + OIC_LOG_V (INFO, TAG, "Inside entity handler - flags: 0x%x", flag); OCEntityHandlerResult ehResult = OC_EH_ERROR; - OCEntityHandlerResponse response; - char payload[MAX_RESPONSE_LENGTH]; - - if (flag & OC_INIT_FLAG) + OCEntityHandlerResponse response = { 0, 0, OC_EH_ERROR, 0, 0, { },{ 0 }, false }; + // Validate pointer + if (!entityHandlerRequest) { - OC_LOG (INFO, TAG, "Flag includes OC_INIT_FLAG"); - ehResult = OC_EH_OK; + OIC_LOG (ERROR, TAG, "Invalid request pointer"); + return OC_EH_ERROR; } + + OCRepPayload* payload = nullptr; + if (flag & OC_REQUEST_FLAG) { - OC_LOG (INFO, TAG, "Flag includes OC_REQUEST_FLAG"); + OIC_LOG (INFO, TAG, "Flag includes OC_REQUEST_FLAG"); if (entityHandlerRequest) { if (OC_REST_GET == entityHandlerRequest->method) { - OC_LOG (INFO, TAG, "Received OC_REST_GET from client"); - ehResult = ProcessGetRequest (entityHandlerRequest, payload, sizeof(payload)); + OIC_LOG (INFO, TAG, "Received OC_REST_GET from client"); + ehResult = ProcessGetRequest (entityHandlerRequest, &payload); } else if (OC_REST_PUT == entityHandlerRequest->method) { - OC_LOG (INFO, TAG, "Received OC_REST_PUT from client"); - ehResult = ProcessPutRequest (entityHandlerRequest, payload, sizeof(payload)); + OIC_LOG (INFO, TAG, "Received OC_REST_PUT from client"); + ehResult = ProcessPutRequest (entityHandlerRequest, &payload); } else if (OC_REST_POST == entityHandlerRequest->method) { - OC_LOG (INFO, TAG, "Received OC_REST_POST from client"); - ehResult = ProcessPostRequest (entityHandlerRequest, payload, sizeof(payload)); + OIC_LOG (INFO, TAG, "Received OC_REST_POST from client"); + ehResult = ProcessPostRequest (entityHandlerRequest, &response, &payload); } else { - OC_LOG_V (INFO, TAG, "Received unsupported method %d from client", + OIC_LOG_V (INFO, TAG, "Received unsupported method %d from client", entityHandlerRequest->method); + ehResult = OC_EH_ERROR; } - if (ehResult == OC_EH_OK) + if (ehResult == OC_EH_OK && ehResult != OC_EH_FORBIDDEN) { // Format the response. Note this requires some info about the request response.requestHandle = entityHandlerRequest->requestHandle; response.resourceHandle = entityHandlerRequest->resource; response.ehResult = ehResult; - response.payload = (unsigned char *)payload; - response.payloadSize = strlen(payload); + response.payload = reinterpret_cast(payload); response.numSendVendorSpecificHeaderOptions = 0; memset(response.sendVendorSpecificHeaderOptions, 0, sizeof response.sendVendorSpecificHeaderOptions); memset(response.resourceUri, 0, sizeof(response.resourceUri)); @@ -270,12 +294,14 @@ OCEntityHandlerCb (OCEntityHandlerFlag flag, // Send the response if (OCDoResponse(&response) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "Error sending response"); + OIC_LOG(ERROR, TAG, "Error sending response"); ehResult = OC_EH_ERROR; } } } } + + OCRepPayloadDestroy(payload); return ehResult; } @@ -288,27 +314,25 @@ void handleSigInt(int signum) } } -int main(int argc, char* argv[]) +FILE* server_fopen(const char *path, const char *mode) +{ + (void)path; + return fopen(CRED_FILE, mode); +} + +int main(int /*argc*/, char* /*argv*/[]) { - uint8_t addr[20] = {0}; - uint8_t* paddr = NULL; - uint16_t port = OC_WELL_KNOWN_PORT; - uint8_t ifname[] = "eth0"; struct timespec timeout; - OC_LOG(DEBUG, TAG, "OCServer is starting..."); - /*Get Ip address on defined interface and initialize coap on it with random port number - * this port number will be used as a source port in all coap communications*/ - if ( OCGetInterfaceAddress(ifname, sizeof(ifname), AF_INET, addr, - sizeof(addr)) == ERR_SUCCESS) - { - OC_LOG_V(INFO, TAG, "Starting ocserver on address %s:%d",addr,port); - paddr = addr; - } + OIC_LOG(DEBUG, TAG, "OCServer is starting..."); - if (OCInit((char *) paddr, port, OC_SERVER) != OC_STACK_OK) + // Initialize Persistent Storage for SVR database + OCPersistentStorage ps = { server_fopen, fread, fwrite, fclose, unlink }; + OCRegisterPersistentStorageHandler(&ps); + + if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack init error"); + OIC_LOG(ERROR, TAG, "OCStack init error"); return 0; } @@ -321,23 +345,23 @@ int main(int argc, char* argv[]) timeout.tv_nsec = 100000000L; // Break from loop with Ctrl-C - OC_LOG(INFO, TAG, "Entering ocserver main loop..."); + OIC_LOG(INFO, TAG, "Entering ocserver main loop..."); signal(SIGINT, handleSigInt); while (!gQuitFlag) { if (OCProcess() != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack process error"); + OIC_LOG(ERROR, TAG, "OCStack process error"); return 0; } nanosleep(&timeout, NULL); } - OC_LOG(INFO, TAG, "Exiting ocserver main loop..."); + OIC_LOG(INFO, TAG, "Exiting ocserver main loop..."); if (OCStop() != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack process error"); + OIC_LOG(ERROR, TAG, "OCStack process error"); } return 0; @@ -347,7 +371,7 @@ int createLEDResource (char *uri, LEDResource *ledResource, bool resourceState, { if (!uri) { - OC_LOG(ERROR, TAG, "Resource URI cannot be NULL"); + OIC_LOG(ERROR, TAG, "Resource URI cannot be NULL"); return -1; } @@ -355,11 +379,13 @@ int createLEDResource (char *uri, LEDResource *ledResource, bool resourceState, ledResource->power= resourcePower; OCStackResult res = OCCreateResource(&(ledResource->handle), "core.led", - "oc.mi.def", + OC_RSRVD_INTERFACE_DEFAULT, uri, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE|OC_OBSERVABLE | OC_SECURE); - OC_LOG_V(INFO, TAG, "Created LED resource with result: %s", getResult(res)); + OIC_LOG_V(INFO, TAG, "Created LED resource with result: %s", getResult(res)); return 0; } +