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