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