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