X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focresource.c;h=20cfd722b7062dbe84ba1fc4c3543bb77bd0aa4b;hb=17c68b2fd1e74586f85e552eeab4e32dc121f8a0;hp=5f64f10236a17ffe8a51d614ec89e424eeaf6859;hpb=8c01dff2c5bc5496f7dc1632c498943ec6ecb015;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/ocresource.c b/resource/csdk/stack/src/ocresource.c index 5f64f10..20cfd72 100644 --- a/resource/csdk/stack/src/ocresource.c +++ b/resource/csdk/stack/src/ocresource.c @@ -25,8 +25,8 @@ // For POSIX.1-2001 base specification, // Refer http://pubs.opengroup.org/onlinepubs/009695399/ #define _POSIX_C_SOURCE 200112L -#include "ocresource.h" #include +#include "ocresource.h" #include "ocresourcehandler.h" #include "ocobserve.h" #include "occollection.h" @@ -35,22 +35,30 @@ #include "logger.h" #include "cJSON.h" #include "ocpayload.h" - +#include "secureresourcemanager.h" #include "cacommon.h" #include "cainterface.h" +#include "rdpayload.h" + +#ifdef WITH_RD +#include "rd_server.h" +#endif +#ifdef ROUTING_GATEWAY +#include "routingmanager.h" +#endif /// Module Name -#define TAG PCF("ocresource") +#define TAG "ocresource" #define VERIFY_SUCCESS(op, successCode) { if (op != successCode) \ {OC_LOG_V(FATAL, TAG, "%s failed!!", #op); goto exit;} } #define VERIFY_NON_NULL(arg, logLevel, retVal) { if (!(arg)) { OC_LOG((logLevel), \ - TAG, PCF(#arg " is NULL")); return (retVal); } } + TAG, #arg " is NULL"); return (retVal); } } extern OCResource *headResource; -static OCPlatformInfo savedPlatformInfo = {}; -static OCDeviceInfo savedDeviceInfo = {}; +static OCPlatformInfo savedPlatformInfo = {0}; +static OCDeviceInfo savedDeviceInfo = {0}; //----------------------------------------------------------------------------- // Default resource entity handler function @@ -113,7 +121,7 @@ static OCStackResult ExtractFiltersFromQuery(char *query, char **filterOne, char { if (numKeyValuePairsParsed >= 2) { - OC_LOG(ERROR, TAG, PCF("More than 2 queries params in URI.")); + OC_LOG(ERROR, TAG, "More than 2 queries params in URI."); return OC_STACK_INVALID_QUERY; } @@ -163,6 +171,12 @@ static OCVirtualResources GetTypeOfVirtualURI(const char *uriInRequest) { return OC_RESOURCE_TYPES_URI; } +#ifdef ROUTING_GATEWAY + else if (0 == strcmp(uriInRequest, OC_RSRVD_GATEWAY_URI)) + { + return OC_GATEWAY_URI; + } +#endif #ifdef WITH_PRESENCE else if (strcmp(uriInRequest, OC_RSRVD_PRESENCE_URI) == 0) { @@ -187,7 +201,7 @@ static OCStackResult getQueryParamsForFiltering (OCVirtualResources uri, char *q if (uri == OC_PRESENCE) { //Nothing needs to be done, except for pass a OC_PRESENCE query through as OC_STACK_OK. - OC_LOG(INFO, TAG, PCF("OC_PRESENCE Request for virtual resource.")); + OC_LOG(INFO, TAG, "OC_PRESENCE Request for virtual resource."); return OC_STACK_OK; } #endif @@ -274,6 +288,27 @@ OCStackResult BuildVirtualResourceResponse(const OCResource *resourcePtr, return OC_STACK_OK; } +OCStackResult BuildVirtualCollectionResourceResponse(const OCResourceCollectionPayload *resourcePtr, + OCDiscoveryPayload *payload, OCDevAddr *devAddr) +{ + if (!resourcePtr || !payload) + { + return OC_STACK_INVALID_PARAM; + } + if (resourcePtr->tags && (resourcePtr->tags->bitmap & OC_SECURE)) + { + if (GetSecurePortInfo(devAddr, &resourcePtr->tags->port) != OC_STACK_OK) + { + OC_LOG(ERROR, TAG, "Failed setting secure port."); + } + } + if (resourcePtr->tags && !resourcePtr->tags->baseURI) + { + resourcePtr->tags->baseURI = OICStrdup(devAddr->addr); + } + OCDiscoveryCollectionPayloadAddResource(payload, resourcePtr->tags, resourcePtr->setLinks); + return OC_STACK_OK; +} uint8_t IsCollectionResource (OCResource *resource) { @@ -340,8 +375,7 @@ OCStackResult DetermineResourceHandling (const OCServerRequest *request, } else { - OCResource *resourcePtr = NULL; - resourcePtr = FindResourceByUri((const char*)request->resourceUrl); + OCResource *resourcePtr = FindResourceByUri((const char*)request->resourceUrl); *resource = resourcePtr; if (!resourcePtr) { @@ -446,7 +480,7 @@ static bool resourceMatchesRTFilter(OCResource *resource, char *resourceTypeFilt resourceTypePtr = resourceTypePtr->next; } - OC_LOG_V(INFO, TAG, PCF("%s does not contain rt=%s."), resource->uri, resourceTypeFilter); + OC_LOG_V(INFO, TAG, "%s does not contain rt=%s.", resource->uri, resourceTypeFilter); return false; } @@ -474,7 +508,7 @@ static bool resourceMatchesIFFilter(OCResource *resource, char *interfaceFilter) interfacePtr = interfacePtr->next; } - OC_LOG_V(INFO, TAG, PCF("%s does not contain if=%s."), resource->uri, interfaceFilter); + OC_LOG_V(INFO, TAG, "%s does not contain if=%s.", resource->uri, interfaceFilter); return false; } @@ -489,7 +523,7 @@ static bool includeThisResourceInResponse(OCResource *resource, { if (!resource) { - OC_LOG(ERROR, TAG, PCF("Invalid resource")); + OC_LOG(ERROR, TAG, "Invalid resource"); return false; } @@ -502,15 +536,15 @@ static bool includeThisResourceInResponse(OCResource *resource, if (!((interfaceFilter && *interfaceFilter ) || (resourceTypeFilter && *resourceTypeFilter))) { - OC_LOG_V(INFO, TAG, PCF("%s no query string for EXPLICIT_DISCOVERABLE \ - resource"), resource->uri); + OC_LOG_V(INFO, TAG, "%s no query string for EXPLICIT_DISCOVERABLE \ + resource", resource->uri); return false; } } else if ( !(resource->resourceProperties & OC_ACTIVE) || !(resource->resourceProperties & OC_DISCOVERABLE)) { - OC_LOG_V(INFO, TAG, PCF("%s not ACTIVE or DISCOVERABLE"), resource->uri); + OC_LOG_V(INFO, TAG, "%s not ACTIVE or DISCOVERABLE", resource->uri); return false; } @@ -522,7 +556,7 @@ static bool includeThisResourceInResponse(OCResource *resource, OCStackResult SendNonPersistantDiscoveryResponse(OCServerRequest *request, OCResource *resource, OCPayload *discoveryPayload, OCEntityHandlerResult ehResult) { - OCEntityHandlerResponse response = {}; + OCEntityHandlerResponse response = {0}; response.ehResult = ehResult; response.payload = discoveryPayload; @@ -533,6 +567,23 @@ OCStackResult SendNonPersistantDiscoveryResponse(OCServerRequest *request, OCRes return OCDoResponse(&response); } +#ifdef WITH_RD +static OCStackResult checkResourceExistsAtRD(const char *interfaceType, const char *resourceType, + OCResourceCollectionPayload **repPayload) +{ + if (OCRDCheckPublishedResource(interfaceType, resourceType, repPayload) == OC_STACK_OK) + { + return OC_STACK_OK; + } + else + { + OC_LOG_V(ERROR, TAG, "The resource type or interface type doe not exist \ + on the resource directory"); + } + return OC_STACK_ERROR; +} +#endif + static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource* resource) { if (!request || !resource) @@ -545,7 +596,7 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource bool bMulticast = false; // Was the discovery request a multicast request? OCPayload* payload = NULL; - OC_LOG(INFO, TAG, PCF("Entering HandleVirtualResource")); + OC_LOG(INFO, TAG, "Entering HandleVirtualResource"); OCVirtualResources virtualUriInRequest = GetTypeOfVirtualURI (request->resourceUrl); @@ -564,17 +615,33 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource if(payload) { + bool foundResourceAtRD = false; for(;resource && discoveryResult == OC_STACK_OK; resource = resource->next) { - if(includeThisResourceInResponse(resource, filterOne, filterTwo)) +#ifdef WITH_RD + if (strcmp(resource->uri, OC_RSRVD_RD_URI) == 0) + { + OCResourceCollectionPayload *repPayload; + discoveryResult = checkResourceExistsAtRD(filterOne, filterTwo, &repPayload); + if (discoveryResult != OC_STACK_OK) + { + break; + } + discoveryResult = BuildVirtualCollectionResourceResponse(repPayload, + (OCDiscoveryPayload*)payload, + &request->devAddr); + foundResourceAtRD = true; + } +#endif + if(!foundResourceAtRD && includeThisResourceInResponse(resource, filterOne, filterTwo)) { discoveryResult = BuildVirtualResourceResponse(resource, (OCDiscoveryPayload*)payload, &request->devAddr); } } - // Set discoveryResult appropriately if no 'valid' resources are available. - if (((OCDiscoveryPayload*)payload)->resources == NULL) + // Set discoveryResult appropriately if no 'valid' resources are available + if (((OCDiscoveryPayload*)payload)->resources == NULL && !foundResourceAtRD) { discoveryResult = OC_STACK_NO_RESOURCE; } @@ -591,16 +658,24 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource } else if (virtualUriInRequest == OC_DEVICE_URI) { - payload = (OCPayload*)OCDevicePayloadCreate(OC_RSRVD_DEVICE_URI, - OCGetServerInstanceID(), savedDeviceInfo.deviceName, - OC_SPEC_VERSION, OC_DATA_MODEL_VERSION); - if (!payload) + const OicUuid_t* deviceId = OCGetServerInstanceID(); + if (!deviceId) { - discoveryResult = OC_STACK_NO_MEMORY; + discoveryResult = OC_STACK_ERROR; } else { - discoveryResult = OC_STACK_OK; + payload = (OCPayload*) OCDevicePayloadCreate(OC_RSRVD_DEVICE_URI, + (const uint8_t*) &deviceId->id, savedDeviceInfo.deviceName, + OC_SPEC_VERSION, OC_DATA_MODEL_VERSION); + if (!payload) + { + discoveryResult = OC_STACK_NO_MEMORY; + } + else + { + discoveryResult = OC_STACK_OK; + } } } else if (virtualUriInRequest == OC_PLATFORM_URI) @@ -617,6 +692,15 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource discoveryResult = OC_STACK_OK; } } +#ifdef ROUTING_GATEWAY + else if (OC_GATEWAY_URI == virtualUriInRequest) + { + // Received request for a gateway + OC_LOG(INFO, TAG, "Request is for Gateway Virtual Request"); + discoveryResult = RMHandleGatewayRequest(request, resource); + + } +#endif /** * Step 2: Send the discovery response @@ -632,7 +716,7 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource * request is unicast, it should send an error(RESOURCE_NOT_FOUND - 404) response. */ - #ifdef WITH_PRESENCE +#ifdef WITH_PRESENCE if ((virtualUriInRequest == OC_PRESENCE) && (resource->resourceProperties & OC_ACTIVE)) { @@ -641,6 +725,10 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource } else #endif +#ifdef ROUTING_GATEWAY + // Gateway uses the RMHandleGatewayRequest to respond to the request. + if (OC_GATEWAY != virtualUriInRequest) +#endif { if(discoveryResult == OC_STACK_OK) { @@ -656,7 +744,7 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource else { // Ignoring the discovery request as per RFC 7252, Section #8.2 - OC_LOG_V(INFO, TAG, "Silently ignoring the request since device does not have \ + OC_LOG(INFO, TAG, "Silently ignoring the request since device does not have \ any useful data to send"); } } @@ -676,14 +764,15 @@ HandleDefaultDeviceEntityHandler (OCServerRequest *request) OCStackResult result = OC_STACK_OK; OCEntityHandlerResult ehResult = OC_EH_ERROR; - OCEntityHandlerRequest ehRequest = {}; + OCEntityHandlerRequest ehRequest = {0}; - OC_LOG(INFO, TAG, PCF("Entering HandleResourceWithDefaultDeviceEntityHandler")); + OC_LOG(INFO, TAG, "Entering HandleResourceWithDefaultDeviceEntityHandler"); result = FormOCEntityHandlerRequest(&ehRequest, (OCRequestHandle) request, request->method, &request->devAddr, (OCResourceHandle) NULL, request->query, + PAYLOAD_TYPE_REPRESENTATION, request->payload, request->payloadSize, request->numRcvdVendorSpecificHeaderOptions, @@ -697,7 +786,7 @@ HandleDefaultDeviceEntityHandler (OCServerRequest *request) (char*) request->resourceUrl, defaultDeviceHandlerCallbackParameter); if(ehResult == OC_EH_SLOW) { - OC_LOG(INFO, TAG, PCF("This is a slow resource")); + OC_LOG(INFO, TAG, "This is a slow resource"); request->slowFlag = 1; } else if(ehResult == OC_EH_ERROR) @@ -706,6 +795,7 @@ HandleDefaultDeviceEntityHandler (OCServerRequest *request) } result = EntityHandlerCodeToOCStackCode(ehResult); exit: + OCPayloadDestroy(ehRequest.payload); return result; } @@ -724,9 +814,21 @@ HandleResourceWithEntityHandler (OCServerRequest *request, OCEntityHandlerFlag ehFlag = OC_REQUEST_FLAG; ResourceObserver *resObs = NULL; - OCEntityHandlerRequest ehRequest = {}; + OCEntityHandlerRequest ehRequest = {0}; + + OC_LOG(INFO, TAG, "Entering HandleResourceWithEntityHandler"); + OCPayloadType type = PAYLOAD_TYPE_REPRESENTATION; + // check the security resource + if (request && request->resourceUrl && SRMIsSecurityResourceURI(request->resourceUrl)) + { + type = PAYLOAD_TYPE_SECURITY; + + } - OC_LOG(INFO, TAG, PCF("Entering HandleResourceWithEntityHandler")); + if (request && strcmp(request->resourceUrl, OC_RSRVD_RD_URI) == 0) + { + type = PAYLOAD_TYPE_RD; + } result = FormOCEntityHandlerRequest(&ehRequest, (OCRequestHandle)request, @@ -734,6 +836,7 @@ HandleResourceWithEntityHandler (OCServerRequest *request, &request->devAddr, (OCResourceHandle)resource, request->query, + type, request->payload, request->payloadSize, request->numRcvdVendorSpecificHeaderOptions, @@ -744,12 +847,30 @@ HandleResourceWithEntityHandler (OCServerRequest *request, if(ehRequest.obsInfo.action == OC_OBSERVE_NO_OPTION) { - OC_LOG(INFO, TAG, PCF("No observation requested")); + OC_LOG(INFO, TAG, "No observation requested"); ehFlag = OC_REQUEST_FLAG; } else if(ehRequest.obsInfo.action == OC_OBSERVE_REGISTER && !collectionResource) { - OC_LOG(INFO, TAG, PCF("Observation registration requested")); + OC_LOG(INFO, TAG, "Observation registration requested"); + + ResourceObserver *obs = GetObserverUsingToken (request->requestToken, + request->tokenLength); + + if (obs) + { + OC_LOG (INFO, TAG, "Observer with this token already present"); + OC_LOG (INFO, TAG, "Possibly re-transmitted CON OBS request"); + OC_LOG (INFO, TAG, "Not adding observer. Not responding to client"); + OC_LOG (INFO, TAG, "The first request for this token is already ACKED."); + + // server requests are usually free'd when the response is sent out + // for the request in ocserverrequest.c : HandleSingleResponse() + // Since we are making an early return and not responding, the server request + // needs to be deleted. + FindAndDeleteServerRequest (request); + return OC_STACK_OK; + } result = GenerateObserverId(&ehRequest.obsInfo.obsId); VERIFY_SUCCESS(result, OC_STACK_OK); @@ -757,12 +878,12 @@ HandleResourceWithEntityHandler (OCServerRequest *request, result = AddObserver ((const char*)(request->resourceUrl), (const char *)(request->query), ehRequest.obsInfo.obsId, request->requestToken, request->tokenLength, - resource, request->qos, + resource, request->qos, request->acceptFormat, &request->devAddr); if(result == OC_STACK_OK) { - OC_LOG(INFO, TAG, PCF("Added observer successfully")); + OC_LOG(INFO, TAG, "Added observer successfully"); request->observeResult = OC_STACK_OK; ehFlag = (OCEntityHandlerFlag)(OC_REQUEST_FLAG | OC_OBSERVE_FLAG); } @@ -773,7 +894,7 @@ HandleResourceWithEntityHandler (OCServerRequest *request, // The error in observeResult for the request will be used when responding to this // request by omitting the observation option/sequence number. request->observeResult = OC_STACK_ERROR; - OC_LOG(ERROR, TAG, PCF("Observer Addition failed")); + OC_LOG(ERROR, TAG, "Observer Addition failed"); ehFlag = OC_REQUEST_FLAG; } @@ -781,7 +902,7 @@ HandleResourceWithEntityHandler (OCServerRequest *request, else if(ehRequest.obsInfo.action == OC_OBSERVE_DEREGISTER && !collectionResource) { - OC_LOG(INFO, TAG, PCF("Deregistering observation requested")); + OC_LOG(INFO, TAG, "Deregistering observation requested"); resObs = GetObserverUsingToken (request->requestToken, request->tokenLength); @@ -799,14 +920,14 @@ HandleResourceWithEntityHandler (OCServerRequest *request, if(result == OC_STACK_OK) { - OC_LOG(INFO, TAG, PCF("Removed observer successfully")); + OC_LOG(INFO, TAG, "Removed observer successfully"); request->observeResult = OC_STACK_OK; } else { result = OC_STACK_OK; request->observeResult = OC_STACK_ERROR; - OC_LOG(ERROR, TAG, PCF("Observer Removal failed")); + OC_LOG(ERROR, TAG, "Observer Removal failed"); } } else @@ -818,7 +939,7 @@ HandleResourceWithEntityHandler (OCServerRequest *request, ehResult = resource->entityHandler(ehFlag, &ehRequest, resource->entityHandlerCallbackParam); if(ehResult == OC_EH_SLOW) { - OC_LOG(INFO, TAG, PCF("This is a slow resource")); + OC_LOG(INFO, TAG, "This is a slow resource"); request->slowFlag = 1; } else if(ehResult == OC_EH_ERROR) @@ -827,6 +948,7 @@ HandleResourceWithEntityHandler (OCServerRequest *request, } result = EntityHandlerCodeToOCStackCode(ehResult); exit: + OCPayloadDestroy(ehRequest.payload); return result; } @@ -840,7 +962,7 @@ HandleCollectionResourceDefaultEntityHandler (OCServerRequest *request, } OCStackResult result = OC_STACK_ERROR; - OCEntityHandlerRequest ehRequest = {}; + OCEntityHandlerRequest ehRequest = {0}; result = FormOCEntityHandlerRequest(&ehRequest, (OCRequestHandle)request, @@ -848,18 +970,20 @@ HandleCollectionResourceDefaultEntityHandler (OCServerRequest *request, &request->devAddr, (OCResourceHandle)resource, request->query, + PAYLOAD_TYPE_REPRESENTATION, request->payload, request->payloadSize, request->numRcvdVendorSpecificHeaderOptions, request->rcvdVendorSpecificHeaderOptions, (OCObserveAction)request->observationOption, (OCObservationId)0); - if(result != OC_STACK_OK) + if(result == OC_STACK_OK) { - return result; + result = DefaultCollectionEntityHandler (OC_REQUEST_FLAG, &ehRequest); } - return (DefaultCollectionEntityHandler (OC_REQUEST_FLAG, &ehRequest)); + OCPayloadDestroy(ehRequest.payload); + return result; } OCStackResult @@ -881,7 +1005,7 @@ ProcessRequest(ResourceHandling resHandling, OCResource *resource, OCServerReque } case OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER: { - OC_LOG(INFO, TAG, PCF("OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER")); + OC_LOG(INFO, TAG, "OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER"); return OC_STACK_ERROR; } case OC_RESOURCE_NOT_COLLECTION_WITH_ENTITYHANDLER: @@ -906,7 +1030,7 @@ ProcessRequest(ResourceHandling resHandling, OCResource *resource, OCServerReque } default: { - OC_LOG(INFO, TAG, PCF("Invalid Resource Determination")); + OC_LOG(INFO, TAG, "Invalid Resource Determination"); return OC_STACK_ERROR; } } @@ -915,7 +1039,7 @@ ProcessRequest(ResourceHandling resHandling, OCResource *resource, OCServerReque void DeletePlatformInfo() { - OC_LOG(INFO, TAG, PCF("Deleting platform info.")); + OC_LOG(INFO, TAG, "Deleting platform info."); OICFree(savedPlatformInfo.platformID); savedPlatformInfo.platformID = NULL; @@ -993,11 +1117,11 @@ OCStackResult SavePlatformInfo(OCPlatformInfo info) if (res != OC_STACK_OK) { - OC_LOG_V(ERROR, TAG, PCF("Failed to save platform info. errno(%d)"), res); + OC_LOG_V(ERROR, TAG, "Failed to save platform info. errno(%d)", res); } else { - OC_LOG(ERROR, TAG, PCF("Platform info saved.")); + OC_LOG(INFO, TAG, "Platform info saved."); } return res; @@ -1005,7 +1129,7 @@ OCStackResult SavePlatformInfo(OCPlatformInfo info) void DeleteDeviceInfo() { - OC_LOG(INFO, TAG, PCF("Deleting device info.")); + OC_LOG(INFO, TAG, "Deleting device info."); OICFree(savedDeviceInfo.deviceName); savedDeviceInfo.deviceName = NULL; @@ -1036,16 +1160,15 @@ OCStackResult SaveDeviceInfo(OCDeviceInfo info) if(OCGetServerInstanceID() == NULL) { - OC_LOG(INFO, TAG, PCF("Device ID generation failed")); + OC_LOG(INFO, TAG, "Device ID generation failed"); res = OC_STACK_ERROR; goto exit; } - OC_LOG(INFO, TAG, PCF("Device initialized successfully.")); + OC_LOG(INFO, TAG, "Device initialized successfully."); return OC_STACK_OK; - exit: - DeleteDeviceInfo(); - return res; - +exit: + DeleteDeviceInfo(); + return res; }