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