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