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