Added a description for the OCQualityOfService enum
[platform/upstream/iotivity.git] / resource / csdk / stack / include / ocstack.h
1 //******************************************************************
2 //
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #ifndef OCSTACK_H_
22 #define OCSTACK_H_
23
24 #include <stdint.h>
25 #include "ocstackconfig.h"
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif // __cplusplus
30 #define WITH_PRESENCE
31 //-----------------------------------------------------------------------------
32 // Defines
33 //-----------------------------------------------------------------------------
34
35 //TODO: May want to refactor this in upcoming sprints.
36 //Don't want to expose to application layer that lower level stack is using CoAP.
37
38 /// Authority + URI string to prefix well known queries
39 #define OC_WELL_KNOWN_QUERY                  "224.0.1.187:5683/oc/core"
40 #define OC_EXPLICIT_DEVICE_DISCOVERY_URI     "224.0.1.187:5683/oc/core/d?rt=core.led"
41 /// Multicast address and port string to prefix multicast queries
42 #define OC_MULTICAST_PREFIX                  "224.0.1.187:5683"
43 /// IP Multicast address to use for multicast requests
44 #define OC_MULTICAST_IP                      "224.0.1.187"
45 /// IP Multicast port to use for multicast requests
46 #define OC_MULTICAST_PORT                    5683
47
48 #ifdef WITH_PRESENCE
49 #define OC_DEFAULT_PRESENCE_TTL_SECONDS (60)
50 /// OC_MAX_PRESENCE_TTL_SECONDS sets the maximum time to live (TTL) for presence.
51 /// NOTE: Changing the setting to a longer duration may lead to unsupported and untested
52 /// operation.
53 #define OC_MAX_PRESENCE_TTL_SECONDS     (60 * 60 * 24) // 60 sec/min * 60 min/hr * 24 hr/day
54 #define OC_PRESENCE_URI                      "/oc/presence"
55 #endif
56
57 //-----------------------------------------------------------------------------
58 // Typedefs
59 //-----------------------------------------------------------------------------
60
61 /**
62  * Data structure to encapsulate IPv4/IPv6/Contiki/lwIP device addresses.
63  */
64 typedef struct OCDevAddr
65 {
66     uint32_t     size;                    ///< length of the address stored in addr field.
67     uint8_t      addr[DEV_ADDR_SIZE_MAX]; ///< device address.
68 } OCDevAddr;
69
70 /**
71  * OC Virtual resources supported by every OC device.
72  */
73 typedef enum
74 {
75     OC_WELL_KNOWN_URI= 0,       ///< "/oc/core"
76     OC_DEVICE_URI,              ///< "/oc/core/d"
77     OC_RESOURCE_TYPES_URI,      ///< "/oc/core/d/type"
78     #ifdef WITH_PRESENCE
79     OC_PRESENCE,                ///< "/oc/presence"
80     #endif
81     OC_MAX_VIRTUAL_RESOURCES    ///<s Max items in the list
82 } OCVirtualResources;
83
84 /**
85  * Standard RESTful HTTP Methods.
86  */
87 typedef enum
88 {
89     OC_REST_NOMETHOD    = 0,
90     OC_REST_GET         = (1 << 0),     ///< Read
91     OC_REST_PUT         = (1 << 1),     ///< Write
92     OC_REST_POST        = (1 << 2),     ///< Update
93     OC_REST_DELETE      = (1 << 3),     ///< Delete
94     /// Register observe request for most up date notifications ONLY.
95     OC_REST_OBSERVE     = (1 << 4),
96     /// Register observe request for all notifications, including stale notifications.
97     OC_REST_OBSERVE_ALL = (1 << 5),
98     /// Deregister observation, intended for internal use
99     OC_REST_CANCEL_OBSERVE = (1 << 6),
100     #ifdef WITH_PRESENCE
101     /// Subscribe for all presence notifications of a particular resource.
102     OC_REST_PRESENCE    = (1 << 7)
103     #endif
104 } OCMethod;
105
106 /**
107  * Host Mode of Operation.
108  */
109 typedef enum
110 {
111     OC_CLIENT = 0,
112     OC_SERVER,
113     OC_CLIENT_SERVER
114 } OCMode;
115
116 /**
117  * Quality of Service.
118  *
119  * OCQualityOfService attempts to abstract the guarantees provided by the underlying transport
120  * protocol.  The precise definitions of each quality of service level depend on the
121  * implementation.  In descriptions below are for the current implementation and may changed
122  * over time.
123  */
124 typedef enum
125 {
126     /// Packet delivery is best effort
127     OC_LOW_QOS = 0,
128     /// Packet delivery is best effort
129     OC_MEDIUM_QOS,
130     /// Acknowledgements are used to confirm delivery
131     OC_HIGH_QOS,
132     /// No Quality is defined, let the stack decide
133     OC_NA_QOS
134 } OCQualityOfService;
135
136 /**
137  * Resource Properties.
138  *
139  * ::OC_ACTIVE       When this bit is set, the resource is initialized, otherwise the resource
140  *                   is 'inactive'. 'inactive' signifies that the resource has been marked for
141  *                   deletion or is already deleted.
142  * ::OC_DISCOVERABLE When this bit is set, the resource is allowed to be discovered by clients.
143  * ::OC_OBSERVABLE   When this bit is set, the resource is allowed to be observed by clients.
144  * ::OC_SLOW         When this bit is set, the resource has been marked as 'slow'. 'slow' signifies
145  *                   that responses from this resource can expect delays in processing its
146  *                   requests from clients.
147  * ::OC_SECURE       When this bit is set, the resource is a secure resource.
148  */
149 typedef enum
150 {
151     OC_ACTIVE       = (1 << 0),
152     OC_DISCOVERABLE = (1 << 1),
153     OC_OBSERVABLE   = (1 << 2),
154     OC_SLOW         = (1 << 3),
155     OC_SECURE       = (1 << 4)
156 } OCResourceProperty;
157
158 /**
159  * Transport Protocol IDs.
160  */
161 typedef enum
162 {
163     OC_INVALID_ID   = (1 << 0),
164     OC_COAP_ID      = (1 << 1)
165 } OCTransportProtocolID;
166
167 /**
168  * Adaptor types.
169  */
170 typedef enum
171 {
172     OC_ETHERNET = 0,
173     OC_WIFI,
174     OC_EDR,
175     OC_LE,
176     OC_ALL // Multicast message: send over all the interfaces.
177 } OCConnectivityType;
178
179 /**
180  * Declares Stack Results & Errors.
181  */
182 typedef enum
183 {
184     /* Success status code - START HERE */
185     OC_STACK_OK = 0,
186     OC_STACK_RESOURCE_CREATED,
187     OC_STACK_RESOURCE_DELETED,
188     OC_STACK_CONTINUE,
189     /* Success status code - END HERE */
190     /* Error status code - START HERE */
191     OC_STACK_INVALID_URI = 20,
192     OC_STACK_INVALID_QUERY,
193     OC_STACK_INVALID_IP,
194     OC_STACK_INVALID_PORT,
195     OC_STACK_INVALID_CALLBACK,
196     OC_STACK_INVALID_METHOD,
197     OC_STACK_INVALID_PARAM,
198     OC_STACK_INVALID_OBSERVE_PARAM,
199     OC_STACK_NO_MEMORY,
200     OC_STACK_COMM_ERROR,
201     OC_STACK_TIMEOUT,
202     OC_STACK_ADAPTER_NOT_ENABLED,
203     OC_STACK_NOTIMPL,
204     OC_STACK_NO_RESOURCE,               /* resource not found */
205     OC_STACK_RESOURCE_ERROR,            /* ex: not supported method or interface */
206     OC_STACK_SLOW_RESOURCE,
207     OC_STACK_DUPLICATE_REQUEST,
208     OC_STACK_NO_OBSERVERS,              /* resource has no registered observers */
209     OC_STACK_OBSERVER_NOT_FOUND,
210     OC_STACK_VIRTUAL_DO_NOT_HANDLE,
211     OC_STACK_INVALID_OPTION,
212     OC_STACK_MALFORMED_RESPONSE,        /* the remote reply contained malformed data */
213     OC_STACK_PERSISTENT_BUFFER_REQUIRED,
214     OC_STACK_INVALID_REQUEST_HANDLE,
215     OC_STACK_INVALID_DEVICE_INFO,
216     OC_STACK_INVALID_JSON,
217     /* NOTE: Insert all new error codes here!*/
218     #ifdef WITH_PRESENCE
219     OC_STACK_PRESENCE_STOPPED = 128,
220     OC_STACK_PRESENCE_TIMEOUT,
221     OC_STACK_PRESENCE_DO_NOT_HANDLE,
222     #endif
223     OC_STACK_ERROR = 255
224     /* Error status code - END HERE */
225 } OCStackResult;
226
227 /**
228  * Handle to an @ref OCDoResource invocation.
229  */
230 typedef void * OCDoHandle;
231
232 /**
233  * Handle to an OCResource object owned by the OCStack.
234  */
235 typedef void * OCResourceHandle;
236
237 typedef void * OCRequestHandle;
238 typedef void * OCResponseHandle;
239
240 /**
241  * Unique identifier for each observation request. Used when observations are
242  * registered or deregistering. Used by entity handler to signal specific
243  * observers to be notified of resource changes.
244  * There can be maximum of 256 observations per server.
245  */
246 typedef uint8_t OCObservationId;
247
248 /**
249  * Action associated with observation.
250  */
251 typedef enum
252 {
253     OC_OBSERVE_REGISTER = 0,
254     OC_OBSERVE_DEREGISTER = 1,
255     OC_OBSERVE_NO_OPTION = 2
256 } OCObserveAction;
257
258 typedef struct
259 {
260     // Action associated with observation request
261     OCObserveAction action;
262     // Identifier for observation being registered/deregistered
263     OCObservationId obsId;
264 } OCObservationInfo;
265
266 /**
267  * Possible returned values from entity handler.
268  */
269 typedef enum
270 {
271     OC_EH_OK = 0,
272     OC_EH_ERROR,
273     OC_EH_RESOURCE_CREATED,
274     OC_EH_RESOURCE_DELETED,
275     OC_EH_SLOW,
276     OC_EH_FORBIDDEN,
277     OC_EH_RESOURCE_NOT_FOUND
278 } OCEntityHandlerResult;
279
280 /**
281  * This structure will be used to define the vendor specific header options to be included
282  * in communication packets.
283  */
284 typedef struct OCHeaderOption
285 {
286     // The protocol ID this option applies to
287     OCTransportProtocolID protocolID;
288     // The header option ID which will be added to communication packets
289     uint16_t optionID;
290     // its length   191
291     uint16_t optionLength;
292     // pointer to its data
293     uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
294 } OCHeaderOption;
295
296 /**
297  * Incoming requests handled by the server. Requests are passed in as a parameter to the
298  * @ref OCEntityHandler callback API.
299  * @brief The @ref OCEntityHandler callback API must be implemented in the application in order
300  * to receive these requests.
301  */
302 typedef struct
303 {
304     // Associated resource
305     OCResourceHandle resource;
306     OCRequestHandle requestHandle;
307     // the REST method retrieved from received request PDU
308     OCMethod method;
309     // resource query send by client
310     char * query;
311     // Information associated with observation - valid only when OCEntityHandler
312     // flag includes OC_OBSERVE_FLAG
313     OCObservationInfo obsInfo;
314     // An array of the received vendor specific header options
315     uint8_t numRcvdVendorSpecificHeaderOptions;
316     OCHeaderOption * rcvdVendorSpecificHeaderOptions;
317     // reqJSON is retrieved from the payload of the received request PDU
318     char * reqJSONPayload;
319 } OCEntityHandlerRequest;
320
321 /**
322  * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
323  */
324 typedef struct
325 {
326     /// Address of remote server
327     OCDevAddr * addr;
328     /// Indicates adaptor type on which the response was received
329     OCConnectivityType connType;
330     /// the is the result of our stack, OCStackResult should contain coap/other error codes;
331     OCStackResult result;
332     /// If associated with observe, this will represent the sequence of notifications from server.
333     uint32_t sequenceNumber;
334     /// resJSONPayload is retrieved from the payload of the received request PDU
335     const char * resJSONPayload;
336     /// An array of the received vendor specific header options
337     uint8_t numRcvdVendorSpecificHeaderOptions;
338     OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
339 } OCClientResponse;
340
341 /**
342  * This structure describes the device properties. All non-Null properties will be included
343  * in a device discovery request.
344  */
345 typedef struct
346 {
347     char *deviceName;
348     char *hostName;
349     char *deviceUUID;
350     char *contentType;
351     char *version;
352     char *manufacturerName;
353     char *manufacturerUrl;
354     char *modelNumber;
355     char *dateOfManufacture;
356     char *platformVersion;
357     char *firmwareVersion;
358     char *supportUrl;
359 } OCDeviceInfo;
360
361 typedef struct
362 {
363     // Request handle is passed to server via the entity handler for each incoming request.
364     // Stack assigns when request is received, server sets to indicate what request response is for
365     OCRequestHandle requestHandle;
366     // New handle for tracking block (or slow) response.  Stack assigns, server uses for subsequent calls
367     OCResponseHandle  *responseHandle;
368     // Resource handle
369     OCResourceHandle resourceHandle;
370     // Allow the entity handler to pass a result with the response
371     OCEntityHandlerResult  ehResult;
372     // this is the pointer to server payload data to be transferred
373     char *payload;
374     // size of server payload data.  I don't think we should rely on null terminated data for size
375     uint16_t payloadSize;
376     // An array of the vendor specific header options the entity handler wishes to use in response
377     uint8_t numSendVendorSpecificHeaderOptions;
378     OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
379     // URI of new resource that entity handler might create
380     char resourceUri[MAX_URI_LENGTH];
381     // Server sets to true for persistent response buffer, false for non-persistent response buffer
382     uint8_t persistentBufferFlag;
383 } OCEntityHandlerResponse;
384
385 typedef enum
386 {
387     OC_INIT_FLAG    = (1 << 0),
388     OC_REQUEST_FLAG = (1 << 1),
389     OC_OBSERVE_FLAG = (1 << 2)
390 } OCEntityHandlerFlag; //entity_handler_flag_t ;
391
392 /**
393  * Possible returned values from client application.
394  */
395 typedef enum
396 {
397     OC_STACK_DELETE_TRANSACTION = 0,//!< OC_STACK_DELETE_TRANSACTION
398     OC_STACK_KEEP_TRANSACTION       //!< OC_STACK_KEEP_TRANSACTION
399 } OCStackApplicationResult;
400
401 //-----------------------------------------------------------------------------
402 // Callback function definitions
403 //-----------------------------------------------------------------------------
404
405 /**
406  * Client applications implement this callback to consume responses received from Servers.
407  */
408 typedef OCStackApplicationResult (* OCClientResponseHandler)(void *context, OCDoHandle handle,
409     OCClientResponse * clientResponse);
410
411 /**
412  * Client applications using a context pointer implement this callback to delete the
413  * context upon removal of the callback/context pointer from the internal callback-list.
414  */
415 typedef void (* OCClientContextDeleter)(void *context);
416
417 /**
418  * This info is passed from application to OC Stack when initiating a request to Server.
419  */
420 typedef struct
421 {
422     void *context;
423     /// The pointer to a function the stack will call to handle the requests
424     OCClientResponseHandler cb;
425     /// A pointer to a function to delete the context when this callback is removed
426     OCClientContextDeleter cd;
427 } OCCallbackData;
428
429 /**
430  * Application server implementations must implement this callback to consume requests OTA.
431  * Entity handler callback needs to fill the resPayload of the entityHandlerRequest.
432  */
433 typedef OCEntityHandlerResult (*OCEntityHandler)
434 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest);
435
436 /**
437  * Device Entity handler need to use this call back instead of OCEntityHandler.
438  */
439 typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
440 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri);
441
442 //-----------------------------------------------------------------------------
443 // Function prototypes
444 //-----------------------------------------------------------------------------
445
446 /**
447  * Initialize the OC Stack.  Must be called prior to starting the stack.
448  *
449  * @param ipAddr
450  *     IP Address of host device. Deprecated parameter.
451  * @param port
452  *     Port of host device. Deprecated parameter.
453  * @param mode
454  *     Host device is client, server, or client-server.
455  *
456  * @return ::OC_STACK_OK on success, some other value upon failure.
457  */
458 OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
459
460 /**
461  * Stop the OC stack.  Use for a controlled shutdown.
462  *
463  * Note: OCStop() performs operations similar to OCStopPresence(), as well as OCDeleteResource() on
464  * all resources this server is hosting. OCDeleteResource() performs operations similar to
465  * OCNotifyAllObservers() to notify all client observers that the respective resource is being
466  * deleted.
467  *
468  * @return ::OC_STACK_OK on success, some other value upon failure.
469  */
470 OCStackResult OCStop();
471
472 /**
473  * Called in main loop of OC client or server.  Allows low-level processing of
474  * stack services.
475  *
476  * @return ::OC_STACK_OK on success, some other value upon failure.
477  */
478 OCStackResult OCProcess();
479
480 /**
481  * Discover or Perform requests on a specified resource (specified by that Resource's respective
482  * URI).
483  *
484  * @param handle             @ref OCDoHandle to refer to the request sent out on behalf of
485  *                           calling this API. This handle can be used to cancel this operation
486  *                           via the OCCancel API.
487  *                           Note: This reference is handled internally, and
488  *                           should not be free'd by the consumer.  A NULL handle is permitted
489  *                           in the event where the caller has no use for the return value.
490  * @param method             @ref OCMethod to perform on the resource.
491  * @param requiredUri        URI of the resource to interact with.
492  * @param referenceUri       URI of the reference resource.
493  * @param request            JSON encoded request.
494  * @param conType            @ref OCConnectivityType type of connectivity indicating the
495  *                           interface. Example: ::OC_WIFI, ::OC_ETHERNET, ::OC_ALL.
496  * @param qos                Quality of service. Note that if this API is called on a uri with
497  *                           the well-known multicast IP address, the qos will be forced to
498  *                           ::OC_LOW_QOS
499  *                           since it is impractical to send other QOS levels on such addresses.
500  * @param cbData             Asynchronous callback function that is invoked
501  *                           by the stack when discovery or resource interaction is complete.
502  * @param options            The address of an array containing the vendor specific
503  *                           header options to be sent with the request.
504  * @param numOptions         Number of header options to be included.
505  *
506  * Note: Presence subscription amendments (ie. adding additional resource type filters by calling
507  * this API again) require the use of the same base URI as the original request to successfully
508  * amend the presence filters.
509  *
510  * @return ::OC_STACK_OK on success, some other value upon failure.
511  */
512 OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri,
513             const char *referenceUri, const char *request, OCConnectivityType conType,
514             OCQualityOfService qos, OCCallbackData *cbData,
515             OCHeaderOption * options, uint8_t numOptions);
516
517 /**
518  * Cancel a request associated with a specific @ref OCDoResource invocation.
519  *
520  * @param handle - Used to identify a specific OCDoResource invocation.
521  * @param qos    - used to specify Quality of Service (read below for more info)
522  * @param options- used to specify vendor specific header options when sending
523  *                 explicit observe cancellation
524  * @param numOptions- Number of header options to be included
525  *
526  * @return ::OC_STACK_OK on success, some other value upon failure.
527  */
528 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
529         uint8_t numOptions);
530
531 #ifdef WITH_PRESENCE
532 /**
533  * When operating in @ref OCServer or @ref OCClientServer mode, this API will start sending out
534  * presence notifications to clients via multicast. Once this API has been called with a success,
535  * clients may query for this server's presence and this server's stack will respond via multicast.
536  *
537  * Server can call this function when it comes online for the first time, or when it comes back
538  * online from offline mode, or when it re enters network.
539  *
540  * @param ttl Time To Live in seconds.
541  * Note: If ttl is '0', then the default stack value will be used (60 Seconds).
542  *
543  *       If ttl is greater than OC_MAX_PRESENCE_TTL_SECONDS, then the ttl will be set to
544  *       OC_MAX_PRESENCE_TTL_SECONDS.
545  *
546  * @return ::OC_STACK_OK on success, some other value upon failure.
547  */
548 OCStackResult OCStartPresence(const uint32_t ttl);
549
550 /**
551  * When operating in @ref OCServer or @ref OCClientServer mode, this API will stop sending out
552  * presence notifications to clients via multicast. Once this API has been called with a success,
553  * this server's stack will not respond to clients querying for this server's presence.
554  *
555  * Server can call this function when it is terminating, going offline, or when going
556  * away from network.
557  *
558  * @return ::OC_STACK_OK on success, some other value upon failure.
559  */
560
561 OCStackResult OCStopPresence();
562 #endif
563
564
565 /**
566  * Set default device entity handler.
567  *
568  * @param entityHandler Entity handler function that is called by ocstack to handle requests for
569  *                      any undefined resources or default actions.
570  *                      If NULL is passed it removes the device default entity handler.
571  *
572  * @return ::OC_STACK_OK on success, some other value upon failure.
573  */
574 OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler);
575
576 /**
577  * Set device information.
578  *
579  * @param deviceInfo - Structure passed by the server application containing
580  *                     the device information.
581  *
582  *
583  * @return
584  *     OC_STACK_OK              - no errors
585  *     OC_STACK_INVALID_PARAM   - invalid paramerter
586  *     OC_STACK_ERROR           - stack process error
587  */
588 OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
589
590 /**
591  * Create a resource.
592  *
593  * @param handle Pointer to handle to newly created resource.  Set by ocstack and
594  *               used to refer to resource.
595  * @param resourceTypeName Name of resource type.  Example: "core.led".
596  * @param resourceInterfaceName Name of resource interface.  Example: "core.rw".
597  * @param uri URI of the resource.  Example:  "/a/led".
598  * @param entityHandler Entity handler function that is called by ocstack to handle requests, etc.
599  *                      NULL for default entity handler.
600  * @param resourceProperties Properties supported by resource.
601  *                           Example: ::OC_DISCOVERABLE|::OC_OBSERVABLE.
602  *
603  * @return ::OC_STACK_OK on success, some other value upon failure.
604  */
605 OCStackResult OCCreateResource(OCResourceHandle *handle,
606                                const char *resourceTypeName,
607                                const char *resourceInterfaceName,
608                                const char *uri,
609                                OCEntityHandler entityHandler,
610                                uint8_t resourceProperties);
611
612 /**
613  * Create a resource. with host ip address for remote resource.
614  *
615  * @param handle Pointer to handle to newly created resource.  Set by ocstack.
616  *               Used to refer to resource.
617  * @param resourceTypeName Name of resource type.  Example: "core.led".
618  * @param resourceInterfaceName Name of resource interface.  Example: "core.rw".
619  * @param host HOST address of the remote resource.  Example:  "coap://xxx.xxx.xxx.xxx:xxxxx".
620  * @param uri URI of the resource.  Example:  "/a/led".
621  * @param entityHandler Entity handler function that is called by ocstack to handle requests, etc.
622  *                      NULL for default entity handler.
623  * @param resourceProperties Properties supported by resource.
624  *                           Example: ::OC_DISCOVERABLE|::OC_OBSERVABLE
625  *
626  * @return ::OC_STACK_OK on success, some other value upon failure.
627  */
628 OCStackResult OCCreateResourceWithHost(OCResourceHandle *handle,
629                                const char *resourceTypeName,
630                                const char *resourceInterfaceName,
631                                const char *host,
632                                const char *uri,
633                                OCEntityHandler entityHandler,
634                                uint8_t resourceProperties);
635
636 /**
637  * Add a resource to a collection resource.
638  *
639  * @param collectionHandle Handle to the collection resource.
640  * @param resourceHandle Handle to resource to be added to the collection resource.
641  *
642  * @return ::OC_STACK_OK on success, some other value upon failure.
643  */
644 OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
645
646 /**
647  * Remove a resource from a collection resource.
648  *
649  * @param collectionHandle Handle to the collection resource.
650  * @param resourceHandle Handle to resource to be removed from the collection resource.
651  *
652  * @return ::OC_STACK_OK on success, some other value upon failure.
653  */
654 OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
655
656 /**
657  * Bind a resourcetype to a resource.
658  *
659  * @param handle Handle to the resource.
660  * @param resourceTypeName Name of resource type.  Example: "core.led".
661  *
662  * @return ::OC_STACK_OK on success, some other value upon failure.
663  */
664 OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
665                                            const char *resourceTypeName);
666 /**
667  * Bind a resource interface to a resource.
668  *
669  * @param handle Handle to the resource.
670  * @param resourceInterfaceName Name of resource interface.  Example: "core.rw".
671  *
672  * @return ::OC_STACK_OK on success, some other value upon failure.
673  */
674 OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
675                                                 const char *resourceInterfaceName);
676
677 /**
678  * Bind an entity handler to the resource.
679  *
680  * @param handle Handle to the resource that the contained resource is to be bound.
681  * @param entityHandler Entity handler function that is called by ocstack to handle requests, etc.
682  * @return ::OC_STACK_OK on success, some other value upon failure.
683  */
684 OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler);
685
686 /**
687  * Get the number of resources that have been created in the stack.
688  *
689  * @param numResources Pointer to count variable.
690  *
691  * @return ::OC_STACK_OK on success, some other value upon failure.
692  */
693 OCStackResult OCGetNumberOfResources(uint8_t *numResources);
694
695 /**
696  * Get a resource handle by index.
697  *
698  * @param index Index of resource, 0 to Count - 1.
699  *
700  * @return Found resource handle or NULL if not found.
701  */
702 OCResourceHandle OCGetResourceHandle(uint8_t index);
703
704 /**
705  * Delete resource specified by handle.  Deletes resource and all resourcetype and resourceinterface
706  * linked lists.
707  *
708  * Note: OCDeleteResource() performs operations similar to OCNotifyAllObservers() to notify all
709  * client observers that "this" resource is being deleted.
710  *
711  * @param handle Handle of resource to be deleted.
712  *
713  * @return ::OC_STACK_OK on success, some other value upon failure.
714  */
715 OCStackResult OCDeleteResource(OCResourceHandle handle);
716
717 /**
718  * Get the URI of the resource specified by handle.
719  *
720  * @param handle Handle of resource.
721  * @return URI string if resource found or NULL if not found.
722  */
723 const char *OCGetResourceUri(OCResourceHandle handle);
724
725 /**
726  * Get the properties of the resource specified by handle.
727  * NOTE: that after a resource is created, the OC_ACTIVE property is set
728  * for the resource by the stack.
729  *
730  * @param handle Handle of resource.
731  * @return OCResourceProperty Bitmask or -1 if resource is not found.
732  */
733 OCResourceProperty OCGetResourceProperties(OCResourceHandle handle);
734
735 /**
736  * Get the number of resource types of the resource.
737  *
738  * @param handle Handle of resource.
739  * @param numResourceTypes Pointer to count variable.
740  *
741  * @return ::OC_STACK_OK on success, some other value upon failure.
742  */
743 OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
744
745 /**
746  * Get name of resource type of the resource.
747  *
748  * @param handle Handle of resource.
749  * @param index Index of resource, 0 to Count - 1.
750  *
751  * @return Resource type name if resource found or NULL if resource not found.
752  */
753 const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
754
755 /**
756  * Get the number of resource interfaces of the resource.
757  *
758  * @param handle Handle of resource.
759  * @param numResourceInterfaces Pointer to count variable.
760  *
761  * @return ::OC_STACK_OK on success, some other value upon failure.
762  */
763 OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle,
764         uint8_t *numResourceInterfaces);
765
766 /**
767  * Get name of resource interface of the resource.
768  *
769  * @param handle Handle of resource.
770  * @param index Index of resource, 0 to Count - 1.
771  *
772  * @return Resource interface name if resource found or NULL if resource not found.
773  */
774 const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
775
776 /**
777  * Get methods of resource interface of the resource.
778  *
779  * @param handle Handle of resource.
780  * @param index Index of resource, 0 to Count - 1.
781  *
782  * @return Allowed methods if resource found or NULL if resource not found.
783  */
784 uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
785
786 /**
787  * Get resource handle from the collection resource by index.
788  *
789  * @param collectionHandle Handle of collection resource.
790  * @param index Index of contained resource, 0 to Count - 1.
791  *
792  * @return Handle to contained resource if resource found or NULL if resource not found.
793  */
794 OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle,
795         uint8_t index);
796
797 /**
798  * Get the entity handler for a resource.
799  *
800  * @param handle Handle of resource.
801  *
802  * @return Entity handler if resource found or NULL resource not found.
803  */
804 OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
805
806 /**
807  * Notify all registered observers that the resource representation has
808  * changed. If observation includes a query the client is notified only
809  * if the query is valid after the resource representation has changed.
810  *
811  * @param handle Handle of resource.
812  * @param qos    Desired quality of service for the observation notifications.
813  *
814  * @return ::OC_STACK_OK on success, some other value upon failure.
815  */
816 OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
817
818 /**
819  * Notify specific observers with updated value of representation.
820  * Before this API is invoked by entity handler it has finished processing
821  * queries for the associated observers.
822  *
823  * @param handle Handle of resource.
824  * @param obsIdList List of observation ids that need to be notified.
825  * @param numberOfIds Number of observation ids included in obsIdList.
826  * @param notificationJSONPayload JSON encoded payload to send in notification.
827  * @param qos Desired quality of service of the observation notifications.
828  * NOTE: The memory for obsIdList and notificationJSONPayload is managed by the
829  * entity invoking the API. The maximum size of the notification is 1015 bytes
830  * for non-Arduino platforms. For Arduino the maximum size is 247 bytes.
831  *
832  * @return ::OC_STACK_OK on success, some other value upon failure.
833  */
834 OCStackResult
835 OCNotifyListOfObservers (OCResourceHandle handle,
836                             OCObservationId  *obsIdList,
837                             uint8_t          numberOfIds,
838                             const char    *notificationJSONPayload,
839                             OCQualityOfService qos);
840
841
842 /**
843  * Send a response to a request.
844  * The response can be a normal, slow, or block (i.e. a response that
845  * is too large to be sent in a single PDU and must span multiple transmissions).
846  *
847  * @param response Pointer to structure that contains response parameters.
848  *
849  * @return ::OC_STACK_OK on success, some other value upon failure.
850  */
851 OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
852
853 /**
854  * Cancel a response.  Applies to a block response.
855  *
856  * @param responseHandle Response handle set by stack in OCServerResponse after
857  *                       OCDoResponse is called.
858  *
859  * @return ::OC_STACK_OK on success, some other value upon failure.
860  */
861 OCStackResult OCCancelResponse(OCResponseHandle responseHandle);
862
863 //Utility methods
864
865 /**
866  * This method is used to retrieved the IPv4 address from OCDev address
867  * data structure.
868  *
869  * @param ipAddr OCDevAddr address.
870  * @param a first byte of IPv4 address.
871  * @param b second byte of IPv4 address.
872  * @param c third byte of IPv4 address.
873  * @param d fourth byte of IPv4 address.
874  * @return ::OC_STACK_OK on success, some other value upon failure.
875  */
876 int32_t OCDevAddrToIPv4Addr(OCDevAddr *ipAddr, uint8_t *a, uint8_t *b,
877             uint8_t *c, uint8_t *d );
878
879 /**
880  * This method is used to retrieve the port number from OCDev address
881  * data structure.
882  *
883  * @param ipAddr OCDevAddr address.
884  * @param port Port number.
885  * @return ::OC_STACK_OK on success, some other value upon failure.
886  */
887 int32_t OCDevAddrToPort(OCDevAddr *ipAddr, uint16_t *port);
888
889 #ifdef __cplusplus
890 }
891 #endif // __cplusplus
892
893 #endif /* OCSTACK_H_ */
894
895