#ifndef OCPAYLOAD_H_
#define OCPAYLOAD_H_
+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS
+#endif
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+#endif
+
#include <stdbool.h>
#include <inttypes.h>
-#include "logger.h"
#include "octypes.h"
+#if defined(__WITH_TLS__) || defined(__WITH_DTLS__)
+#include "securevirtualresourcetypes.h"
+#endif
+
#ifdef __cplusplus
extern "C"
{
#endif
-typedef struct rsrc_t OCResource;
-
-#ifdef TB_LOG
- #define OC_LOG_PAYLOAD(level, tag, payload) OCPayloadLog((level),(tag),(payload))
- #define UUID_SIZE (16)
- #define UUID_LENGTH (37)
-const char *convertTriggerEnumToString(OCPresenceTrigger trigger);
-OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr);
-
-static inline void OCPayloadLogRep(LogLevel level, const char* tag, OCRepPayload* payload)
-{
- OC_LOG(level, tag, PCF("Payload Type: Representation"));
- OCRepPayload* rep = payload;
- int i = 1;
- while(rep)
- {
- OC_LOG_V(level, tag, "\tResource #%d", i);
- OC_LOG_V(level, tag, "\tURL:%s", rep->uri);
- OC_LOG(level, tag, PCF("\tResource Types:"));
- OCStringLL* strll = rep->types;
- while(strll)
- {
- OC_LOG_V(level, tag, "\t\t%s", strll->value);
- strll = strll->next;
- }
- OC_LOG(level, tag, PCF("\tInterfaces:"));
- strll = rep->interfaces;
- while(strll)
- {
- OC_LOG_V(level, tag, "\t\t%s", strll->value);
- strll = strll->next;
- }
-
- // TODO Finish Logging: Values
- OCRepPayloadValue* val = rep->values;
-
- OC_LOG(level, tag, PCF("\tValues:"));
-
- while(val)
- {
- switch(val->type)
- {
- case OCREP_PROP_NULL:
- OC_LOG_V(level, tag, "\t\t%s: NULL", val->name);
- break;
- case OCREP_PROP_INT:
- OC_LOG_V(level, tag, "\t\t%s(int):%lld", val->name, val->i);
- break;
- case OCREP_PROP_DOUBLE:
- OC_LOG_V(level, tag, "\t\t%s(double):%f", val->name, val->d);
- break;
- case OCREP_PROP_BOOL:
- OC_LOG_V(level, tag, "\t\t%s(bool):%s", val->name, val->b ? "true" : "false");
- break;
- case OCREP_PROP_STRING:
- OC_LOG_V(level, tag, "\t\t%s(string):%s", val->name, val->str);
- break;
- case OCREP_PROP_OBJECT:
- // Note: Only prints the URI (if available), to print further, you'll
- // need to dig into the object better!
- OC_LOG_V(level, tag, "\t\t%s(OCRep):%s", val->name, val->obj->uri);
- break;
- case OCREP_PROP_ARRAY:
- switch(val->arr.type)
- {
- case OCREP_PROP_INT:
- OC_LOG_V(level, tag, "\t\t%s(int array):%lld x %lld x %lld",
- val->name,
- val->arr.dimensions[0], val->arr.dimensions[1],
- val->arr.dimensions[2]);
- break;
- case OCREP_PROP_DOUBLE:
- OC_LOG_V(level, tag, "\t\t%s(double array):%lld x %lld x %lld",
- val->name,
- val->arr.dimensions[0], val->arr.dimensions[1],
- val->arr.dimensions[2]);
- break;
- case OCREP_PROP_BOOL:
- OC_LOG_V(level, tag, "\t\t%s(bool array):%lld x %lld x %lld",
- val->name,
- val->arr.dimensions[0], val->arr.dimensions[1],
- val->arr.dimensions[2]);
- break;
- case OCREP_PROP_STRING:
- OC_LOG_V(level, tag, "\t\t%s(string array):%lld x %lld x %lld",
- val->name,
- val->arr.dimensions[0], val->arr.dimensions[1],
- val->arr.dimensions[2]);
- break;
- case OCREP_PROP_OBJECT:
- OC_LOG_V(level, tag, "\t\t%s(OCRep array):%lld x %lld x %lld",
- val->name,
- val->arr.dimensions[0], val->arr.dimensions[1],
- val->arr.dimensions[2]);
- break;
- default:
- OC_LOG_V(ERROR, tag, "\t\t%s <-- Unknown/unsupported array type!",
- val->name);
- break;
- }
- break;
- default:
- OC_LOG_V(ERROR, tag, "\t\t%s <-- Unknown type!", val->name);
- break;
- }
- val = val -> next;
- }
-
- ++i;
- rep = rep->next;
- }
-
-}
-
-static inline void OCPayloadLogDiscovery(LogLevel level, const char* tag,
- OCDiscoveryPayload* payload)
-{
- OC_LOG(level, tag, PCF("Payload Type: Discovery"));
- int i = 1;
-
- if(!payload->resources)
- {
- OC_LOG(level, tag, PCF("\tNO Resources"));
- return;
- }
-
- OCResourcePayload* res = payload->resources;
-
- while(res)
- {
- OC_LOG_V(level, tag, "\tResource #%d", i);
- OC_LOG_V(level, tag, "\tURI:%s", res->uri);
- OC_LOG(level, tag, PCF("\tSID:"));
- OC_LOG_BUFFER(level, tag, res->sid, UUID_SIZE);
- OC_LOG(level, tag, PCF("\tResource Types:"));
- OCStringLL* strll = res->types;
- while(strll)
- {
- OC_LOG_V(level, tag, "\t\t%s", strll->value);
- strll = strll->next;
- }
- OC_LOG(level, tag, PCF("\tInterfaces:"));
- strll = res->interfaces;
- while(strll)
- {
- OC_LOG_V(level, tag, "\t\t%s", strll->value);
- strll = strll->next;
- }
-
- OC_LOG_V(level, tag, "\tBitmap: %u", res->bitmap);
- OC_LOG_V(level, tag, "\tSecure?: %s", res->secure ? "true" : "false");
- OC_LOG_V(level, tag, "\tPort: %u", res->port);
- OC_LOG(level, tag, PCF(""));
- res = res->next;
- ++i;
- }
-}
-
-static inline void OCPayloadLogDevice(LogLevel level, const char* tag, OCDevicePayload* payload)
-{
- OC_LOG(level, tag, PCF("Payload Type: Device"));
- OC_LOG_V(level, tag, "\tURI:%s", payload->uri);
- OC_LOG(level, tag, PCF("\tSID:"));
- OC_LOG_BUFFER(level, tag, payload->sid, UUID_SIZE);
- OC_LOG_V(level, tag, "\tDevice Name:%s", payload->deviceName);
- OC_LOG_V(level, tag, "\tSpec Version%s", payload->specVersion);
- OC_LOG_V(level, tag, "\tData Model Version:%s", payload->dataModelVersion);
-}
-
-static inline void OCPayloadLogPlatform(LogLevel level, const char* tag, OCPlatformPayload* payload)
-{
- OC_LOG(level, tag, PCF("Payload Type: Platform"));
- OC_LOG_V(level, tag, "\tURI:%s", payload->uri);
- OC_LOG_V(level, tag, "\tPlatform ID:%s", payload->info.platformID);
- OC_LOG_V(level, tag, "\tMfg Name:%s", payload->info.manufacturerName);
- OC_LOG_V(level, tag, "\tMfg URL:%s", payload->info.manufacturerUrl);
- OC_LOG_V(level, tag, "\tModel Number:%s", payload->info.modelNumber);
- OC_LOG_V(level, tag, "\tDate of Mfg:%s", payload->info.dateOfManufacture);
- OC_LOG_V(level, tag, "\tPlatform Version:%s", payload->info.platformVersion);
- OC_LOG_V(level, tag, "\tOS Version:%s", payload->info.operatingSystemVersion);
- OC_LOG_V(level, tag, "\tHardware Version:%s", payload->info.hardwareVersion);
- OC_LOG_V(level, tag, "\tFirmware Version:%s", payload->info.firmwareVersion);
- OC_LOG_V(level, tag, "\tSupport URL:%s", payload->info.supportUrl);
- OC_LOG_V(level, tag, "\tSystem Time:%s", payload->info.systemTime);
-}
-
-static inline void OCPayloadLogPresence(LogLevel level, const char* tag, OCPresencePayload* payload)
-{
- OC_LOG(level, tag, PCF("Payload Type: Presence"));
- OC_LOG_V(level, tag, "\tSequence Number:%u", payload->sequenceNumber);
- OC_LOG_V(level, tag, "\tMax Age:%d", payload->maxAge);
- OC_LOG_V(level, tag, "\tTrigger:%s", convertTriggerEnumToString(payload->trigger));
- OC_LOG_V(level, tag, "\tResource Type:%s", payload->resourceType);
-}
-
-static inline void OCPayloadLogSecurity(LogLevel level, const char* tag,
- OCSecurityPayload* payload)
-{
- OC_LOG(level, tag, PCF("Payload Type: Security"));
- OC_LOG_V(level, tag, "\tSecurity Data: %s", payload->securityData);
-}
-
-static inline void OCPayloadLog(LogLevel level, const char* tag, OCPayload* payload)
-{
- if(!payload)
- {
- OC_LOG(level, tag, PCF("NULL Payload"));
- return;
- }
- switch(payload->type)
- {
- case PAYLOAD_TYPE_REPRESENTATION:
- OCPayloadLogRep(level, tag, (OCRepPayload*)payload);
- break;
- case PAYLOAD_TYPE_DISCOVERY:
- OCPayloadLogDiscovery(level, tag, (OCDiscoveryPayload*)payload);
- break;
- case PAYLOAD_TYPE_DEVICE:
- OCPayloadLogDevice(level, tag, (OCDevicePayload*)payload);
- break;
- case PAYLOAD_TYPE_PLATFORM:
- OCPayloadLogPlatform(level, tag, (OCPlatformPayload*)payload);
- break;
- case PAYLOAD_TYPE_PRESENCE:
- OCPayloadLogPresence(level, tag, (OCPresencePayload*)payload);
- break;
- case PAYLOAD_TYPE_SECURITY:
- OCPayloadLogSecurity(level, tag, (OCSecurityPayload*)payload);
- break;
- default:
- OC_LOG_V(level, tag, "Unknown Payload Type: %d", payload->type);
- break;
- }
-}
-#else
- #define OC_LOG_PAYLOAD(level, tag, payload)
-#endif
+/**
+ * Macro to verify the validity of cbor operation.
+ */
+#define VERIFY_CBOR_SUCCESS(log_tag, err, log_message) \
+ if ((CborNoError != (CborError)(err)) && (CborErrorOutOfMemory != (CborError)(err))) \
+ { \
+ if ((log_tag) && (log_message)) \
+ { \
+ OIC_LOG_V(ERROR, (log_tag), "%s with cbor error: \'%s\'.", \
+ (log_message), (cbor_error_string((CborError)err))); \
+ } \
+ goto exit; \
+ } \
+
+#define VERIFY_PARAM_NON_NULL(log_tag, err, log_message) \
+ if (NULL == (err)) \
+ { \
+ OIC_LOG_V(FATAL, (log_tag), "%s", (log_message)); \
+ goto exit;\
+ } \
+
+
+typedef struct OCResource OCResource;
void OCPayloadDestroy(OCPayload* payload);
OCRepPayload* OCRepPayloadClone(const OCRepPayload* payload);
+OCRepPayload* OCRepPayloadBatchClone(const OCRepPayload* repPayload);
+
void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child);
bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri);
bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType);
-bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* interface);
+bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* iface);
+bool OCRepPayloadAddModelVersion(OCRepPayload* payload, const char* dmv);
bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType);
-bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* interface);
+bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* iface);
bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name);
bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name);
bool OCRepPayloadSetPropDouble(OCRepPayload* payload, const char* name, double value);
bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value);
+/**
+ * This function allocates memory for the byte string and sets it in the payload.
+ *
+ * @param payload Pointer to the payload to which byte string needs to be added.
+ * @param name Name of the byte string.
+ * @param value Byte string and it's length.
+ *
+ * @return true on success, false upon failure.
+ */
+bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCByteString value);
+
+/**
+ * This function sets the byte string in the payload.
+ *
+ * @param payload Pointer to the payload to which byte string needs to be added.
+ * @param name Name of the byte string.
+ * @param value Byte string and it's length.
+ *
+ * @return true on success, false upon failure.
+ */
+bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* name,
+ OCByteString* value);
+
+/**
+ * This function gets the byte string from the payload.
+ *
+ * @param payload Pointer to the payload from which byte string needs to be retrieved.
+ * @param name Name of the byte string.
+ * @param value Byte string and it's length.
+ *
+ * @note: Caller needs to invoke OCFree on value.bytes after it is finished using the byte string.
+ *
+ * @return true on success, false upon failure.
+ */
+bool OCRepPayloadGetPropByteString(const OCRepPayload* payload, const char* name,
+ OCByteString* value);
+
bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value);
bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value);
-bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, const char** value);
+bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value);
bool OCRepPayloadSetPropBool(OCRepPayload* payload, const char* name, bool value);
bool OCRepPayloadGetPropBool(const OCRepPayload* payload, const char* name, bool* value);
bool OCRepPayloadSetPropObject(OCRepPayload* payload, const char* name, const OCRepPayload* value);
-bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name,
- OCRepPayload* value);
+bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name, OCRepPayload* value);
bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value);
+#ifdef __WITH_TLS__
+bool OCRepPayloadSetPropPubDataType(OCRepPayload *payload, const char *name, const OicSecKey_t *value);
+bool OCRepPayloadSetPropPubDataTypeAsOwner(OCRepPayload *payload, const char *name, const OicSecKey_t *value);
+bool OCRepPayloadGetPropPubDataType(const OCRepPayload *payload, const char *name, OicSecKey_t *value);
+#endif
+
+/**
+ * This function allocates memory for the byte string array and sets it in the payload.
+ *
+ * @param payload Pointer to the payload to which byte string array needs to be added.
+ * @param name Name of the byte string.
+ * @param array Byte string array.
+ * @param dimensions Number of byte strings in above array.
+ *
+ * @return true on success, false upon failure.
+ */
+bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* name,
+ OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
+
+/**
+ * This function sets the byte string array in the payload.
+ *
+ * @param payload Pointer to the payload to which byte string array needs to be added.
+ * @param name Name of the byte string.
+ * @param array Byte string array.
+ * @param dimensions Number of byte strings in above array.
+ *
+ * @return true on success, false upon failure.
+ */
+bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name,
+ const OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
+
+/**
+ * This function gets the byte string array from the payload.
+ *
+ * @param payload Pointer to the payload from which byte string array needs to be retrieved.
+ * @param name Name of the byte string array.
+ * @param value Byte string array.
+ * @param dimensions Number of byte strings in above array.
+ *
+ * @note: Caller needs to invoke OICFree on 'bytes' field of all array elements after it is
+ * finished using the byte string array.
+ *
+ * @return true on success, false upon failure.
+ */
+bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name,
+ OCByteString** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
+
bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name,
int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name,
// Discovery Payload
OCDiscoveryPayload* OCDiscoveryPayloadCreate();
-OCSecurityPayload* OCSecurityPayloadCreate(char* securityData);
+OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size);
void OCSecurityPayloadDestroy(OCSecurityPayload* payload);
+#ifndef TCP_ADAPTER
+void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
+ uint16_t securePort);
+#else
void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
- uint16_t port);
+ uint16_t securePort, uint16_t tcpPort);
+#endif
void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res);
+bool OCResourcePayloadAddStringLL(OCStringLL **payload, const char* type);
+
size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload);
OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index);
+void OCDiscoveryResourceDestroy(OCResourcePayload* payload);
void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload);
-// Device Payload
-OCDevicePayload* OCDevicePayloadCreate(const char* uri, const uint8_t* sid, const char* dname,
- const char* specVer, const char* dmVer);
-void OCDevicePayloadDestroy(OCDevicePayload* payload);
-
-// Platform Payload
-OCPlatformPayload* OCPlatformPayloadCreate(const char* uri, const OCPlatformInfo* platformInfo);
-OCPlatformPayload* OCPlatformPayloadCreateAsOwner(char* uri, OCPlatformInfo* platformInfo);
-
-void OCPlatformPayloadDestroy(OCPlatformPayload* payload);
-
+#ifdef WITH_PRESENCE
// Presence Payload
OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge,
OCPresenceTrigger trigger, const char* resourceType);
void OCPresencePayloadDestroy(OCPresencePayload* payload);
+#endif
+
+// Helper API
+OCStringLL* CloneOCStringLL (OCStringLL* ll);
+void OCFreeOCStringLL(OCStringLL* ll);
+
+/**
+ * This function creates a list from a string (with separated contents if several)
+ * @param text single string or CSV text fields
+ * @return newly allocated linked list
+ * @note separator is ',' (according to rfc4180, ';' is not valid)
+ **/
+OCStringLL* OCCreateOCStringLL(const char* text);
+
+/**
+ * This function creates a string from a list (with separated contents if several)
+ * @param ll Pointer to list
+ * @return newly allocated string. Caller takes ownership and must later free this memory with OICFree.
+ * @note separator is ',' (according to rfc4180)
+ **/
+char* OCCreateString(const OCStringLL* ll);
+
+/**
+ * This function copies contents (and allocates if necessary)
+ * @param dest existing bytestring (or null to allocate here)
+ * @param source existing bytestring
+ * @return true of success false on any errors
+ **/
+bool OCByteStringCopy(OCByteString *dest, const OCByteString *source);
#ifdef __cplusplus
}
#endif
#endif
-