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