From 589c6049fce2d74618bd5b6cd1e2c00b6c79365f Mon Sep 17 00:00:00 2001 From: Omkar Hegde Date: Tue, 21 Jul 2015 15:17:05 -0700 Subject: [PATCH] Default entity handler for collections Adding default entity handler for collection C samples in the case when the resource does not exist. This change fixes IOT-628. Change-Id: I4f060a856fd9bb712fc145a5c98081ecbe1fec7e Signed-off-by: Omkar Hegde Reviewed-on: https://gerrit.iotivity.org/gerrit/1803 Reviewed-by: Joseph Morrow Tested-by: jenkins-iotivity Reviewed-by: Erich Keane --- .../linux/SimpleClientServer/occlientcoll.cpp | 2 + .../linux/SimpleClientServer/ocservercoll.cpp | 53 ++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp index 8c4ce40..94e9e14 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp @@ -227,6 +227,8 @@ OCStackApplicationResult discoveryReqCB(void* ctx, OCDoHandle handle, clientResponse->devAddr.port); OC_LOG_PAYLOAD(INFO, TAG, clientResponse->payload); + OC_CONNTYPE = clientResponse->connType; + if(TEST == TEST_UNKNOWN_RESOURCE_GET_DEFAULT || TEST == TEST_UNKNOWN_RESOURCE_GET_BATCH ||\ TEST == TEST_UNKNOWN_RESOURCE_GET_LINK_LIST) { diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp index 86d79b5..d3fed5a 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp @@ -103,6 +103,57 @@ PrintReceivedMsgInfo(OCEntityHandlerFlag flag, OCEntityHandlerRequest * ehReques typeOfMethod); } +//The only case when this entity handler is for a non-existing resource. +OCEntityHandlerResult +OCDeviceEntityHandlerCb (OCEntityHandlerFlag flag, + OCEntityHandlerRequest *entityHandlerRequest, char* uri, void* callbackParam) +{ + OC_LOG_V(INFO, TAG, "Inside device default entity handler - flags: 0x%x, uri: %s", flag, uri); + + OCEntityHandlerResult ehResult = OC_EH_OK; + OCEntityHandlerResponse response; + + if (!entityHandlerRequest) + { + OC_LOG(ERROR, TAG, "Invalid request pointer"); + return OC_EH_ERROR; + } + + if (entityHandlerRequest->resource == NULL) + { + OC_LOG(INFO, TAG, "Received request from client to a non-existing resource"); + ehResult = OC_EH_RESOURCE_NOT_FOUND; + } + else + { + OC_LOG_V(INFO, TAG, "Device Handler: Received unsupported request from client %d", + entityHandlerRequest->method); + ehResult = OC_EH_ERROR; + } + + if (!((ehResult == OC_EH_ERROR) || (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 = nullptr; + response.numSendVendorSpecificHeaderOptions = 0; + memset(response.sendVendorSpecificHeaderOptions, + 0, sizeof response.sendVendorSpecificHeaderOptions); + // Indicate that response is NOT in a persistent buffer + response.persistentBufferFlag = 0; + + // Send the response + if (OCDoResponse(&response) != OC_STACK_OK) + { + OC_LOG(ERROR, TAG, "Error sending response"); + ehResult = OC_EH_ERROR; + } + } + return ehResult; +} + OCEntityHandlerResult OCEntityHandlerRoomCb(OCEntityHandlerFlag flag, OCEntityHandlerRequest * ehRequest, void* callback) @@ -456,6 +507,8 @@ int main(int argc, char* argv[]) return 0; } + OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandlerCb, NULL); + /* * Declare and create the example resource: light */ -- 2.7.4