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