From 9a886671ae37ebe575acea57307b65639e12fcfe Mon Sep 17 00:00:00 2001 From: Sashi Penta Date: Wed, 24 Sep 2014 14:07:08 -0700 Subject: [PATCH] Default device entity handler implementation in C Stack. Patch 1-3: Implementation. Patch 4-5: Review comments from Doug and Joey. Patch 6: Joey -> Resolved 'defaultDeviceHandler' declaration down to one instance. Patch 7: Reverted Patch 6. Patch 8: Removed the declaration from ocresource.c Change-Id: Ic1a47f65ae6772ecf417fa5f7dcb384db029a4b7 --- csdk/stack/include/internal/ocresource.h | 1 + csdk/stack/include/internal/ocstackinternal.h | 6 +++ csdk/stack/include/ocstack.h | 15 ++++++ .../samples/linux/SimpleClientServer/ocserver.cpp | 55 ++++++++++++++++++++++ csdk/stack/src/ocresource.c | 27 +++++++++++ csdk/stack/src/ocstack.c | 13 +++++ 6 files changed, 117 insertions(+) diff --git a/csdk/stack/include/internal/ocresource.h b/csdk/stack/include/internal/ocresource.h index 4b3c1b6..a0781d8 100644 --- a/csdk/stack/include/internal/ocresource.h +++ b/csdk/stack/include/internal/ocresource.h @@ -54,6 +54,7 @@ typedef enum { OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER, OC_RESOURCE_COLLECTION_WITH_ENTITYHANDLER, OC_RESOURCE_COLLECTION_DEFAULT_ENTITYHANDLER, + OC_RESOURCE_DEFAULT_DEVICE_ENTITYHANDLER, OC_RESOURCE_NOT_SPECIFIED } ResourceHandling; diff --git a/csdk/stack/include/internal/ocstackinternal.h b/csdk/stack/include/internal/ocstackinternal.h index b9fc8a3..ac5469b 100644 --- a/csdk/stack/include/internal/ocstackinternal.h +++ b/csdk/stack/include/internal/ocstackinternal.h @@ -39,6 +39,12 @@ extern "C" { #endif // __cplusplus + +//----------------------------------------------------------------------------- +// Global variables +//----------------------------------------------------------------------------- +extern OCEntityHandler defaultDeviceHandler; + //----------------------------------------------------------------------------- // Defines //----------------------------------------------------------------------------- diff --git a/csdk/stack/include/ocstack.h b/csdk/stack/include/ocstack.h index 9d931b4..e6e8b3b 100644 --- a/csdk/stack/include/ocstack.h +++ b/csdk/stack/include/ocstack.h @@ -364,6 +364,21 @@ OCStackResult OCStartPresence(const uint32_t ttl); OCStackResult OCStopPresence(); #endif + + +/** + * Set default device entity handler + * + * @param entityHandler - entity handler function that is called by ocstack to handle requests for + * any undefined resources or default actions. + * if NULL is passed it removes the device default entity handler. + * + * @return + * OC_STACK_OK - no errors + * OC_STACK_ERROR - stack process error + */ +OCStackResult OCSetDefaultDeviceEntityHandler(OCEntityHandler entityHandler); + /** * Create a resource. * diff --git a/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp b/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp index 46e745d..2e3ae24 100644 --- a/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp +++ b/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp @@ -127,6 +127,58 @@ void ProcessObserveDeregister (OCEntityHandlerRequest *ehRequest) if (clientStillObserving == false) gLEDUnderObservation = 0; } +OCEntityHandlerResult +OCDeviceEntityHandlerCb (OCEntityHandlerFlag flag, + OCEntityHandlerRequest *entityHandlerRequest) +{ + const char* typeOfMessage; + + OC_LOG_V (INFO, TAG, "Inside device default entity handler - flags: 0x%x", flag); + if (flag & OC_INIT_FLAG) + { + OC_LOG (INFO, TAG, "Flag includes OC_INIT_FLAG"); + } + if (flag & OC_REQUEST_FLAG) + { + OC_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"); + ProcessGetRequest (entityHandlerRequest); + } + else if (OC_REST_PUT == entityHandlerRequest->method) + { + OC_LOG (INFO, TAG, "Received OC_REST_PUT from client"); + ProcessPutRequest (entityHandlerRequest); + } + else + { + OC_LOG_V (INFO, TAG, "Received unsupported method %d from client", + entityHandlerRequest->method); + } + } + } + if (flag & OC_OBSERVE_FLAG) + { + OC_LOG(INFO, TAG, "Flag includes OC_OBSERVE_FLAG"); + if (entityHandlerRequest) + { + if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo->action) + { + OC_LOG (INFO, TAG, "Received OC_OBSERVE_REGISTER from client"); + } + else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo->action) + { + OC_LOG (INFO, TAG, "Received OC_OBSERVE_DEREGISTER from client"); + } + } + } + + return OC_EH_OK; +} + OCEntityHandlerResult OCEntityHandlerCb (OCEntityHandlerFlag flag, @@ -303,6 +355,9 @@ int main(int argc, char* argv[]) return 0; } #endif + + OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandlerCb); + /* * Declare and create the example resource: LED */ diff --git a/csdk/stack/src/ocresource.c b/csdk/stack/src/ocresource.c index 9c88e6e..73300a8 100644 --- a/csdk/stack/src/ocresource.c +++ b/csdk/stack/src/ocresource.c @@ -293,7 +293,14 @@ OCStackResult DetermineResourceHandling (OCRequest *request, *resource = resourcePtr; if (!resourcePtr) { + if(defaultDeviceHandler) + { + *handling = OC_RESOURCE_DEFAULT_DEVICE_ENTITYHANDLER; + return OC_STACK_OK; + } + // Resource does not exist + // and default device handler does not exist return OC_STACK_NO_RESOURCE; } @@ -398,6 +405,21 @@ HandleVirtualResource (OCRequest *request, OCResource* resource) return result; } +static OCStackResult +HandleDefaultDeviceEntityHandler (OCRequest *request) +{ + OCStackResult result = OC_STACK_OK; + OCEntityHandlerRequest *ehRequest = request->entityHandlerRequest; + + // At this point we know for sure that defaultDeviceHandler exists + defaultDeviceHandler(OC_REQUEST_FLAG, ehRequest); + + ehRequest->resJSONPayloadLen = ehRequest->resJSONPayloadLen - + strlen((char*)ehRequest->resJSONPayload); + ehRequest->resJSONPayload += strlen((char*)ehRequest->resJSONPayload); + + return result; +} static OCStackResult HandleResourceWithEntityHandler (OCRequest *request, @@ -482,6 +504,11 @@ BuildJSONResponse(ResourceHandling resHandling, OCResource *resource, OCRequest break; } + case OC_RESOURCE_DEFAULT_DEVICE_ENTITYHANDLER: + { + ret = HandleDefaultDeviceEntityHandler(request); + break; + } case OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER: { OC_LOG(INFO, TAG, PCF("OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER")); diff --git a/csdk/stack/src/ocstack.c b/csdk/stack/src/ocstack.c index 99111ef..d847cf7 100644 --- a/csdk/stack/src/ocstack.c +++ b/csdk/stack/src/ocstack.c @@ -56,7 +56,9 @@ static PresenceResource presenceResource; uint8_t PresenceTimeOutSize = 4; uint32_t PresenceTimeOut[] = {50, 75, 85, 95, 100}; #endif + OCMode myStackMode; +OCEntityHandler defaultDeviceHandler; //----------------------------------------------------------------------------- // Macros @@ -247,6 +249,9 @@ OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode) break; } myStackMode = mode; + + defaultDeviceHandler = NULL; + // Make call to OCCoAP layer result = OCInitCoAP(ipAddr, (uint16_t) port, myStackMode); if (result == OC_STACK_OK) @@ -641,6 +646,14 @@ OCStackResult OCStopPresence() } #endif + +OCStackResult OCSetDefaultDeviceEntityHandler(OCEntityHandler entityHandler) +{ + defaultDeviceHandler = entityHandler; + + return OC_STACK_OK; +} + /** * Create a resource * -- 2.7.4