Fixed RI-CA review integration changes
[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 <stdint.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
38 #define OC_WELL_KNOWN_QUERY                  "224.0.1.187:5683/oc/core"
39 #define OC_EXPLICIT_DEVICE_DISCOVERY_URI     "224.0.1.187:5683/oc/core/d?rt=core.led"
40 #define OC_MULTICAST_PREFIX                  "224.0.1.187:5683"
41 #define OC_MULTICAST_IP                      "224.0.1.187"
42
43 #ifdef WITH_PRESENCE
44 #define OC_DEFAULT_PRESENCE_TTL (60)
45 #define OC_PRESENCE_URI                      "/oc/presence"
46 #endif
47
48 //-----------------------------------------------------------------------------
49 // Typedefs
50 //-----------------------------------------------------------------------------
51
52
53 /**
54  * Data structure to encapsulate IPv4/IPv6/Contiki/lwIP device addresses
55  *
56  */
57 typedef struct OCDevAddr
58 {
59     uint32_t     size;                    /**< length of the address stored in addr field. */
60     uint8_t      addr[DEV_ADDR_SIZE_MAX]; /**< device address. */
61 } OCDevAddr;
62
63 /**
64  * OC Virtual resources supported by every OC device
65  */
66 typedef enum
67 {
68     OC_WELL_KNOWN_URI= 0,       // "/oc/core"
69     OC_DEVICE_URI,              // "/oc/core/d"
70     OC_RESOURCE_TYPES_URI,      // "/oc/core/d/type"
71     #ifdef WITH_PRESENCE
72     OC_PRESENCE,                // "/oc/presence"
73     #endif
74     OC_MAX_VIRTUAL_RESOURCES    // Max items in the list
75 } OCVirtualResources;
76
77 /**
78  * Standard RESTful HTTP Methods
79  */
80 typedef enum
81 {
82     OC_REST_NOMETHOD    = 0,
83     OC_REST_GET         = (1 << 0),     // Read
84     OC_REST_PUT         = (1 << 1),     // Write
85     OC_REST_POST        = (1 << 2),     // Update
86     OC_REST_DELETE      = (1 << 3),     // Delete
87     // Register observe request for most up date notifications ONLY.
88     OC_REST_OBSERVE     = (1 << 4),
89     // Register observe request for all notifications, including stale notifications.
90     OC_REST_OBSERVE_ALL = (1 << 5),
91     // Deregister observation, intended for internal use
92     OC_REST_CANCEL_OBSERVE = (1 << 6),
93     #ifdef WITH_PRESENCE
94     // Subscribe for all presence notifications of a particular resource.
95     OC_REST_PRESENCE    = (1 << 7)
96     #endif
97 } OCMethod;
98
99 /**
100  * Host Mode of Operation
101  */
102 typedef enum
103 {
104     OC_CLIENT = 0,
105     OC_SERVER,
106     OC_CLIENT_SERVER
107 } OCMode;
108
109 /**
110  * Quality of Service
111  */
112 typedef enum
113 {
114     OC_LOW_QOS = 0,
115     OC_MEDIUM_QOS,
116     OC_HIGH_QOS,
117     OC_NA_QOS // No Quality is defined, let the stack decide
118 } OCQualityOfService;
119
120 /**
121  * Resource Properties
122  *
123  * OC_ACTIVE       - When this bit is set, the resource is initialized, otherwise the resource
124  *                   is 'inactive'. 'inactive' signifies that the resource has been marked for
125  *                   deletion or is already deleted.
126  * OC_DISCOVERABLE - When this bit is set, the resource is allowed to be discovered by clients.
127  * OC_OBSERVABLE   - When this bit is set, the resource is allowed to be observed by clients.
128  * OC_SLOW         - When this bit is set, the resource has been marked as 'slow'. 'slow' signifies
129  *                   that responses from this resource can expect delays in processing its
130  *                   requests from clients.
131  * OC_SECURE       - When this bit is set, the resource is a secure resource.
132  */
133 typedef enum
134 {
135     OC_ACTIVE       = (1 << 0),
136     OC_DISCOVERABLE = (1 << 1),
137     OC_OBSERVABLE   = (1 << 2),
138     OC_SLOW         = (1 << 3),
139     OC_SECURE       = (1 << 4)
140 } OCResourceProperty;
141
142 /**
143  * Transport Protocol IDs
144  */
145 typedef enum
146 {
147     OC_INVALID_ID   = (1 << 0),
148     OC_COAP_ID      = (1 << 1)
149 } OCTransportProtocolID;
150
151 /**
152  * Adaptor types
153  */
154 typedef enum
155 {
156     OC_ETHERNET = 0,
157     OC_WIFI,
158     OC_EDR,
159     OC_LE,
160     OC_ALL //Multicast message: send over all the interfaces.
161 } OCConnectivityType;
162
163 /**
164  * Declares Stack Results & Errors
165  */
166 typedef enum
167 {
168     /* Success status code - START HERE */
169     OC_STACK_OK = 0,
170     OC_STACK_RESOURCE_CREATED,
171     OC_STACK_RESOURCE_DELETED,
172     OC_STACK_CONTINUE,
173     /* Success status code - END HERE */
174     /* Error status code - START HERE */
175     OC_STACK_INVALID_URI = 20,
176     OC_STACK_INVALID_QUERY,
177     OC_STACK_INVALID_IP,
178     OC_STACK_INVALID_PORT,
179     OC_STACK_INVALID_CALLBACK,
180     OC_STACK_INVALID_METHOD,
181     OC_STACK_INVALID_PARAM,
182     OC_STACK_INVALID_OBSERVE_PARAM,
183     OC_STACK_NO_MEMORY,
184     OC_STACK_COMM_ERROR,
185     OC_STACK_TIMEOUT,
186     OC_STACK_ADAPTER_NOT_ENABLED,
187     OC_STACK_NOTIMPL,
188     OC_STACK_NO_RESOURCE,               /* resource not found */
189     OC_STACK_RESOURCE_ERROR,            /* ex: not supported method or interface */
190     OC_STACK_SLOW_RESOURCE,
191     OC_STACK_NO_OBSERVERS,              /* resource has no registered observers */
192     OC_STACK_OBSERVER_NOT_FOUND,
193     OC_STACK_VIRTUAL_DO_NOT_HANDLE,
194     OC_STACK_INVALID_OPTION,
195     OC_STACK_MALFORMED_RESPONSE,        /* the remote reply contained malformed data */
196     OC_STACK_PERSISTENT_BUFFER_REQUIRED,
197     OC_STACK_INVALID_REQUEST_HANDLE,
198     OC_STACK_INVALID_DEVICE_INFO,
199     OC_STACK_INVALID_JSON,
200     /* NOTE: Insert all new error codes here!*/
201     #ifdef WITH_PRESENCE
202     OC_STACK_PRESENCE_STOPPED = 128,
203     OC_STACK_PRESENCE_TIMEOUT,
204     OC_STACK_PRESENCE_DO_NOT_HANDLE,
205     #endif
206     OC_STACK_ERROR = 255
207     /* Error status code - END HERE */
208 } OCStackResult;
209
210 /**
211  * Handle to an @ref OCDoResource invocation.
212  */
213 typedef void * OCDoHandle;
214
215 /**
216  * Handle to an OCResource object owned by the OCStack.
217  */
218 typedef void * OCResourceHandle;
219
220 typedef void * OCRequestHandle;
221 typedef void * OCResponseHandle;
222
223 /**
224  * Unique identifier for each observation request. Used when observations are
225  * registered or deregistering. Used by entity handler to signal specific
226  * observers to be notified of resource changes.
227  * There can be maximum of 256 observations per server.
228  */
229 typedef uint8_t OCObservationId;
230
231 /**
232  * Action associated with observation
233  */
234 typedef enum
235 {
236     OC_OBSERVE_REGISTER = 0,
237     OC_OBSERVE_DEREGISTER = 1,
238     OC_OBSERVE_NO_OPTION = 2
239 } OCObserveAction;
240
241 typedef struct
242 {
243     // Action associated with observation request
244     OCObserveAction action;
245     // Identifier for observation being registered/deregistered
246     OCObservationId obsId;
247 } OCObservationInfo;
248
249 /**
250  * Possible returned values from entity handler
251  */
252 typedef enum
253 {
254     OC_EH_OK = 0,
255     OC_EH_ERROR,
256     OC_EH_RESOURCE_CREATED,
257     OC_EH_RESOURCE_DELETED,
258     OC_EH_SLOW,
259     OC_EH_FORBIDDEN
260 } OCEntityHandlerResult;
261
262 // following structure will be used to define the vendor specific header options to be included
263 // in communication packets
264
265 typedef struct OCHeaderOption
266 {
267     // The protocol ID this option applies to
268     OCTransportProtocolID protocolID;
269     // The header option ID which will be added to communication packets
270     uint16_t optionID;
271     // its length   191
272     uint16_t optionLength;
273     // pointer to its data
274     uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
275 } OCHeaderOption;
276
277 /**
278  * Incoming requests handled by the server. Requests are passed in as a parameter to the
279  * @ref OCEntityHandler callback API.
280  * @brief The @ref OCEntityHandler callback API must be implemented in the application in order
281  * to receive these requests.
282  */
283 typedef struct
284 {
285     // Associated resource
286     OCResourceHandle resource;
287     OCRequestHandle requestHandle;
288     // the REST method retrieved from received request PDU
289     OCMethod method;
290     // resource query send by client
291     char * query;
292     // Information associated with observation - valid only when OCEntityHandler
293     // flag includes OC_OBSERVE_FLAG
294     OCObservationInfo obsInfo;
295     // An array of the received vendor specific header options
296     uint8_t numRcvdVendorSpecificHeaderOptions;
297     OCHeaderOption * rcvdVendorSpecificHeaderOptions;
298     // reqJSON is retrieved from the payload of the received request PDU
299     char * reqJSONPayload;
300 } OCEntityHandlerRequest;
301
302 /**
303  * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
304  */
305 typedef struct
306 {
307     // Address of remote server
308     OCDevAddr * addr;
309     // Indicates adaptor type on which the response was received
310     OCConnectivityType connType;
311     // the is the result of our stack, OCStackResult should contain coap/other error codes;
312     OCStackResult result;
313     // If associated with observe, this will represent the sequence of notifications from server.
314     uint32_t sequenceNumber;
315     // resJSONPayload is retrieved from the payload of the received request PDU
316     const char * resJSONPayload;
317     // An array of the received vendor specific header options
318     uint8_t numRcvdVendorSpecificHeaderOptions;
319     OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
320 } OCClientResponse;
321
322 /**
323  * Following structure describes the device properties. All non-Null properties will be included
324  * in a device discovery request.
325  */
326 typedef struct
327 {
328     char *deviceName;
329     char *hostName;
330     char *deviceUUID;
331     char *contentType;
332     char *version;
333     char *manufacturerName;
334     char *manufacturerUrl;
335     char *modelNumber;
336     char *dateOfManufacture;
337     char *platformVersion;
338     char *firmwareVersion;
339     char *supportUrl;
340 } OCDeviceInfo;
341
342 typedef struct
343 {
344     // Request handle is passed to server via the entity handler for each incoming request.
345     // Stack assigns when request is received, server sets to indicate what request response is for
346     OCRequestHandle requestHandle;
347     // New handle for tracking block (or slow) response.  Stack assigns, server uses for subsequent calls
348     OCResponseHandle  *responseHandle;
349     // Resource handle
350     OCResourceHandle resourceHandle;
351     // Allow the entity handler to pass a result with the response
352     OCEntityHandlerResult  ehResult;
353     // this is the pointer to server payload data to be transferred
354     char *payload;
355     // size of server payload data.  I don't think we should rely on null terminated data for size
356     uint16_t payloadSize;
357     // An array of the vendor specific header options the entity handler wishes to use in response
358     uint8_t numSendVendorSpecificHeaderOptions;
359     OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
360     // URI of new resource that entity handler might create
361     char resourceUri[MAX_URI_LENGTH];
362     // Server sets to true for persistent response buffer, false for non-persistent response buffer
363     uint8_t persistentBufferFlag;
364 } OCEntityHandlerResponse;
365
366 typedef enum
367 {
368     OC_INIT_FLAG    = (1 << 0),
369     OC_REQUEST_FLAG = (1 << 1),
370     OC_OBSERVE_FLAG = (1 << 2)
371 } OCEntityHandlerFlag; //entity_handler_flag_t ;
372
373 // possible returned values from client application
374 typedef enum
375 {
376     OC_STACK_DELETE_TRANSACTION = 0,
377     OC_STACK_KEEP_TRANSACTION
378 } OCStackApplicationResult;
379
380 //-----------------------------------------------------------------------------
381 // Callback function definitions
382 //-----------------------------------------------------------------------------
383
384 /**
385  * Client applications implement this callback to consume responses received from Servers.
386  */
387 typedef OCStackApplicationResult (* OCClientResponseHandler)(void *context, OCDoHandle handle,
388     OCClientResponse * clientResponse);
389
390 /**
391  * Client applications using a context pointer implement this callback to delete the
392  * context upon removal of the callback/context pointer from the internal callback-list
393  */
394 typedef void (* OCClientContextDeleter)(void *context);
395
396 /*
397  * This info is passed from application to OC Stack when initiating a request to Server
398  */
399 typedef struct
400 {
401     void *context;
402     OCClientResponseHandler cb;
403     OCClientContextDeleter cd;
404 } OCCallbackData;
405
406 /**
407  * Application server implementations must implement this callback to consume requests OTA.
408  * Entity handler callback needs to fill the resPayload of the entityHandlerRequest.
409  */
410 typedef OCEntityHandlerResult (*OCEntityHandler)
411 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest);
412
413 /**
414  * Device Entity handler need to use this call back instead of OCEntityHandler
415  */
416 typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
417 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri);
418
419 //-----------------------------------------------------------------------------
420 // Function prototypes
421 //-----------------------------------------------------------------------------
422
423 /**
424  * Initialize the OC Stack.  Must be called prior to starting the stack.
425  *
426  * @param ipAddr
427  *     IP Address of host device. Deprecated parameter.
428  * @param port
429  *     Port of host device. Deprecated parameter.
430  * @param mode
431  *     Host device is client, server, or client-server
432  *
433  * @return
434  *     OC_STACK_OK    - no errors
435  *     OC_STACK_ERROR - stack init error
436  */
437 OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
438
439 /**
440  * Stop the OC stack.  Use for a controlled shutdown.
441  *
442  * Note: OCStop() performs operations similar to OCStopPresence(), as well as OCDeleteResource() on
443  * all resources this server is hosting. OCDeleteResource() performs operations similar to
444  * OCNotifyAllObservers() to notify all client observers that the respective resource is being
445  * deleted.
446  *
447  * @return
448  *     OC_STACK_OK    - no errors
449  *     OC_STACK_ERROR - stack not initialized
450  */
451 OCStackResult OCStop();
452
453 /**
454  * Called in main loop of OC client or server.  Allows low-level processing of
455  * stack services.
456  *
457  * @return
458  *     OC_STACK_OK    - no errors
459  *     OC_STACK_ERROR - stack process error
460  */
461 OCStackResult OCProcess();
462
463 /**
464  * Discover or Perform requests on a specified resource (specified by that Resource's respective
465  * URI).
466  *
467  * @param handle             - @ref OCDoHandle to refer to the request sent out on behalf of
468  *                             calling this API. This handle can be used to cancel this operation
469  *                             via the OCCancel API.
470  *                             Note: This reference is handled internally, and
471  *                             should not be free'd by the consumer.  A NULL handle is permitted
472  *                             in the event where the caller has no use for the return value.
473  * @param method             - @ref OCMethod to perform on the resource
474  * @param requiredUri        - URI of the resource to interact with
475  * @param referenceUri       - URI of the reference resource
476  * @param request            - JSON encoded request
477  * @param conType            - @ref OCConnectivityType type of connectivity indicating the
478  *                             interface. Example: OC_WIFI, OC_ETHERNET, OC_ALL
479  * @param qos                - quality of service. Note that if this API is called on a uri with
480  *                             the well-known multicast IP address, the qos will be forced to
481  *                             OC_LOW_QOS
482  *                             since it is impractical to send other QOS levels on such addresses.
483  * @param cbData             - asynchronous callback function that is invoked
484  *                             by the stack when discovery or resource interaction is complete
485  * @param options            - The address of an array containing the vendor specific
486  *                             header options to be sent with the request
487  * @param numOptions         - Number of header options to be included
488  *
489  * Note: Presence subscription amendments (ie. adding additional resource type filters by calling
490  * this API again) require the use of the same base URI as the original request to successfully
491  * amend the presence filters.
492  *
493  * @return
494  *     OC_STACK_OK               - no errors
495  *     OC_STACK_INVALID_CALLBACK - invalid callback function pointer
496  *     OC_STACK_INVALID_METHOD   - invalid resource method
497  *     OC_STACK_INVALID_URI      - invalid required or reference URI
498  *     OC_STACK_INVALID_QUERY    - number of resource types specified for filtering presence
499  *                                 notifications exceeds @ref MAX_PRESENCE_FILTERS.
500  */
501 OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri,
502             const char *referenceUri, const char *request, OCConnectivityType conType,
503             OCQualityOfService qos, OCCallbackData *cbData,
504             OCHeaderOption * options, uint8_t numOptions);
505
506 /**
507  * Cancel a request associated with a specific @ref OCDoResource invocation.
508  *
509  * @param handle - Used to identify a specific OCDoResource invocation.
510  * @param qos    - used to specify Quality of Service (read below for more info)
511  * @param options- used to specify vendor specific header options when sending
512  *                 explicit observe cancellation
513  * @param numOptions- Number of header options to be included
514  *
515  * @return
516  *     OC_STACK_OK               - No errors; Success
517  *     OC_STACK_INVALID_PARAM    - The handle provided is invalid.
518  */
519 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
520         uint8_t numOptions);
521
522 #ifdef WITH_PRESENCE
523 /**
524  * When operating in @ref OCServer or @ref OCClientServer mode, this API will start sending out
525  * presence notifications to clients via multicast. Once this API has been called with a success,
526  * clients may query for this server's presence and this server's stack will respond via multicast.
527  *
528  * Server can call this function when it comes online for the first time, or when it comes back
529  * online from offline mode, or when it re enters network.
530  *
531  * @param ttl - Time To Live in seconds
532  * Note: If ttl is '0', then the default stack value will be used (60 Seconds).
533  *
534  * @return
535  *     OC_STACK_OK      - No errors; Success
536  */
537 OCStackResult OCStartPresence(const uint32_t ttl);
538
539 /**
540  * When operating in @ref OCServer or @ref OCClientServer mode, this API will stop sending out
541  * presence notifications to clients via multicast. Once this API has been called with a success,
542  * this server's stack will not respond to clients querying for this server's presence.
543  *
544  * Server can call this function when it is terminating, going offline, or when going
545  * away from network.
546  *
547  * @return
548  *     OC_STACK_OK      - No errors; Success
549  */
550
551 OCStackResult OCStopPresence();
552 #endif
553
554
555 /**
556  * Set default device entity handler
557  *
558  * @param entityHandler - entity handler function that is called by ocstack to handle requests for
559  *                        any undefined resources or default actions.
560  *                        if NULL is passed it removes the device default entity handler.
561  *
562  * @return
563  *     OC_STACK_OK    - no errors
564  *     OC_STACK_ERROR - stack process error
565  */
566 OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler);
567
568 /**
569  * Set device information.
570  *
571  * @param deviceInfo - Structure passed by the server application containing
572  *                     the device information.
573  *
574  *
575  * @return
576  *     OC_STACK_OK              - no errors
577  *     OC_STACK_INVALID_PARAM   - invalid paramerter
578  *     OC_STACK_ERROR           - stack process error
579  */
580 OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
581
582 /**
583  * Create a resource.
584  *
585  * @param handle - pointer to handle to newly created resource.  Set by ocstack.  Used to refer to resource
586  * @param resourceTypeName - name of resource type.  Example: "core.led"
587  * @param resourceInterfaceName - name of resource interface.  Example: "core.rw"
588  * @param uri - URI of the resource.  Example:  "/a/led"
589  * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
590  *                        NULL for default entity handler
591  * @param resourceProperties - properties supported by resource.  Example: OC_DISCOVERABLE|OC_OBSERVABLE
592  *
593  * @return
594  *     OC_STACK_OK    - no errors
595  *     OC_STACK_ERROR - stack process error
596  */
597 OCStackResult OCCreateResource(OCResourceHandle *handle,
598                                const char *resourceTypeName,
599                                const char *resourceInterfaceName,
600                                const char *uri,
601                                OCEntityHandler entityHandler,
602                                uint8_t resourceProperties);
603
604 /**
605  * Create a resource. with host ip address for remote resource
606  *
607  * @param handle - pointer to handle to newly created resource.  Set by ocstack.
608  *                 Used to refer to resource
609  * @param resourceTypeName - name of resource type.  Example: "core.led"
610  * @param resourceInterfaceName - name of resource interface.  Example: "core.rw"
611  * @param host - HOST address of the remote resource.  Example:  "coap://xxx.xxx.xxx.xxx:xxxxx"
612  * @param uri - URI of the resource.  Example:  "/a/led"
613  * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
614  *                        NULL for default entity handler
615  * @param resourceProperties - properties supported by resource.
616  *                             Example: OC_DISCOVERABLE|OC_OBSERVABLE
617  *
618  * @return
619  *     OC_STACK_OK    - no errors
620  *     OC_STACK_ERROR - stack process error
621  */
622 OCStackResult OCCreateResourceWithHost(OCResourceHandle *handle,
623                                const char *resourceTypeName,
624                                const char *resourceInterfaceName,
625                                const char *host,
626                                const char *uri,
627                                OCEntityHandler entityHandler,
628                                uint8_t resourceProperties);
629
630 /**
631  * Add a resource to a collection resource.
632  *
633  * @param collectionHandle - handle to the collection resource
634  * @param resourceHandle - handle to resource to be added to the collection resource
635  *
636  * @return
637  *     OC_STACK_OK    - no errors
638  *     OC_STACK_ERROR - stack process error
639  *     OC_STACK_INVALID_PARAM - invalid collectionhandle
640  */
641 OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
642
643 /**
644  * Remove a resource from a collection resource.
645  *
646  * @param collectionHandle - handle to the collection resource
647  * @param resourceHandle - handle to resource to be removed from the collection resource
648  *
649  * @return
650  *     OC_STACK_OK    - no errors
651  *     OC_STACK_ERROR - stack process error
652  *     OC_STACK_INVALID_PARAM - invalid collectionhandle
653  */
654 OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
655
656 /**
657  * Bind a resourcetype to a resource.
658  *
659  * @param handle - handle to the resource
660  * @param resourceTypeName - name of resource type.  Example: "core.led"
661  *
662  * @return
663  *     OC_STACK_OK    - no errors
664  *     OC_STACK_ERROR - stack process error
665  */
666 OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
667                                            const char *resourceTypeName);
668 /**
669  * Bind a resource interface to a resource.
670  *
671  * @param handle - handle to the resource
672  * @param resourceInterfaceName - name of resource interface.  Example: "core.rw"
673  *
674  * @return
675  *     OC_STACK_OK    - no errors
676  *     OC_STACK_ERROR - stack process error
677  */
678 OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
679                                                 const char *resourceInterfaceName);
680
681 /**
682  * Bind an entity handler to the resource.
683  *
684  * @param handle - handle to the resource that the contained resource is to be bound
685  * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
686  * @return
687  *     OC_STACK_OK    - no errors
688  *     OC_STACK_ERROR - stack process error
689  */
690 OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler);
691
692 /**
693  * Get the number of resources that have been created in the stack.
694  *
695  * @param numResources - pointer to count variable
696  *
697  * @return
698  *     OC_STACK_OK    - no errors
699  *     OC_STACK_ERROR - stack process error
700
701  */
702 OCStackResult OCGetNumberOfResources(uint8_t *numResources);
703
704 /**
705  * Get a resource handle by index.
706  *
707  * @param index - index of resource, 0 to Count - 1
708  *
709  * @return
710  *    Resource handle - if found
711  *    NULL - if not found
712  */
713 OCResourceHandle OCGetResourceHandle(uint8_t index);
714
715 /**
716  * Delete resource specified by handle.  Deletes resource and all resourcetype and resourceinterface
717  * linked lists.
718  *
719  * Note: OCDeleteResource() performs operations similar to OCNotifyAllObservers() to notify all
720  * client observers that "this" resource is being deleted.
721  *
722  * @param handle - handle of resource to be deleted
723  *
724  * @return
725  *     OC_STACK_OK    - no errors
726  *     OC_STACK_ERROR - stack process error
727  */
728 OCStackResult OCDeleteResource(OCResourceHandle handle);
729
730 /**
731  * Get the URI of the resource specified by handle.
732  *
733  * @param handle - handle of resource
734  * @return
735  *    URI string - if resource found
736  *    NULL - resource not found
737  */
738 const char *OCGetResourceUri(OCResourceHandle handle);
739
740 /**
741  * Get the properties of the resource specified by handle.
742  * NOTE: that after a resource is created, the OC_ACTIVE property is set
743  * for the resource by the stack.
744  *
745  * @param handle - handle of resource
746  * @return
747  *    OCResourceProperty Bitmask
748  *    -1 if resource is not found
749  */
750 OCResourceProperty OCGetResourceProperties(OCResourceHandle handle);
751
752 /**
753  * Get the number of resource types of the resource.
754  *
755  * @param handle - handle of resource
756  * @param numResourceTypes - pointer to count variable
757  *
758  * @return
759  *     OC_STACK_OK    - no errors
760  *     OC_STACK_ERROR - stack process error
761  */
762 OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
763
764 /**
765  * Get name of resource type of the resource.
766  *
767  * @param handle - handle of resource
768  * @param index - index of resource, 0 to Count - 1
769  *
770  * @return
771  *    resource type name - if resource found
772  *    NULL - resource not found
773  */
774 const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
775
776 /**
777  * Get the number of resource interfaces of the resource.
778  *
779  * @param handle - handle of resource
780  * @param numResourceInterfaces - pointer to count variable
781  *
782  * @return
783  *     OC_STACK_OK    - no errors
784  *     OC_STACK_ERROR - stack process error
785
786  */
787 OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle,
788         uint8_t *numResourceInterfaces);
789
790 /**
791  * Get name of resource interface of the resource.
792  *
793  * @param handle - handle of resource
794  * @param index - index of resource, 0 to Count - 1
795  *
796  * @return
797  *    resource interface name - if resource found
798  *    NULL - resource not found
799  */
800 const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
801
802 /**
803  * Get methods of resource interface of the resource.
804  *
805  * @param handle - handle of resource
806  * @param index - index of resource, 0 to Count - 1
807  *
808  * @return
809  *    allowed methods - if resource found
810  *    NULL - resource not found
811  */
812 uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
813
814 /**
815  * Get resource handle from the collection resource by index.
816  *
817  * @param collectionHandle - handle of collection resource
818  * @param index - index of contained resource, 0 to Count - 1
819  *
820  * @return
821  *    handle to contained resource - if resource found
822  *    NULL - resource not found
823  */
824 OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle,
825         uint8_t index);
826
827 /**
828  * Get the entity handler for a resource.
829  *
830  * @param handle - handle of resource
831  *
832  * @return
833  *    entity handler - if resource found
834  *    NULL - resource not found
835  */
836 OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
837
838 /**
839  * Notify all registered observers that the resource representation has
840  * changed. If observation includes a query the client is notified only
841  * if the query is valid after the resource representation has changed.
842  *
843  * @param handle - handle of resource
844  * @param qos    - desired quality of service for the observation notifications
845  *
846  * @return
847  *     OC_STACK_OK    - no errors
848  *     OC_STACK_NO_RESOURCE - invalid resource handle
849  *     OC_STACK_NO_OBSERVERS - no more observers intrested in resource
850  */
851 OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
852
853 /**
854  * Notify specific observers with updated value of representation.
855  * Before this API is invoked by entity handler it has finished processing
856  * queries for the associated observers.
857  *
858  * @param handle - handle of resource
859  * @param obsIdList - list of observation ids that need to be notified
860  * @param numberOfIds - number of observation ids included in obsIdList
861  * @param notificationJSONPayload - JSON encoded payload to send in notification
862  * @param qos - desired quality of service of the observation notifications
863  * NOTE: The memory for obsIdList and notificationJSONPayload is managed by the
864  * entity invoking the API. The maximum size of the notification is 1015 bytes
865  * for non-Arduino platforms. For Arduino the maximum size is 247 bytes.
866  *
867  * @return
868  *     OC_STACK_OK    - no errors
869  *     OC_STACK_NO_RESOURCE - invalid resource handle
870  */
871 OCStackResult
872 OCNotifyListOfObservers (OCResourceHandle handle,
873                             OCObservationId  *obsIdList,
874                             uint8_t          numberOfIds,
875                             const char    *notificationJSONPayload,
876                             OCQualityOfService qos);
877
878
879 /**
880  * Send a response to a request.
881  * The response can be a normal, slow, or block (i.e. a response that
882  * is too large to be sent in a single PDU and must span multiple transmissions)
883  *
884  * @param response - pointer to structure that contains response parameters
885  *
886  * @return
887  *     OC_STACK_OK    - no errors
888  */
889 OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
890
891 /**
892  * Cancel a response.  Applies to a block response
893  *
894  * @param responseHandle - response handle set by stack in OCServerResponse after
895  *                         OCDoResponse is called
896  *
897  * @return
898  *     OC_STACK_OK               - No errors; Success
899  *     OC_STACK_INVALID_PARAM    - The handle provided is invalid.
900  */
901 OCStackResult OCCancelResponse(OCResponseHandle responseHandle);
902
903 //Utility methods
904
905 //-- OCDevAddrToIPv4Addr -------------------------------------------------
906 /**
907  * This method is used to retrieved the IPv4 address from OCDev address
908  * data structure.
909  *
910  * @param[in]  ipAddr
911  *              OCDevAddr address.
912  * @param[out]  a first byte of IPv4 address.
913  * @param[out]  b second byte of IPv4 address.
914  * @param[out]  c third byte of IPv4 address.
915  * @param[out]  d fourth byte of IPv4 address.
916  *
917  * @retval 0 for Success, otherwise some error value
918  */
919 //------------------------------------------------------------------------
920 int32_t OCDevAddrToIPv4Addr(OCDevAddr *ipAddr, uint8_t *a, uint8_t *b,
921             uint8_t *c, uint8_t *d );
922
923
924 //-- OCDevAddrToPort -------------------------------------------------
925 /**
926  * This method is used to retrieve the port number from OCDev address
927  * data structure.
928  *
929  * @param[in]  ipAddr
930  *              OCDevAddr address.
931  * @param[out] port
932  *              port number
933  *
934  * @retval 0 for Success, otherwise some error value
935  */
936 //------------------------------------------------------------------------
937 int32_t OCDevAddrToPort(OCDevAddr *ipAddr, uint16_t *port);
938
939 #ifdef __cplusplus
940 }
941 #endif // __cplusplus
942
943 #endif /* OCSTACK_H_ */
944
945