Implemented libcoap's tinyDTLS interface
[contrib/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 "ocsocket.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 #define OC_WELL_KNOWN_QUERY                  "coap://224.0.1.187:5683/oc/core"
38 #define OC_EXPLICIT_DEVICE_DISCOVERY_URI     "coap://224.0.1.187:5683/oc/core?rt=core.led"
39 #define OC_MULTICAST_PREFIX                  "coap://224.0.1.187:5683"
40
41 #define USE_RANDOM_PORT (0)
42 #ifdef WITH_PRESENCE
43 #define OC_DEFAULT_PRESENCE_TTL (60)
44 #define OC_PRESENCE_URI                      "/oc/presence"
45 extern uint8_t PresenceTimeOutSize; // length of PresenceTimeOut - 1
46 extern uint32_t PresenceTimeOut[];
47 #endif
48 //-----------------------------------------------------------------------------
49 // Typedefs
50 //-----------------------------------------------------------------------------
51
52 /**
53  * OC Virtual resources supported by every OC device
54  */
55 typedef enum {
56     OC_WELL_KNOWN_URI= 0,       // "/oc/core"
57     OC_DEVICE_URI,              // "/oc/core/d"
58     OC_RESOURCE_TYPES_URI,      // "/oc/core/d/type"
59     #ifdef WITH_PRESENCE
60     OC_PRESENCE,                // "/oc/presence"
61     #endif
62     OC_MAX_VIRTUAL_RESOURCES    // Max items in the list
63 } OCVirtualResources;
64
65 /**
66  * Standard RESTful HTTP Methods
67  */
68 typedef enum {
69     OC_REST_NOMETHOD    = 0,
70     OC_REST_GET         = (1 << 0),     // Read
71     OC_REST_PUT         = (1 << 1),     // Write
72     OC_REST_POST        = (1 << 2),     // Update
73     OC_REST_DELETE      = (1 << 3),     // Delete
74     // Register observe request for most up date notifications ONLY.
75     OC_REST_OBSERVE     = (1 << 4),
76     // Register observe request for all notifications, including stale notifications.
77     OC_REST_OBSERVE_ALL = (1 << 5),
78     // Deregister observation, intended for internal use
79     OC_REST_CANCEL_OBSERVE = (1 << 6),
80     #ifdef WITH_PRESENCE
81     // Subscribe for all presence notifications of a particular resource.
82     OC_REST_PRESENCE    = (1 << 7)
83     #endif
84 } OCMethod;
85
86 /**
87  * Host Mode of Operation
88  */
89 typedef enum {
90     OC_CLIENT = 0,
91     OC_SERVER,
92     OC_CLIENT_SERVER
93 } OCMode;
94
95 extern OCMode myStackMode;
96 /**
97  * Quality of Service
98  */
99 typedef enum {
100     OC_LOW_QOS = 0,
101     OC_MEDIUM_QOS,
102     OC_HIGH_QOS,
103     OC_NA_QOS // No Quality is defined, let the stack decide
104 } OCQualityOfService;
105
106 /**
107  * Resource Properties
108  *
109  * OC_ACTIVE       - When this bit is set, the resource is initialized, otherwise the resource
110  *                   is 'inactive'. 'inactive' signifies that the resource has been marked for
111  *                   deletion or is already deleted.
112  * OC_DISCOVERABLE - When this bit is set, the resource is allowed to be discovered by clients.
113  * OC_OBSERVABLE   - When this bit is set, the resource is allowed to be observed by clients.
114  * OC_SLOW         - When this bit is set, the resource has been marked as 'slow'. 'slow' signifies
115  *                   that responses from this resource can expect delays in processing its
116  *                   requests from clients.
117  * OC_SECURE       - When this bit is set, the resource is a secure resource.
118  */
119 typedef enum {
120     OC_ACTIVE       = (1 << 0),
121     OC_DISCOVERABLE = (1 << 1),
122     OC_OBSERVABLE   = (1 << 2),
123     OC_SLOW         = (1 << 3),
124     OC_SECURE       = (1 << 4)
125 } OCResourceProperty;
126
127 /**
128  * Transport Protocol IDs
129  */
130 typedef enum {
131     OC_INVALID_ID   = (1 << 0),
132     OC_COAP_ID      = (1 << 1)
133 } OCTransportProtocolID;
134
135 /**
136  * Declares Stack Results & Errors
137  */
138 typedef enum {
139     /* Success status code - START HERE */
140     OC_STACK_OK = 0,
141     OC_STACK_RESOURCE_CREATED,
142     OC_STACK_RESOURCE_DELETED,
143     /* Success status code - END HERE */
144     /* Error status code - START HERE */
145     OC_STACK_INVALID_URI,
146     OC_STACK_INVALID_QUERY,
147     OC_STACK_INVALID_IP,
148     OC_STACK_INVALID_PORT,
149     OC_STACK_INVALID_CALLBACK,
150     OC_STACK_INVALID_METHOD,
151     OC_STACK_INVALID_PARAM,
152     OC_STACK_INVALID_OBSERVE_PARAM,
153     OC_STACK_NO_MEMORY,
154     OC_STACK_COMM_ERROR,
155     OC_STACK_NOTIMPL,
156     OC_STACK_NO_RESOURCE,               /* resource not found */
157     OC_STACK_RESOURCE_ERROR,            /* ex: not supported method or interface */
158     OC_STACK_SLOW_RESOURCE,
159     OC_STACK_NO_OBSERVERS,              /* resource has no registered observers */
160     OC_STACK_OBSERVER_NOT_FOUND,
161     OC_STACK_OBSERVER_NOT_ADDED,
162     OC_STACK_OBSERVER_NOT_REMOVED,
163     #ifdef WITH_PRESENCE
164     OC_STACK_PRESENCE_STOPPED,
165     OC_STACK_PRESENCE_DO_NOT_HANDLE,
166     #endif
167     OC_STACK_INVALID_OPTION,
168     OC_STACK_MALFORMED_RESPONSE,        /* the remote reply contained malformed data */
169     OC_STACK_ERROR
170     /* Error status code - END HERE */
171 } OCStackResult;
172
173 /**
174  * Handle to an @ref OCDoResource invocation.
175  */
176 typedef void * OCDoHandle;
177
178 /**
179  * Handle to an OCResource object owned by the OCStack.
180  */
181 typedef void * OCResourceHandle;
182
183 /**
184  * Unique identifier for each observation request. Used when observations are
185  * registered or deregistering. Used by entity handler to signal specific
186  * observers to be notified of resource changes.
187  * There can be maximum of 256 observations per server.
188  */
189 typedef uint8_t OCObservationId;
190
191 /**
192  * Action associated with observation
193  */
194 typedef enum {
195     OC_OBSERVE_REGISTER = 0,
196     OC_OBSERVE_DEREGISTER = 1,
197     OC_OBSERVE_NO_OPTION = 2
198 } OCObserveAction;
199
200 typedef struct {
201     // Action associated with observation request
202     OCObserveAction action;
203     // Identifier for observation being registered/deregistered
204     OCObservationId obsId;
205 } OCObservationInfo;
206
207 // following structure will be used to define the vendor specific header options to be included
208 // in communication packets
209
210 typedef struct OCHeaderOption {
211     // The protocol ID this option applies to
212     OCTransportProtocolID protocolID;
213     // The header option ID which will be added to communication packets
214     uint16_t optionID;
215     // its length   191
216     uint16_t optionLength;
217     // pointer to its data
218     uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
219 } OCHeaderOption;
220
221 /**
222  * Incoming requests handled by the server. Requests are passed in as a parameter to the @ref OCEntityHandler callback API.
223  * @brief The @ref OCEntityHandler callback API must be implemented in the application in order to receive these requests.
224  */
225 typedef struct {
226     // Associated resource
227     OCResourceHandle resource;
228     // resource query send by client
229     unsigned char * query;
230     // the REST method retrieved from received request PDU
231     OCMethod method;
232     // reqJSON is retrieved from the payload of the received request PDU
233     unsigned const char * reqJSONPayload;
234     // resJSON is allocated in the stack and will be used by entity handler to fill in its response
235     unsigned char * resJSONPayload;
236     // Length of maximum allowed response
237     uint16_t resJSONPayloadLen;
238     // Information associated with observation - valid only when OCEntityHandler
239     // flag includes OC_OBSERVE_FLAG
240     OCObservationInfo *obsInfo;
241     // An array of the received vendor specific header options
242     uint8_t numRcvdVendorSpecificHeaderOptions;
243     OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
244     // An array of the vendor specific header options the entity handler wishes to use in response
245     uint8_t numSendVendorSpecificHeaderOptions;
246     OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
247     // URI of new resource that entity handler might create
248     unsigned char *newResourceUri;
249
250 }OCEntityHandlerRequest;
251
252 /**
253  * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
254  */
255 typedef struct {
256     // the is the result of our stack, OCStackResult should contain coap/other error codes;
257     OCStackResult result;
258     // Address of remote server
259     OCDevAddr * addr;
260     // If associated with observe, this will represent the sequence of notifications from server.
261     uint32_t sequenceNumber;
262     // resJSONPayload is retrieved from the payload of the received request PDU
263     unsigned  const char * resJSONPayload;
264     // An array of the received vendor specific header options
265     uint8_t numRcvdVendorSpecificHeaderOptions;
266     OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
267 }OCClientResponse;
268
269 typedef enum {
270     OC_INIT_FLAG    = (1 << 0),
271     OC_REQUEST_FLAG = (1 << 1),
272     OC_OBSERVE_FLAG = (1 << 2)
273 } OCEntityHandlerFlag; //entity_handler_flag_t ;
274
275 // possible returned values from client application
276 typedef enum {
277     OC_STACK_DELETE_TRANSACTION = 0,
278     OC_STACK_KEEP_TRANSACTION
279 } OCStackApplicationResult;
280
281 //-----------------------------------------------------------------------------
282 // Callback function definitions
283 //-----------------------------------------------------------------------------
284
285 /**
286  * Client applications implement this callback to consume responses received from Servers.
287  */
288 typedef OCStackApplicationResult (* OCClientResponseHandler)(void *context, OCDoHandle handle,
289     OCClientResponse * clientResponse);
290
291 /**
292  * Client applications using a context pointer implement this callback to delete the
293  * context upon removal of the callback/context pointer from the internal callback-list
294  */
295 typedef void (* OCClientContextDeleter)(void *context);
296
297 /*
298  * This info is passed from application to OC Stack when initiating a request to Server
299  */
300 typedef struct {
301     void *context;
302     OCClientResponseHandler cb;
303     OCClientContextDeleter cd;
304 } OCCallbackData;
305
306 /**
307  * Possible returned values from entity handler
308  */
309 typedef enum {
310     OC_EH_OK = 0,
311     OC_EH_ERROR,
312     OC_EH_RESOURCE_CREATED,
313     OC_EH_RESOURCE_DELETED,
314     OC_EH_FORBIDDEN
315 } OCEntityHandlerResult;
316
317 /**
318  * Application server implementations must implement this callback to consume requests OTA.
319  * Entity handler callback needs to fill the resPayload of the entityHandlerRequest.
320  */
321 typedef OCEntityHandlerResult (*OCEntityHandler)
322 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest);
323
324 /**
325  * Device Entity handler need to use this call back instead of OCEntityHandler
326  */
327 typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
328 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri);
329
330 //-----------------------------------------------------------------------------
331 // Function prototypes
332 //-----------------------------------------------------------------------------
333
334 /**
335  * Initialize the OC Stack.  Must be called prior to starting the stack.
336  *
337  * @param ipAddr
338  *     IP Address of host device
339  * @param port
340  *     Port of host device
341  * @param mode
342  *     Host device is client, server, or client-server
343  *
344  * @return
345  *     OC_STACK_OK    - no errors
346  *     OC_STACK_ERROR - stack init error
347  */
348 OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
349
350 /**
351  * Stop the OC stack.  Use for a controlled shutdown.
352  *
353  * Note: OCStop() performs operations similar to OCStopPresence(), as well as OCDeleteResource() on
354  * all resources this server is hosting. OCDeleteResource() performs operations similar to
355  * OCNotifyAllObservers() to notify all client observers that the respective resource is being
356  * deleted.
357  *
358  * @return
359  *     OC_STACK_OK    - no errors
360  *     OC_STACK_ERROR - stack not initialized
361  */
362 OCStackResult OCStop();
363
364 /**
365  * Called in main loop of OC client or server.  Allows low-level processing of
366  * stack services.
367  *
368  * @return
369  *     OC_STACK_OK    - no errors
370  *     OC_STACK_ERROR - stack process error
371  */
372 OCStackResult OCProcess();
373
374 /**
375  * Discover or Perform requests on a specified resource (specified by that Resource's respective URI).
376  *
377  * @param handle             - @ref OCDoHandle to refer to the request sent out on behalf of calling this API.
378  * @param method             - @ref OCMethod to perform on the resource
379  * @param requiredUri        - URI of the resource to interact with
380  * @param referenceUri       - URI of the reference resource
381  * @param request            - JSON encoded request
382  * @param qos                - quality of service
383  * @param clientApplicationCB- asynchronous callback function that is invoked
384  *                             by the stack when discovery or resource interaction is complete
385  * @param options            - The address of an array containing the vendor specific
386  *                             header options to be sent with the request
387  * @param numOptions         - Number of header options to be included
388  *
389  * @return
390  *     OC_STACK_OK               - no errors
391  *     OC_STACK_INVALID_CALLBACK - invalid callback function pointer
392  *     OC_STACK_INVALID_METHOD   - invalid resource method
393  *     OC_STACK_INVALID_URI      - invalid required or reference URI
394  */
395 OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char  *requiredUri, const char  *referenceUri,
396                 const char *request, OCQualityOfService qos, OCCallbackData *cbData, OCHeaderOption * options,
397                 uint8_t numOptions);
398
399 /**
400  * Cancel a request associated with a specific @ref OCDoResource invocation.
401  *
402  * @param handle - Used to identify a specific OCDoResource invocation.
403  * @param qos    - used to specify Quality of Service (read below for more info)
404  * @param options- used to specify vendor specific header options when sending
405  *                 explicit observe cancellation
406  * @param numOptions- Number of header options to be included
407  *
408  * @return
409  *     OC_STACK_OK               - No errors; Success
410  *     OC_STACK_INVALID_PARAM    - The handle provided is invalid.
411  */
412 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
413         uint8_t numOptions);
414
415 #ifdef WITH_PRESENCE
416 /**
417  * When operating in @ref OCServer or @ref OCClientServer mode, this API will start sending out
418  * presence notifications to clients via multicast. Once this API has been called with a success,
419  * clients may query for this server's presence and this server's stack will respond via multicast.
420  *
421  * Server can call this function when it comes online for the first time, or when it comes back
422  * online from offline mode, or when it re enters network.
423  *
424  * @param ttl - Time To Live in seconds
425  * Note: If ttl is '0', then the default stack value will be used (60 Seconds).
426  *
427  * @return
428  *     OC_STACK_OK      - No errors; Success
429  */
430 OCStackResult OCStartPresence(const uint32_t ttl);
431
432 /**
433  * When operating in @ref OCServer or @ref OCClientServer mode, this API will stop sending out
434  * presence notifications to clients via multicast. Once this API has been called with a success,
435  * this server's stack will not respond to clients querying for this server's presence.
436  *
437  * Server can call this function when it is terminating, going offline, or when going
438  * away from network.
439  *
440  * @return
441  *     OC_STACK_OK      - No errors; Success
442  */
443
444 OCStackResult OCStopPresence();
445 #endif
446
447
448 /**
449  * Set default device entity handler
450  *
451  * @param entityHandler - entity handler function that is called by ocstack to handle requests for
452  *                        any undefined resources or default actions.
453  *                        if NULL is passed it removes the device default entity handler.
454  *
455  * @return
456  *     OC_STACK_OK    - no errors
457  *     OC_STACK_ERROR - stack process error
458  */
459 OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler);
460
461 /**
462  * Create a resource.
463  *
464  * @param handle - pointer to handle to newly created resource.  Set by ocstack.  Used to refer to resource
465  * @param resourceTypeName - name of resource type.  Example: "core.led"
466  * @param resourceInterfaceName - name of resource interface.  Example: "core.rw"
467  * @param uri - URI of the resource.  Example:  "/a/led"
468  * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
469  *                        NULL for default entity handler
470  * @param resourceProperties - properties supported by resource.  Example: OC_DISCOVERABLE|OC_OBSERVABLE
471  *
472  * @return
473  *     OC_STACK_OK    - no errors
474  *     OC_STACK_ERROR - stack process error
475  */
476 OCStackResult OCCreateResource(OCResourceHandle *handle,
477                                const char *resourceTypeName,
478                                const char *resourceInterfaceName,
479                                const char *uri,
480                                OCEntityHandler entityHandler,
481                                uint8_t resourceProperties);
482
483 /**
484  * Add a resource to a collection resource.
485  *
486  * @param collectionHandle - handle to the collection resource
487  * @param resourceHandle - handle to resource to be added to the collection resource
488  *
489  * @return
490  *     OC_STACK_OK    - no errors
491  *     OC_STACK_ERROR - stack process error
492  *     OC_STACK_INVALID_PARAM - invalid collectionhandle
493  */
494 OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
495
496 /**
497  * Remove a resource from a collection resource.
498  *
499  * @param collectionHandle - handle to the collection resource
500  * @param resourceHandle - handle to resource to be removed from the collection resource
501  *
502  * @return
503  *     OC_STACK_OK    - no errors
504  *     OC_STACK_ERROR - stack process error
505  *     OC_STACK_INVALID_PARAM - invalid collectionhandle
506  */
507 OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
508
509 /**
510  * Bind a resourcetype to a resource.
511  *
512  * @param handle - handle to the resource
513  * @param resourceTypeName - name of resource type.  Example: "core.led"
514  *
515  * @return
516  *     OC_STACK_OK    - no errors
517  *     OC_STACK_ERROR - stack process error
518  */
519 OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
520                                            const char *resourceTypeName);
521 /**
522  * Bind a resource interface to a resource.
523  *
524  * @param handle - handle to the resource
525  * @param resourceInterfaceName - name of resource interface.  Example: "core.rw"
526  *
527  * @return
528  *     OC_STACK_OK    - no errors
529  *     OC_STACK_ERROR - stack process error
530  */
531 OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
532                                                 const char *resourceInterfaceName);
533
534 /**
535  * Bind an entity handler to the resource.
536  *
537  * @param handle - handle to the resource that the contained resource is to be bound
538  * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
539  * @return
540  *     OC_STACK_OK    - no errors
541  *     OC_STACK_ERROR - stack process error
542  */
543 OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler);
544
545 /**
546  * Get the number of resources that have been created in the stack.
547  *
548  * @param numResources - pointer to count variable
549  *
550  * @return
551  *     OC_STACK_OK    - no errors
552  *     OC_STACK_ERROR - stack process error
553
554  */
555 OCStackResult OCGetNumberOfResources(uint8_t *numResources);
556
557 /**
558  * Get a resource handle by index.
559  *
560  * @param index - index of resource, 0 to Count - 1
561  *
562  * @return
563  *    Resource handle - if found
564  *    NULL - if not found
565  */
566 OCResourceHandle OCGetResourceHandle(uint8_t index);
567
568 /**
569  * Delete resource specified by handle.  Deletes resource and all resourcetype and resourceinterface
570  * linked lists.
571  *
572  * Note: OCDeleteResource() performs operations similar to OCNotifyAllObservers() to notify all
573  * client observers that "this" resource is being deleted.
574  *
575  * @param handle - handle of resource to be deleted
576  *
577  * @return
578  *     OC_STACK_OK    - no errors
579  *     OC_STACK_ERROR - stack process error
580  */
581 OCStackResult OCDeleteResource(OCResourceHandle handle);
582
583 /**
584  * Get the URI of the resource specified by handle.
585  *
586  * @param handle - handle of resource
587  * @return
588  *    URI string - if resource found
589  *    NULL - resource not found
590  */
591 const char *OCGetResourceUri(OCResourceHandle handle);
592
593 /**
594  * Get the properties of the resource specified by handle.
595  * NOTE: that after a resource is created, the OC_ACTIVE property is set
596  * for the resource by the stack.
597  *
598  * @param handle - handle of resource
599  * @return
600  *    property bitmap - if resource found
601  *    NULL - resource not found
602  */
603 uint8_t OCGetResourceProperties(OCResourceHandle handle);
604
605 /**
606  * Get the number of resource types of the resource.
607  *
608  * @param handle - handle of resource
609  * @param numResourceTypes - pointer to count variable
610  *
611  * @return
612  *     OC_STACK_OK    - no errors
613  *     OC_STACK_ERROR - stack process error
614  */
615 OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
616
617 /**
618  * Get name of resource type of the resource.
619  *
620  * @param handle - handle of resource
621  * @param index - index of resource, 0 to Count - 1
622  *
623  * @return
624  *    resource type name - if resource found
625  *    NULL - resource not found
626  */
627 const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
628
629 /**
630  * Get the number of resource interfaces of the resource.
631  *
632  * @param handle - handle of resource
633  * @param numResources - pointer to count variable
634  *
635  * @return
636  *     OC_STACK_OK    - no errors
637  *     OC_STACK_ERROR - stack process error
638
639  */
640 OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle, uint8_t *numResourceInterfaces);
641
642 /**
643  * Get name of resource interface of the resource.
644  *
645  * @param handle - handle of resource
646  * @param index - index of resource, 0 to Count - 1
647  *
648  * @return
649  *    resource interface name - if resource found
650  *    NULL - resource not found
651  */
652 const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
653
654 /**
655  * Get methods of resource interface of the resource.
656  *
657  * @param handle - handle of resource
658  * @param index - index of resource, 0 to Count - 1
659  *
660  * @return
661  *    allowed methods - if resource found
662  *    NULL - resource not found
663  */
664 uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
665
666 /**
667  * Get resource handle from the collection resource by index.
668  *
669  * @param collectionHandle - handle of collection resource
670  * @param index - index of contained resource, 0 to Count - 1
671  *
672  * @return
673  *    handle to contained resource - if resource found
674  *    NULL - resource not found
675  */
676 OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle, uint8_t index);
677
678 /**
679  * Get the entity handler for a resource.
680  *
681  * @param handle - handle of resource
682  *
683  * @return
684  *    entity handler - if resource found
685  *    NULL - resource not found
686  */
687 OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
688
689 /**
690  * Notify all registered observers that the resource representation has
691  * changed. If observation includes a query the client is notified only
692  * if the query is valid after the resource representation has changed.
693  *
694  * @param handle - handle of resource
695  *
696  * @return
697  *     OC_STACK_OK    - no errors
698  *     OC_STACK_NO_RESOURCE - invalid resource handle
699  *     OC_STACK_NO_OBSERVERS - no more observers intrested in resource
700  */
701 OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
702
703 /**
704  * Notify specific observers with updated value of representation.
705  * Before this API is invoked by entity handler it has finished processing
706  * queries for the associated observers.
707  *
708  * @param handle - handle of resource
709  * @param obsIdList - list of observation ids that need to be notified
710  * @param numberOfIds - number of observation ids included in obsIdList
711  * @param notificationJSONPayload - JSON encoded payload to send in notification
712  * NOTE: The memory for obsIdList and notificationJSONPayload is managed by the
713  * entity invoking the API. The maximum size of the notification is 1015 bytes
714  * for non-Arduino platforms. For Arduino the maximum size is 247 bytes.
715  *
716  * @return
717  *     OC_STACK_OK    - no errors
718  *     OC_STACK_NO_RESOURCE - invalid resource handle
719  */
720 OCStackResult
721 OCNotifyListOfObservers (OCResourceHandle handle,
722                          OCObservationId  *obsIdList,
723                          uint8_t          numberOfIds,
724                          unsigned char    *notificationJSONPayload,
725                          OCQualityOfService qos);
726
727 #ifdef __cplusplus
728 }
729 #endif // __cplusplus
730
731 #endif /* OCSTACK_H_ */