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