RD server response for the RD Client Publish.
Include change to adapt recent changes in cbor payloadType handling.
Change-Id: I55e9cacaa1a81c87c8bcc0e80c3b57f6fd98f8fc
Signed-off-by: Habib Virji <habib.virji@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2385
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
break;
#ifdef WITH_RD
case PAYLOAD_TYPE_RD:
- OCRDPayloadLog(level, tag, (OCRDPayload*)payload);
+ OCRDPayloadLog(level, PL_TAG, (OCRDPayload*)payload);
break;
#endif
default:
type = PAYLOAD_TYPE_SECURITY;
}
+#ifdef WITH_RD
+
+ if (request && request->resourceUrl && strcmp(request->resourceUrl, OC_RSRVD_RD_URI) == 0)
+ {
+ type = PAYLOAD_TYPE_RD;
+ }
+#endif
result = FormOCEntityHandlerRequest(&ehRequest,
(OCRequestHandle)request,
request->method,
{
type = PAYLOAD_TYPE_PLATFORM;
}
+#ifdef WITH_RD
+ else if (strcmp(cbNode->requestUri, OC_RSRVD_RD_URI) == 0)
+ {
+ type = PAYLOAD_TYPE_RD;
+ }
+#endif
else
{
OC_LOG_V(ERROR, TAG, "Unknown Payload type in Discovery: %d %s",
cbNode->method == OC_REST_OBSERVE_ALL ||
cbNode->method == OC_REST_DELETE)
{
- OC_LOG_V(INFO, TAG, "Assuming PAYLOAD_TYPE_REPRESENTATION: %d %s",
- cbNode->method, cbNode->requestUri);
- type = PAYLOAD_TYPE_REPRESENTATION;
+#ifdef WITH_RD
+ char targetUri[MAX_URI_LENGTH];
+ snprintf(targetUri, MAX_URI_LENGTH, "%s?rt=%s",
+ OC_RSRVD_RD_URI, OC_RSRVD_RESOURCE_TYPE_RDPUBLISH);
+ if (strcmp(targetUri, cbNode->requestUri) == 0)
+ {
+ type = PAYLOAD_TYPE_RD;
+ }
+#endif
+ if (type == PAYLOAD_TYPE_INVALID)
+ {
+ OC_LOG_V(INFO, TAG, "Assuming PAYLOAD_TYPE_REPRESENTATION: %d %s",
+ cbNode->method, cbNode->requestUri);
+ type = PAYLOAD_TYPE_REPRESENTATION;
+ }
}
else
{
return OC_STACK_ERROR;
}
}
-
#include <cbor.h>
#include "rd_types.h"
+#include "logger.h"
#ifdef __cplusplus
extern "C" {
* failed in creating CBOR.
*/
OCStackResult OCRDPayloadToCbor(const OCRDPayload *rdPayload,
- uint8_t **outPayload, size_t *size);
+ uint8_t *outPayload, size_t *size);
/**
* Converts CBOR to OCRDPayload.
*/
typedef enum
{
- /** Value pf the RD discovery payload. */
+ /** Value of the RD discovery payload. */
RD_PAYLOAD_TYPE_DISCOVERY,
/** Value of the RD publish payload. */
- RD_PAYLOAD_TYPE_PUBLISH
+ RD_PAYLOAD_TYPE_PUBLISH,
+ /** Value of the RD response in the payload. */
+ RD_PAYLOAD_TYPE_RESPONSE
} OCRDPayloadType;
/**
#include "octypes.h"
#include "ocstack.h"
-#include "logger.h"
#define TAG PCF("OCRDPayload")
-#define CBOR_ROOT_ARRAY_LENGTH 2
+#define CBOR_ROOT_ARRAY_LENGTH 1
#define CBOR_LINK_ARRAY_LENGTH 3
static void linksPayloadDestroy(OCRDLinksPayload *linkPayload)
}
}
-OCStackResult OCRDPayloadToCbor(const OCRDPayload *rdPayload, uint8_t **outPayload, size_t *size)
+OCStackResult OCRDPayloadToCbor(const OCRDPayload *rdPayload, uint8_t *outPayload, size_t *size)
{
if (!outPayload || !size)
{
return OC_STACK_ERROR;
}
- *outPayload = (uint8_t *)OICCalloc(1, MAX_REQUEST_LENGTH);
- if (!*outPayload)
- {
- goto no_memory;
- }
-
- *size = MAX_REQUEST_LENGTH;
-
- OCRDPayloadLog(DEBUG, TAG, rdPayload);
-
CborEncoder encoder;
int flags = 0;
- cbor_encoder_init(&encoder, *outPayload, *size, flags);
+ cbor_encoder_init(&encoder, outPayload, *size, flags);
CborEncoder rootArray;
CborError cborEncoderResult;
goto exit;
}
- cborEncoderResult = cbor_encode_uint(&rootArray, rdPayload->base.type);
- if (CborNoError != cborEncoderResult)
- {
- OC_LOG_V(ERROR, TAG, "Failed setting rdPayload->base.type.");
- goto exit;
- }
-
CborEncoder map;
cborEncoderResult = cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength);
if (CborNoError != cborEncoderResult)
goto exit;
}
- *size = encoder.ptr - *outPayload;
- uint8_t *tempPayload = (uint8_t *)OICRealloc(*outPayload, *size);
- if (!tempPayload)
- {
- goto no_memory;
- }
-
- *outPayload = tempPayload;
+ *size = encoder.ptr - outPayload;
return OC_STACK_OK;
-no_memory:
- OC_LOG_V(ERROR, TAG, "Memory allocation failed.");
- OICFree(*outPayload);
- return OC_STACK_NO_MEMORY;
-
exit:
- OICFree(*outPayload);
+ OICFree(outPayload);
return OC_STACK_ERROR;
}
goto no_memory;
}
}
- else
+ else if (RD_PAYLOAD_TYPE_PUBLISH == payloadType)
{ // TTL
int ttl = 0;
cborFindResult = cbor_value_map_find_value(rdCBORPayload, OC_RSRVD_TTL, &curVal);
OCRDStorePublishedResources(payload->rdPublish);
}
+ OCRDPayload *rdPayload = OCRDPayloadCreate(RD_PAYLOAD_TYPE_DISCOVERY);
+ if (!rdPayload)
+ {
+ return OC_STACK_NO_MEMORY;
+ }
+
+ OCRDPayloadLog(DEBUG, TAG, rdPayload);
+ rdPayload->payloadType = RD_PAYLOAD_TYPE_RESPONSE;
+
+ if (sendResponse(ehRequest, rdPayload) != OC_STACK_OK)
+ {
+ OC_LOG(ERROR, TAG, "Sending response failed.");
+ ehResult = OC_EH_ERROR;
+ }
+
return ehResult;
}