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