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