//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#include "rd_client.h"
+#include <stdlib.h>
+#include <string.h>
+
#include "oic_malloc.h"
#include "oic_string.h"
#include "octypes.h"
#ifdef RD_CLIENT
-OCStackResult OCRDDiscover(OCConnectivityType connectivityType, OCCallbackData *cbBiasFactor,
- OCQualityOfService qos)
+OCStackResult OCRDDiscover(OCDoHandle *handle, OCConnectivityType connectivityType,
+ OCCallbackData *cbBiasFactor, OCQualityOfService qos)
{
if (!cbBiasFactor || !cbBiasFactor->cb)
{
snprintf(queryUri, MAX_URI_LENGTH, "coap://%s%s", OC_MULTICAST_PREFIX, OC_RSRVD_RD_URI);
OIC_LOG_V(DEBUG, TAG, "Querying RD: %s\n", queryUri);
- return OCDoResource(NULL, OC_REST_DISCOVER, queryUri, NULL, NULL, connectivityType, qos,
+ return OCDoResource(handle, OC_REST_DISCOVER, queryUri, NULL, NULL, connectivityType, qos,
cbBiasFactor, NULL, 0);
}
-OCStackResult OCRDPublish(const char *host, OCConnectivityType connectivityType,
+OCStackResult OCRDPublish(OCDoHandle *handle, const char *host,
+ OCConnectivityType connectivityType,
OCResourceHandle *resourceHandles, uint8_t nHandles,
OCCallbackData *cbData, OCQualityOfService qos)
{
// Get Device ID from stack.
const unsigned char *id = (const unsigned char *) OCGetServerInstanceIDString();
- return OCRDPublishWithDeviceId(host, id, connectivityType, resourceHandles, nHandles,
- cbData, qos);
+ return OCRDPublishWithDeviceId(handle, host, id, connectivityType, resourceHandles,
+ nHandles, cbData, qos);
}
-OCStackResult OCRDPublishWithDeviceId(const char *host, const unsigned char *id,
+OCStackResult OCRDPublishWithDeviceId(OCDoHandle *handle, const char *host,
+ const unsigned char *id,
OCConnectivityType connectivityType,
OCResourceHandle *resourceHandles, uint8_t nHandles,
OCCallbackData *cbData, OCQualityOfService qos)
OIC_LOG_V(DEBUG, TAG, "Publish Resource to RD with device id [%s]", id);
OCResourceHandle *pubResHandle = resourceHandles;
+ OCResourceHandle defaultResHandles[OIC_RD_DEFAULT_RESOURCE] = { 0 };
uint8_t nPubResHandles = nHandles;
// if resource handles is null, "/oic/p" and "/oic/d" resource will be published to RD.
- if (!pubResHandle && !nPubResHandles)
+ if (!pubResHandle)
{
- OCResourceHandle defaultResHandles[OIC_RD_DEFAULT_RESOURCE] = { 0 };
-
// get "/oic/d" and "/oic/p" resource handle from stack.
defaultResHandles[0] = OCGetResourceHandleAtUri(OC_RSRVD_DEVICE_URI);
defaultResHandles[1] = OCGetResourceHandleAtUri(OC_RSRVD_PLATFORM_URI);
return OC_STACK_NO_MEMORY;
}
- const char *deviceId = OCGetServerInstanceIDString();
- if (deviceId)
+ OCRepPayloadSetPropString(rdPayload, OC_RSRVD_DEVICE_ID, (const char *) id);
+
+ char *deviceName = NULL;
+ OCGetPropertyValue(PAYLOAD_TYPE_DEVICE, OC_RSRVD_DEVICE_NAME, (void **) &deviceName);
+ if (deviceName)
{
- OCRepPayloadSetPropString(rdPayload, OC_RSRVD_DEVICE_ID, deviceId);
+ OCRepPayloadSetPropString(rdPayload, OC_RSRVD_DEVICE_NAME, deviceName);
+ OICFree(deviceName);
}
+
+ char *platformModelName = NULL;
+ OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_MODEL_NUM, (void **) &platformModelName);
+ if (platformModelName)
+ {
+ OCRepPayloadSetPropString(rdPayload, OC_DATA_MODEL_NUMBER, platformModelName);
+ OICFree(platformModelName);
+ }
+
OCRepPayloadSetPropInt(rdPayload, OC_RSRVD_DEVICE_TTL, OIC_RD_PUBLISH_TTL);
- const OCRepPayload *linkArr[nPubResHandles];
+ OCRepPayload **linkArr = OICCalloc(nPubResHandles, sizeof(OCRepPayload *));
+ if (!linkArr)
+ {
+ OCRepPayloadDestroy(rdPayload);
+ return OC_STACK_NO_MEMORY;
+ }
size_t dimensions[MAX_REP_ARRAY_DEPTH] = {nPubResHandles, 0, 0};
for (uint8_t j = 0; j < nPubResHandles; j++)
OIC_LOG_V(DEBUG, TAG, "value: %s", value);
rt[i] = OICStrdup(value);
}
- OCRepPayloadSetStringArray(link, OC_RSRVD_RESOURCE_TYPE, (const char **)rt, rtDim);
+ OCRepPayloadSetStringArrayAsOwner(link, OC_RSRVD_RESOURCE_TYPE, rt, rtDim);
}
numElement = 0;
OIC_LOG_V(DEBUG, TAG, "value: %s", value);
itf[i] = OICStrdup(value);
}
- OCRepPayloadSetStringArray(link, OC_RSRVD_INTERFACE, (const char **)itf, ifDim);
+ OCRepPayloadSetStringArrayAsOwner(link, OC_RSRVD_INTERFACE, itf, ifDim);
}
- uint8_t ins = 0;
- if (OCGetResourceIns(handle, &ins))
+ int64_t ins = 0;
+ if (OC_STACK_OK == OCGetResourceIns(handle, &ins))
{
OCRepPayloadSetPropInt(link, OC_RSRVD_INS, ins);
}
size_t mtDim[MAX_REP_ARRAY_DEPTH] = {1, 0, 0};
char **mediaType = (char **)OICMalloc(sizeof(char *) * 1);
+ if (!mediaType)
+ {
+ OIC_LOG(ERROR, TAG, "Memory allocation failed!");
+
+ for(uint8_t i = 0; i < nPubResHandles; i++)
+ {
+ OCRepPayloadDestroy(linkArr[i]);
+ }
+ OICFree(linkArr);
+ OCRepPayloadDestroy(rdPayload);
+ return OC_STACK_NO_MEMORY;
+ }
+
mediaType[0] = OICStrdup(DEFAULT_MESSAGE_TYPE);
- OCRepPayloadSetStringArray(link, OC_RSRVD_MEDIA_TYPE, (const char **)mediaType,
- mtDim);
+ OCRepPayloadSetStringArrayAsOwner(link, OC_RSRVD_MEDIA_TYPE, mediaType, mtDim);
OCResourceProperty p = OCGetResourceProperties(handle);
p = (OCResourceProperty) ((p & OC_DISCOVERABLE) | (p & OC_OBSERVABLE));
}
}
- OCRepPayloadSetPropObjectArray(rdPayload, OC_RSRVD_LINKS, linkArr, dimensions);
+ OCRepPayloadSetPropObjectArray(rdPayload, OC_RSRVD_LINKS, (const OCRepPayload **)linkArr, dimensions);
OIC_LOG_PAYLOAD(DEBUG, (OCPayload *) rdPayload);
- if (OC_STACK_OK == OCStopMulticastServer())
- {
- OIC_LOG_V(DEBUG, TAG, "Stopped receiving the multicast traffic.");
- }
- else
+ for (uint8_t i = 0; i < nPubResHandles; i++)
{
- OIC_LOG_V(DEBUG, TAG, "Failed stopping the multicast traffic.");
+ OCRepPayloadDestroy(linkArr[i]);
}
- return OCDoResource(NULL, OC_REST_POST, targetUri, NULL, (OCPayload *)rdPayload,
+ OICFree(linkArr);
+
+ return OCDoResource(handle, OC_REST_POST, targetUri, NULL, (OCPayload *)rdPayload,
connectivityType, qos, cbData, NULL, 0);
}
-OCStackResult OCRDDelete(const char *host, OCConnectivityType connectivityType,
+OCStackResult OCRDDelete(OCDoHandle *handle, const char *host,
+ OCConnectivityType connectivityType,
OCResourceHandle *resourceHandles, uint8_t nHandles,
OCCallbackData *cbData, OCQualityOfService qos)
{
const unsigned char *id = (const unsigned char *) OCGetServerInstanceIDString();
- return OCRDDeleteWithDeviceId(host, id, connectivityType, resourceHandles, nHandles,
- cbData, qos);
+ return OCRDDeleteWithDeviceId(handle, host, id, connectivityType, resourceHandles,
+ nHandles, cbData, qos);
}
-OCStackResult OCRDDeleteWithDeviceId(const char *host, const unsigned char *id,
+OCStackResult OCRDDeleteWithDeviceId(OCDoHandle *handle, const char *host,
+ const unsigned char *id,
OCConnectivityType connectivityType,
OCResourceHandle *resourceHandles, uint8_t nHandles,
OCCallbackData *cbData, OCQualityOfService qos)
char targetUri[MAX_URI_LENGTH] = { 0 };
snprintf(targetUri, MAX_URI_LENGTH, "%s%s?di=%s", host, OC_RSRVD_RD_URI, id);
+ uint8_t len = 0;
char queryParam[MAX_URI_LENGTH] = { 0 };
for (uint8_t j = 0; j < nHandles; j++)
{
OCResource *handle = (OCResource *) resourceHandles[j];
- uint8_t ins = 0;
+ int64_t ins = 0;
OCGetResourceIns(handle, &ins);
- snprintf(queryParam, MAX_URI_LENGTH, "&ins=%u", ins);
+ len += snprintf(queryParam + len, MAX_URI_LENGTH, "&ins=%" PRId64, ins);
+ OIC_LOG_V(DEBUG, TAG, "queryParam [%s]", queryParam);
}
OICStrcatPartial(targetUri, sizeof(targetUri), queryParam, strlen(queryParam));
OIC_LOG_V(DEBUG, TAG, "Target URI: %s", targetUri);
- return OCDoResource(NULL, OC_REST_DELETE, targetUri, NULL, NULL, connectivityType,
+ return OCDoResource(handle, OC_REST_DELETE, targetUri, NULL, NULL, connectivityType,
qos, cbData, NULL, 0);
}