#include "cacommon.h"
#include "cainterface.h"
#include "ocpayload.h"
-#include "oickeepalive.h"
+#include "oickeepaliveinternal.h"
#include "platform_features.h"
#include "payload_logging.h"
#ifdef ROUTING_GATEWAY
OCStackResult BuildResponseRepresentation(const OCResource *resourcePtr,
OCRepPayload** payload, OCDevAddr *devAddr)
{
- OCRepPayload *tempPayload = OCRepPayloadCreate();
-
if (!resourcePtr)
{
- OCRepPayloadDestroy(tempPayload);
return OC_STACK_INVALID_PARAM;
}
+ OCRepPayload *tempPayload = OCRepPayloadCreate();
if(!tempPayload)
{
return OC_STACK_NO_MEMORY;
{
size_t rtDim[MAX_REP_ARRAY_DEPTH] = {numElement, 0, 0};
char **rt = (char **)OICMalloc(sizeof(char *) * numElement);
+ if (!rt)
+ {
+ OIC_LOG(ERROR, TAG, "Resource type allocation failed.");
+ OCRepPayloadDestroy(tempPayload);
+ return OC_STACK_NO_MEMORY;
+ }
for (uint8_t i = 0; i < numElement; ++i)
{
const char *value = OCGetResourceTypeName((OCResource *)resourcePtr, i);
{
size_t ifDim[MAX_REP_ARRAY_DEPTH] = {numElement, 0, 0};
char **itf = (char **)OICMalloc(sizeof(char *) * numElement);
+ if (!itf)
+ {
+ OIC_LOG(ERROR, TAG, "Resource interface allocation failed.");
+ OCRepPayloadDestroy(tempPayload);
+ return OC_STACK_NO_MEMORY;
+ }
for (uint8_t i = 0; i < numElement; ++i)
{
const char *value = OCGetResourceInterfaceName((OCResource *)resourcePtr, i);
case OC_EH_FORBIDDEN:
result = OC_STACK_FORBIDDEN_REQ;
break;
- case OC_EH_INTERNAL_SERVER_ERROR:
- result = OC_STACK_INTERNAL_SERVER_ERROR;
- break;
case OC_EH_RESOURCE_CREATED:
result = OC_STACK_RESOURCE_CREATED;
break;
case OC_EH_RESOURCE_NOT_FOUND:
result = OC_STACK_NO_RESOURCE;
break;
+ case OC_EH_INTERNAL_SERVER_ERROR:
+ result = OC_STACK_INTERNAL_SERVER_ERROR;
+ break;
+ case OC_EH_NOT_IMPLEMENTED:
+ result = OC_STACK_NOT_IMPLEMENTED;
+ break;
+ case OC_EH_BAD_GATEWAY:
+ result = OC_STACK_BAD_GATEWAY;
+ break;
+ case OC_EH_SERVICE_UNAVAILABLE:
+ result = OC_STACK_SERVICE_UNAVAILABLE;
+ break;
+ case OC_EH_RETRANSMIT_TIMEOUT:
+ result = OC_STACK_GATEWAY_TIMEOUT;
+ break;
+ case OC_EH_PROXY_NOT_SUPPORTED:
+ result = OC_STACK_PROXY_NOT_SUPPORTED;
+ break;
default:
result = OC_STACK_ERROR;
}
return false;
}
- // Null or empty is analogous to no filter.
- if (resourceTypeFilter == NULL || *resourceTypeFilter == 0)
+ // Null is analogous to no filter.
+ if (NULL == resourceTypeFilter)
{
return true;
}
+ // Empty resourceType filter is analogous to error query
+ if (0 == strlen(resourceTypeFilter))
+ {
+ return false;
+ }
+
for (OCResourceType *rtPtr = resource->rsrcType; rtPtr; rtPtr = rtPtr->next)
{
if (0 == strcmp(rtPtr->resourcetypename, resourceTypeFilter))
return false;
}
- // Null or empty is analogous to no filter.
- if (interfaceFilter == NULL || *interfaceFilter == 0)
+ // Null is analogous to no filter.
+ if (NULL == interfaceFilter)
{
return true;
}
+ // Empty interface filter is analogous to error query
+ if (0 == strlen(interfaceFilter))
+ {
+ return false;
+ }
+
for (OCResourceInterface *ifPtr = resource->rsrcInterface; ifPtr; ifPtr = ifPtr->next)
{
if (0 == strcmp(ifPtr->name, interfaceFilter) ||
{
if (*payload)
{
- OIC_LOG_V(DEBUG, TAG, "Payload is already allocated");
+ OIC_LOG(DEBUG, TAG, "Payload is already allocated");
return OC_STACK_OK;
}
*/
static OCStackResult addDiscoveryBaselineCommonProperties(OCDiscoveryPayload *discPayload)
{
- discPayload->uri = OICStrdup(OC_RSRVD_WELL_KNOWN_URI);
- VERIFY_PARAM_NON_NULL(TAG, discPayload->uri, "Failed adding href to discovery payload.");
+ if (!discPayload)
+ {
+ OIC_LOG(ERROR, TAG, "Payload is not allocated");
+ return OC_STACK_ERROR;
+ }
- OCGetPropertyValue(PAYLOAD_TYPE_DEVICE, "deviceName", (void **)&discPayload->name);
+ OCGetPropertyValue(PAYLOAD_TYPE_DEVICE, OC_RSRVD_DEVICE_NAME, (void **)&discPayload->name);
discPayload->type = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
VERIFY_PARAM_NON_NULL(TAG, discPayload->type, "Failed adding rt to discovery payload.");
return OC_STACK_NO_MEMORY;
}
+static bool isUnicast(OCServerRequest *request)
+{
+ bool isMulticast = request->devAddr.flags & OC_MULTICAST;
+ return (isMulticast == false &&
+ (request->devAddr.adapter != OC_ADAPTER_RFCOMM_BTEDR) &&
+ (request->devAddr.adapter != OC_ADAPTER_GATT_BTLE));
+}
+
static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource* resource)
{
if (!request || !resource)
OCPayload* payload = NULL;
char *interfaceQuery = NULL;
char *resourceTypeQuery = NULL;
- char *dataModelVersions = NULL;
OIC_LOG(INFO, TAG, "Entering HandleVirtualResource");
{
// Received request for a keepalive
OIC_LOG(INFO, TAG, "Request is for KeepAlive Request");
- return HandleKeepAliveRequest(request, resource);
+ return OCHandleKeepAliveRequest(request, resource);
}
#endif
discoveryResult = getQueryParamsForFiltering(virtualUriInRequest, request->query,
&interfaceQuery, &resourceTypeQuery);
VERIFY_SUCCESS(discoveryResult);
+
if (!interfaceQuery && !resourceTypeQuery)
{
// If no query is sent, default interface is used i.e. oic.if.ll.
interfaceQuery = OICStrdup(OC_RSRVD_INTERFACE_LL);
}
- bool baselineQuery = false;
- if (interfaceQuery && 0 == strcmp(interfaceQuery, OC_RSRVD_INTERFACE_DEFAULT))
- {
- baselineQuery = true;
- }
-
discoveryResult = discoveryPayloadCreateAndAddDeviceId(&payload);
VERIFY_PARAM_NON_NULL(TAG, payload, "Failed creating Discovery Payload.");
VERIFY_SUCCESS(discoveryResult);
OCDiscoveryPayload *discPayload = (OCDiscoveryPayload *)payload;
- if (baselineQuery)
+ if (interfaceQuery && 0 == strcmp(interfaceQuery, OC_RSRVD_INTERFACE_DEFAULT))
{
discoveryResult = addDiscoveryBaselineCommonProperties(discPayload);
VERIFY_SUCCESS(discoveryResult);
#endif
for (; resource && discoveryResult == OC_STACK_OK; resource = resource->next)
{
- discoveryResult = OC_STACK_NO_RESOURCE;
-#ifdef RD_SERVER
- discoveryResult = findResourceAtRD(resource, interfaceQuery, resourceTypeQuery,
- discPayload);
-#endif
- if (OC_STACK_NO_RESOURCE == discoveryResult)
+ // This case will handle when no resource type and it is oic.if.ll.
+ // Do not assume check if the query is ll
+ if (!resourceTypeQuery &&
+ (interfaceQuery && 0 == strcmp(interfaceQuery, OC_RSRVD_INTERFACE_LL)))
{
- // This case will handle when no resource type and it is oic.if.ll.
- if (!resourceTypeQuery && !baselineQuery && (resource->resourceProperties & prop))
+ // Only include discoverable type
+ if (resource->resourceProperties & prop)
{
discoveryResult = BuildVirtualResourceResponse(resource, discPayload, &request->devAddr);
}
- else if (includeThisResourceInResponse(resource, interfaceQuery, resourceTypeQuery))
- {
- discoveryResult = BuildVirtualResourceResponse(resource, discPayload, &request->devAddr);
- }
- else
- {
- discoveryResult = OC_STACK_OK;
- }
+ }
+ else if (includeThisResourceInResponse(resource, interfaceQuery, resourceTypeQuery))
+ {
+ discoveryResult = BuildVirtualResourceResponse(resource, discPayload, &request->devAddr);
+ }
+ else
+ {
+ discoveryResult = OC_STACK_OK;
}
}
if (discPayload->resources == NULL)
OIC_LOG_PAYLOAD(DEBUG, payload);
if(discoveryResult == OC_STACK_OK)
{
+
SendNonPersistantDiscoveryResponse(request, resource, payload, OC_EH_OK);
}
- else if(((request->devAddr.flags & OC_MULTICAST) == false) &&
- (request->devAddr.adapter != OC_ADAPTER_RFCOMM_BTEDR) &&
- (request->devAddr.adapter != OC_ADAPTER_GATT_BTLE))
+ else // Error handling
{
- OIC_LOG_V(ERROR, TAG, "Sending a (%d) error to (%d) discovery request",
- discoveryResult, virtualUriInRequest);
- SendNonPersistantDiscoveryResponse(request, resource, NULL,
- (discoveryResult == OC_STACK_NO_RESOURCE) ?
+ if (isUnicast(request))
+ {
+ OIC_LOG_V(ERROR, TAG, "Sending a (%d) error to (%d) discovery request",
+ discoveryResult, virtualUriInRequest);
+ SendNonPersistantDiscoveryResponse(request, resource, NULL,
+ (discoveryResult == OC_STACK_NO_RESOURCE) ?
OC_EH_RESOURCE_NOT_FOUND : OC_EH_ERROR);
- }
- else
- {
- // Ignoring the discovery request as per RFC 7252, Section #8.2
- OIC_LOG(INFO, TAG, "Silently ignoring the request since no useful data to send.");
- // the request should be removed.
- // since it never remove and causes a big memory waste.
- FindAndDeleteServerRequest(request);
+ }
+ else // Multicast
+ {
+ // Ignoring the discovery request as per RFC 7252, Section #8.2
+ OIC_LOG(INFO, TAG, "Silently ignoring the request since no useful data to send.");
+ // the request should be removed.
+ // since it never remove and causes a big memory waste.
+ FindAndDeleteServerRequest(request);
+ }
+ discoveryResult = OC_STACK_CONTINUE;
}
}
OICFree(resourceTypeQuery);
}
OCPayloadDestroy(payload);
- if (dataModelVersions)
- {
- OICFree(dataModelVersions);
- }
+
+ // To ignore the message, OC_STACK_CONTINUE is sent
return discoveryResult;
}
{
// Stack does not contain this observation request
// Either token is incorrect or observation list is corrupted
- result = OC_STACK_ERROR;
+ result = OC_STACK_NO_RESOURCE;
goto exit;
}
ehRequest.obsInfo.obsId = resObs->observeId;
{
dataModelVersion = OCCreateOCStringLL(OC_DATA_MODEL_VERSION);
VERIFY_SUCCESS(OCSetPropertyValue(PAYLOAD_TYPE_DEVICE, OC_RSRVD_DATA_MODEL_VERSION, dataModelVersion));
+#ifdef __TIZENRT__
OCFreeOCStringLL(dataModelVersion);
+#endif
}
OIC_LOG(INFO, TAG, "Device parameter initialized successfully.");
return OC_STACK_OK;
OCStackResult OCSetAttribute(OCResource* resource, const char* attribute, const void* value)
{
// See if the attribute already exists in the list.
- OCAttribute *resAttrib = NULL;
+ OCAttribute *resAttrib;
for (resAttrib = resource->rsrcAttributes; resAttrib; resAttrib = resAttrib->next)
{
if (0 == strcmp(attribute, resAttrib->attrName))