40 #ifndef REST_ENGINE_H_
41 #define REST_ENGINE_H_
45 #include "contiki-lib.h"
49 #define REGISTERED_ENGINE_ERBIUM coap_rest_implementation
50 #define REGISTERED_ENGINE_HELIUM http_rest_implementation
53 #if !defined(REST) || (REST != REGISTERED_ENGINE_ERBIUM && REST != REGISTERED_ENGINE_HELIUM)
54 #error "Define a valid REST Engine implementation (REST define)!"
61 #ifndef REST_MAX_CHUNK_SIZE
62 #define REST_MAX_CHUNK_SIZE 64
66 #define MIN(a, b) ((a) < (b) ? (a) : (b))
70 struct periodic_resource_s;
73 typedef void (*restful_handler)(
void *request,
void *response,
74 uint8_t *buffer, uint16_t preferred_size,
76 typedef void (*restful_final_handler)(
struct resource_s *resource,
77 void *request,
void *response);
78 typedef void (*restful_periodic_handler)(void);
79 typedef void (*restful_response_handler)(
void *data,
void *response);
80 typedef void (*restful_trigger_handler)(void);
83 typedef int (*service_callback_t)(
void *request,
void *response,
84 uint8_t *buffer, uint16_t preferred_size,
89 struct resource_s *next;
92 const char *attributes;
93 restful_handler get_handler;
94 restful_handler post_handler;
95 restful_handler put_handler;
96 restful_handler delete_handler;
98 struct periodic_resource_s *periodic;
99 restful_trigger_handler trigger;
100 restful_trigger_handler resume;
103 typedef struct resource_s resource_t;
105 struct periodic_resource_s {
106 struct periodic_resource_s *next;
107 const resource_t *resource;
109 struct etimer periodic_timer;
110 const restful_periodic_handler periodic_handler;
112 typedef struct periodic_resource_s periodic_resource_t;
118 #define RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler) \
119 resource_t name = { NULL, NULL, NO_FLAGS, attributes, get_handler, post_handler, put_handler, delete_handler, { NULL } }
121 #define PARENT_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler) \
122 resource_t name = { NULL, NULL, HAS_SUB_RESOURCES, attributes, get_handler, post_handler, put_handler, delete_handler, { NULL } }
124 #define SEPARATE_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler, resume_handler) \
125 resource_t name = { NULL, NULL, IS_SEPARATE, attributes, get_handler, post_handler, put_handler, delete_handler, { .resume = resume_handler } }
127 #define EVENT_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler, event_handler) \
128 resource_t name = { NULL, NULL, IS_OBSERVABLE, attributes, get_handler, post_handler, put_handler, delete_handler, { .trigger = event_handler } }
136 #define PERIODIC_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler, period, periodic_handler) \
137 periodic_resource_t periodic_##name; \
138 resource_t name = { NULL, NULL, IS_OBSERVABLE | IS_PERIODIC, attributes, get_handler, post_handler, put_handler, delete_handler, { .periodic = &periodic_##name } }; \
139 periodic_resource_t periodic_##name = { NULL, &name, period, { { 0 } }, periodic_handler };
141 struct rest_implementation {
148 void (*set_service_callback)(service_callback_t callback);
151 int (*get_url)(
void *request,
const char **url);
157 int (*set_response_status)(
void *response,
unsigned int code);
160 int (*get_header_content_type)(
void *request,
161 unsigned int *content_format);
164 int (*set_header_content_type)(
void *response,
165 unsigned int content_format);
168 int (*get_header_accept)(
void *request,
unsigned int *accept);
171 int (*get_header_length)(
void *request, uint32_t *size);
174 int (*set_header_length)(
void *response, uint32_t size);
177 int (*get_header_max_age)(
void *request, uint32_t *age);
180 int (*set_header_max_age)(
void *response, uint32_t age);
183 int (*set_header_etag)(
void *response,
const uint8_t *etag,
187 int (*get_header_if_match)(
void *request,
const uint8_t **etag);
190 int (*get_header_if_none_match)(
void *request);
193 int (*get_header_host)(
void *request,
const char **host);
196 int (*set_header_location)(
void *response,
const char *location);
199 int (*get_request_payload)(
void *request,
const uint8_t **payload);
202 int (*set_response_payload)(
void *response,
const void *payload,
206 int (*get_query)(
void *request,
const char **value);
209 int (*get_query_variable)(
void *request,
const char *name,
213 int (*get_post_variable)(
void *request,
const char *name,
217 void (*notify_subscribers)(resource_t *resource);
220 restful_final_handler subscription_handler;
230 extern const struct rest_implementation REST;
236 int rest_invoke_restful_service(
void *request,
void *response,
237 uint8_t *buffer, uint16_t buffer_size,
list_t rest_get_resources(void)
Returns the list of registered RESTful resources.
rest_resource_flags_t
Resource flags for allowed methods and special functionalities.
void ** list_t
The linked list type.
List of Content-Formats which are Internet Media Types plus encoding.
Constants for the REST Engine (Erbium).
Generic status codes that are mapped to either HTTP or CoAP codes.
void rest_activate_resource(resource_t *resource, char *path)
Makes a resource available under the given URI path.
void rest_init_engine(void)
Initializes and starts the REST Engine process.