Improved OIC Virtual Resource definitions (IOT-603)
[platform/upstream/iotivity.git] / resource / csdk / stack / include / octypes.h
index 8864231..cd4c13b 100644 (file)
 #define OCTYPES_H_
 
 #include "ocstackconfig.h"
-
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
 #ifdef __cplusplus
 #include <string.h>
 
 extern "C" {
 #endif // __cplusplus
 #define WITH_PRESENCE
+#include "ocpresence.h"
 //-----------------------------------------------------------------------------
 // Defines
 //-----------------------------------------------------------------------------
 
-//TODO: May want to refactor this in upcoming sprints.
-//Don't want to expose to application layer that lower level stack is using CoAP.
-
-/// Authority + URI string to prefix well known queries
-#define OC_WELL_KNOWN_QUERY                  "224.0.1.187:5683/oic/res"
-#define OC_MULTICAST_DISCOVERY_URI           "/oic/res"
-#define OC_EXPLICIT_DEVICE_DISCOVERY_URI     "224.0.1.187:5683/oic/d?rt=core.led"
-/// Multicast address and port string to prefix multicast queries
-#define OC_MULTICAST_PREFIX                  "224.0.1.187:5683"
-/// IP Multicast address to use for multicast requests
-#define OC_MULTICAST_IP                      "224.0.1.187"
-/// IP Multicast port to use for multicast requests
-#define OC_MULTICAST_PORT                    5683
-
+/**
+ * OIC Virtual resources supported by every OIC device.
+ */
+#define OC_RSRVD_WELL_KNOWN_URI               "/oic/res"
+#define OC_RSRVD_DEVICE_URI                   "/oic/d"
+#define OC_RSRVD_PLATFORM_URI                 "/oic/p"
+#define OC_RSRVD_RESOURCE_TYPES_URI           "/oic/res/types/d"
 #ifdef WITH_PRESENCE
+#define OC_RSRVD_PRESENCE_URI                 "/oic/ad"
 #define OC_DEFAULT_PRESENCE_TTL_SECONDS (60)
 /// OC_MAX_PRESENCE_TTL_SECONDS sets the maximum time to live (TTL) for presence.
 /// NOTE: Changing the setting to a longer duration may lead to unsupported and untested
 /// operation.
 #define OC_MAX_PRESENCE_TTL_SECONDS     (60 * 60 * 24) // 60 sec/min * 60 min/hr * 24 hr/day
-#define OC_PRESENCE_URI                      "/oic/ad"
 #endif
 
 ///Separtor for multiple query string
@@ -62,7 +58,7 @@ extern "C" {
 /**
  * Attributes used to form a proper OIC conforming JSON message.
  */
-#define OC_RSRVD_OC                     "oic"
+//#define OC_RSRVD_OC                     "oic"
 #define OC_RSRVD_PAYLOAD                "payload"
 #define OC_RSRVD_HREF                   "href"
 #define OC_RSRVD_PROPERTY               "prop"
@@ -74,6 +70,7 @@ extern "C" {
 #define OC_RSRVD_TTL                    "ttl"
 #define OC_RSRVD_NONCE                  "non"
 #define OC_RSRVD_TRIGGER                "trg"
+#define OC_RSRVD_LINKS                  "links"
 
 #define OC_RSRVD_INTERFACE_DEFAULT      "oic.if.baseline"
 #define OC_RSRVD_INTERFACE_LL           "oic.if.ll"
@@ -119,55 +116,156 @@ extern "C" {
 #define OC_DATA_MODEL_VERSION          "sec.0.95"
 //*******************
 
+// These provide backward compatibility - their use is deprecated
+#ifndef GOING_AWAY
+#define OC_MULTICAST_PREFIX                  "224.0.1.187:5683"
+#define OC_MULTICAST_IP                      "224.0.1.187"
+#define OC_MULTICAST_PORT                    5683
+#endif // GOING_AWAY
 
 //-----------------------------------------------------------------------------
 // Typedefs
 //-----------------------------------------------------------------------------
 
+#define MAX_ADDR_STR_SIZE (40)
+#define MAX_IDENTITY_SIZE (32)
+
+/*
+ * These enums (OCTransportAdapter and OCTransportFlags) must
+ * be kept synchronized with OCConnectivityType (below) as well as
+ * CATransportAdapter and CATransportFlags (in CACommon.h).
+ */
+
+typedef enum
+{
+    OC_DEFAULT_ADAPTER = 0,
+
+    // value zero indicates discovery
+    OC_ADAPTER_IP           = (1 << 0),   // IPv4 and IPv6, including 6LoWPAN
+    OC_ADAPTER_GATT_BTLE    = (1 << 1),   // GATT over Bluetooth LE
+    OC_ADAPTER_RFCOMM_BTEDR = (1 << 2),   // RFCOMM over Bluetooth EDR
+} OCTransportAdapter;
+
+// enum layout assumes some targets have 16-bit integer (e.g., Arduino)
+typedef enum
+{
+    OC_DEFAULT_FLAGS = 0,
+
+    // Insecure transport is the default (subject to change)
+    OC_FLAG_SECURE     = (1 << 4),   // secure the transport path
+
+    // IPv4 & IPv6 autoselection is the default
+    OC_IP_USE_V6       = (1 << 5),   // IP adapter only
+    OC_IP_USE_V4       = (1 << 6),   // IP adapter only
+
+    // Link-Local multicast is the default multicast scope for IPv6.
+    // These are placed here to correspond to the IPv6 multicast address bits.
+    OC_SCOPE_INTERFACE = 0x1, // IPv6 Interface-Local scope (loopback)
+    OC_SCOPE_LINK      = 0x2, // IPv6 Link-Local scope (default)
+    OC_SCOPE_REALM     = 0x3, // IPv6 Realm-Local scope
+    OC_SCOPE_ADMIN     = 0x4, // IPv6 Admin-Local scope
+    OC_SCOPE_SITE      = 0x5, // IPv6 Site-Local scope
+    OC_SCOPE_ORG       = 0x8, // IPv6 Organization-Local scope
+    OC_SCOPE_GLOBAL    = 0xE, // IPv6 Global scope
+} OCTransportFlags;
+
+#define OC_MASK_SCOPE    (0x000F)
+#define OC_MASK_MODS     (0x0FF0)
+
+/*
+ * endpoint identity
+ */
+typedef struct
+{
+    uint16_t id_length;
+    unsigned char id[MAX_IDENTITY_SIZE];
+} OCIdentity;
+
 /**
  * Data structure to encapsulate IPv4/IPv6/Contiki/lwIP device addresses.
+ *
+ * OCDevAddr must be the same as CAEndpoint (in CACommon.h).
  */
-typedef struct OCDevAddr
+typedef struct
 {
-    uint32_t     size;                    ///< length of the address stored in addr field.
-    uint8_t      addr[DEV_ADDR_SIZE_MAX]; ///< device address.
+    OCTransportAdapter      adapter;    // adapter type
+    OCTransportFlags        flags;      // transport modifiers
+    char                    addr[MAX_ADDR_STR_SIZE]; // address for all adapters
+    uint32_t                interface;  // usually zero for default interface
+    uint16_t                port;       // for IP
+    OCIdentity              identity;   // secure node identity
 } OCDevAddr;
 
-/**
- * OC Virtual resources supported by every OC device.
+/*
+ * OCConnectivityType includes elements of both OCTransportAdapter
+ * and OCTransportFlags. It is defined conditionally because the
+ * smaller definition limits expandability on 32/64 bit integer machines,
+ * and the larger definition won't fit into an enum on 16-bit integer
+ * machines like Arduino.
+ *
+ * This structure must directly correspond to OCTransportAdapter
+ * and OCTransportFlags.
  */
 typedef enum
 {
-    OC_WELL_KNOWN_URI= 0,       ///< "/oic/res"
-    OC_DEVICE_URI,              ///< "/oic/d"
-    OC_PLATFORM_URI,            ///< "/oic/p"
-    OC_RESOURCE_TYPES_URI,      ///< "/oic/res/d/type"
-    #ifdef WITH_PRESENCE
-    OC_PRESENCE,                ///< "/oic/ad"
+    CT_DEFAULT = 0,                // use when defaults are ok
+
+    #if defined (__UINT32_MAX__) && (__UINT32_MAX__ == 65535) // 16-bit int
+    CT_ADAPTER_IP           = (1 << 10),  // IPv4 and IPv6, including 6LoWPAN
+    CT_ADAPTER_GATT_BTLE    = (1 << 11),  // GATT over Bluetooth LE
+    CT_ADAPTER_RFCOMM_BTEDR = (1 << 12),  // RFCOMM over Bluetooth EDR
+    #define CT_ADAPTER_SHIFT 10
+    #define CT_MASK_FLAGS 0x03FF
+    #define CT_MASK_ADAPTER 0xFC00
+    #else   // assume 32-bit int
+    CT_ADAPTER_IP           = (1 << 16),  // IPv4 and IPv6, including 6LoWPAN
+    CT_ADAPTER_GATT_BTLE    = (1 << 17),  // GATT over Bluetooth LE
+    CT_ADAPTER_RFCOMM_BTEDR = (1 << 18),  // RFCOMM over Bluetooth EDR
+    #define CT_ADAPTER_SHIFT 16
+    #define CT_MASK_FLAGS 0xFFFF
+    #define CT_MASK_ADAPTER 0xFFFF0000
     #endif
-    OC_MAX_VIRTUAL_RESOURCES    ///<s Max items in the list
-} OCVirtualResources;
+
+    // Insecure transport is the default (subject to change)
+    CT_FLAG_SECURE     = (1 << 4), // secure the transport path
+
+    // IPv4 & IPv6 autoselection is the default
+    CT_IP_USE_V6       = (1 << 5), // IP adapter only
+    CT_IP_USE_V4       = (1 << 6), // IP adapter only
+
+    // Link-Local multicast is the default multicast scope for IPv6.
+    // These are placed here to correspond to the IPv6 address bits.
+    CT_SCOPE_INTERFACE = 0x1, // IPv6 Interface-Local scope (loopback)
+    CT_SCOPE_LINK      = 0x2, // IPv6 Link-Local scope (default)
+    CT_SCOPE_REALM     = 0x3, // IPv6 Realm-Local scope
+    CT_SCOPE_ADMIN     = 0x4, // IPv6 Admin-Local scope
+    CT_SCOPE_SITE      = 0x5, // IPv6 Site-Local scope
+    CT_SCOPE_ORG       = 0x8, // IPv6 Organization-Local scope
+    CT_SCOPE_GLOBAL    = 0xE, // IPv6 Global scope
+} OCConnectivityType;
 
 /**
- * Standard RESTful HTTP Methods.
+ *  OCDoResource methods
  */
 typedef enum
 {
-    OC_REST_NOMETHOD    = 0,
-    OC_REST_GET         = (1 << 0),     ///< Read
-    OC_REST_PUT         = (1 << 1),     ///< Write
-    OC_REST_POST        = (1 << 2),     ///< Update
-    OC_REST_DELETE      = (1 << 3),     ///< Delete
+    OC_REST_NOMETHOD       = 0,
+    OC_REST_GET            = (1 << 0),     ///< Read
+    OC_REST_PUT            = (1 << 1),     ///< Write
+    OC_REST_POST           = (1 << 2),     ///< Update
+    OC_REST_DELETE         = (1 << 3),     ///< Delete
     /// Register observe request for most up date notifications ONLY.
-    OC_REST_OBSERVE     = (1 << 4),
+    OC_REST_OBSERVE        = (1 << 4),
     /// Register observe request for all notifications, including stale notifications.
-    OC_REST_OBSERVE_ALL = (1 << 5),
+    OC_REST_OBSERVE_ALL    = (1 << 5),
     /// Deregister observation, intended for internal use
     OC_REST_CANCEL_OBSERVE = (1 << 6),
     #ifdef WITH_PRESENCE
     /// Subscribe for all presence notifications of a particular resource.
-    OC_REST_PRESENCE    = (1 << 7)
+    OC_REST_PRESENCE       = (1 << 7),
     #endif
+    /// Allows OCDoResource caller to do discovery.
+    OC_REST_DISCOVER       = (1 << 8)
 } OCMethod;
 
 /**
@@ -238,18 +336,6 @@ typedef enum
 } OCTransportProtocolID;
 
 /**
- * Adaptor types.
- */
-typedef enum
-{
-    OC_IPV4 = 0,
-    OC_IPV6,
-    OC_EDR,
-    OC_LE,
-    OC_ALL // Multicast message: send over all the interfaces.
-} OCConnectivityType;
-
-/**
  * Declares Stack Results & Errors.
  */
 typedef enum
@@ -406,6 +492,168 @@ typedef struct OCHeaderOption
 } OCHeaderOption;
 
 /**
+ * This structure describes the platform properties. All non-Null properties will be included
+ * in a platform discovery request.
+ */
+typedef struct
+{
+    char *platformID;
+    char *manufacturerName;
+    char *manufacturerUrl;
+    char *modelNumber;
+    char *dateOfManufacture;
+    char *platformVersion;
+    char *operatingSystemVersion;
+    char *hardwareVersion;
+    char *firmwareVersion;
+    char *supportUrl;
+    char *systemTime;
+
+} OCPlatformInfo;
+
+/**
+ * This structure is expected as input for device properties.
+ * device name is mandatory and expected from the application.
+ * device id of type UUID will be generated by the stack.
+ */
+typedef struct
+{
+    char *deviceName;
+
+} OCDeviceInfo;
+
+// Enum to describe the type of object held by the OCPayload object
+typedef enum
+{
+    PAYLOAD_TYPE_INVALID,
+    PAYLOAD_TYPE_DISCOVERY,
+    PAYLOAD_TYPE_DEVICE,
+    PAYLOAD_TYPE_PLATFORM,
+    PAYLOAD_TYPE_REPRESENTATION,
+    PAYLOAD_TYPE_SECURITY,
+    PAYLOAD_TYPE_PRESENCE
+} OCPayloadType;
+
+typedef struct
+{
+    // The type of message that was received
+    OCPayloadType type;
+} OCPayload;
+
+typedef enum
+{
+    OCREP_PROP_NULL,
+    OCREP_PROP_INT,
+    OCREP_PROP_DOUBLE,
+    OCREP_PROP_BOOL,
+    OCREP_PROP_STRING,
+    OCREP_PROP_OBJECT,
+    OCREP_PROP_ARRAY
+}OCRepPayloadPropType;
+
+#define MAX_REP_ARRAY_DEPTH 3
+typedef struct
+{
+    OCRepPayloadPropType type;
+    size_t dimensions[MAX_REP_ARRAY_DEPTH];
+
+    union
+    {
+        int64_t* iArray;
+        double* dArray;
+        bool* bArray;
+        char** strArray;
+        struct OCRepPayload** objArray;
+    };
+} OCRepPayloadValueArray;
+
+typedef struct OCRepPayloadValue
+{
+    char* name;
+    OCRepPayloadPropType type;
+    union
+    {
+        int64_t i;
+        double d;
+        bool b;
+        char* str;
+        struct OCRepPayload* obj;
+        OCRepPayloadValueArray arr;
+    };
+    struct OCRepPayloadValue* next;
+
+} OCRepPayloadValue;
+
+typedef struct OCStringLL
+{
+    struct OCStringLL *next;
+    char* value;
+} OCStringLL;
+
+// used for get/set/put/observe/etc representations
+typedef struct OCRepPayload
+{
+    OCPayload base;
+    char* uri;
+    OCStringLL* types;
+    OCStringLL* interfaces;
+    OCRepPayloadValue* values;
+    struct OCRepPayload* next;
+} OCRepPayload;
+
+// used inside a discovery payload
+typedef struct OCResourcePayload
+{
+    char* uri;
+    uint8_t* sid;
+    OCStringLL* types;
+    OCStringLL* interfaces;
+    uint8_t bitmap;
+    bool secure;
+    uint16_t port;
+    struct OCResourcePayload* next;
+} OCResourcePayload;
+
+typedef struct
+{
+    OCPayload base;
+    OCResourcePayload* resources;
+} OCDiscoveryPayload;
+
+typedef struct
+{
+    OCPayload base;
+    char* uri;
+    uint8_t* sid;
+    char* deviceName;
+    char* specVersion;
+    char* dataModelVersion;
+} OCDevicePayload;
+
+typedef struct
+{
+    OCPayload base;
+    char* uri;
+    OCPlatformInfo info;
+} OCPlatformPayload;
+
+typedef struct
+{
+    OCPayload base;
+    char* securityData;
+} OCSecurityPayload;
+#ifdef WITH_PRESENCE
+typedef struct
+{
+    OCPayload base;
+    uint32_t sequenceNumber;
+    uint32_t maxAge;
+    OCPresenceTrigger trigger;
+    char* resourceType;
+} OCPresencePayload;
+#endif
+
+/**
  * Incoming requests handled by the server. Requests are passed in as a parameter to the
  * @ref OCEntityHandler callback API.
  * @brief The @ref OCEntityHandler callback API must be implemented in the application in order
@@ -426,8 +674,8 @@ typedef struct
     // An array of the received vendor specific header options
     uint8_t numRcvdVendorSpecificHeaderOptions;
     OCHeaderOption * rcvdVendorSpecificHeaderOptions;
-    // reqJSON is retrieved from the payload of the received request PDU
-    char * reqJSONPayload;
+    // the payload from the request PDU
+    OCPayload *payload;
 } OCEntityHandlerRequest;
 
 /**
@@ -436,51 +684,22 @@ typedef struct
 typedef struct
 {
     /// Address of remote server
-    OCDevAddr * addr;
-    /// Indicates adaptor type on which the response was received
-    OCConnectivityType connType;
+    OCDevAddr devAddr;
+    OCDevAddr *addr;            // backward compatibility (points to devAddr)
+    OCConnectivityType connType;  // backward compatibility
     /// the is the result of our stack, OCStackResult should contain coap/other error codes;
     OCStackResult result;
     /// If associated with observe, this will represent the sequence of notifications from server.
     uint32_t sequenceNumber;
-    /// resJSONPayload is retrieved from the payload of the received request PDU
-    const char * resJSONPayload;
+    /// resourceURI
+    const char * resourceUri;
+    // the payload for the response PDU
+    OCPayload *payload;
     /// An array of the received vendor specific header options
     uint8_t numRcvdVendorSpecificHeaderOptions;
     OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
 } OCClientResponse;
 
-/**
- * This structure describes the platform properties. All non-Null properties will be included
- * in a platform discovery request.
- */
-typedef struct
-{
-    char *platformID;
-    char *manufacturerName;
-    char *manufacturerUrl;
-    char *modelNumber;
-    char *dateOfManufacture;
-    char *platformVersion;
-    char *operatingSystemVersion;
-    char *hardwareVersion;
-    char *firmwareVersion;
-    char *supportUrl;
-    char *systemTime;
-
-} OCPlatformInfo;
-
-/**
- * This structure is expected as input for device properties.
- * device name is mandatory and expected from the application.
- * device id of type UUID will be generated by the stack.
- */
-typedef struct
-{
-    char *deviceName;
-
-} OCDeviceInfo;
-
 typedef struct
 {
     // Request handle is passed to server via the entity handler for each incoming request.
@@ -491,9 +710,7 @@ typedef struct
     // Allow the entity handler to pass a result with the response
     OCEntityHandlerResult  ehResult;
     // this is the pointer to server payload data to be transferred
-    char *payload;
-    // size of server payload data.  I don't think we should rely on null terminated data for size
-    uint16_t payloadSize;
+    OCPayload* payload;
     // An array of the vendor specific header options the entity handler wishes to use in response
     uint8_t numSendVendorSpecificHeaderOptions;
     OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];