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