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