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 struct periodic_resource_s;
69 typedef void (*restful_handler)(
void *request,
void *response,
70 uint8_t *buffer, uint16_t preferred_size,
72 typedef void (*restful_final_handler)(
struct resource_s *resource,
73 void *request,
void *response);
74 typedef void (*restful_periodic_handler)(void);
75 typedef void (*restful_response_handler)(
void *data,
void *response);
76 typedef void (*restful_trigger_handler)(void);
79 typedef int (*service_callback_t)(
void *request,
void *response,
80 uint8_t *buffer, uint16_t preferred_size,
85 struct resource_s *next;
88 const char *attributes;
89 restful_handler get_handler;
90 restful_handler post_handler;
91 restful_handler put_handler;
92 restful_handler delete_handler;
94 struct periodic_resource_s *periodic;
95 restful_trigger_handler trigger;
96 restful_trigger_handler resume;
99 typedef struct resource_s resource_t;
101 struct periodic_resource_s {
102 struct periodic_resource_s *next;
103 const resource_t *resource;
105 struct etimer periodic_timer;
106 const restful_periodic_handler periodic_handler;
108 typedef struct periodic_resource_s periodic_resource_t;
114 #define RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler) \
115 resource_t name = { NULL, NULL, NO_FLAGS, attributes, get_handler, post_handler, put_handler, delete_handler, { NULL } }
117 #define PARENT_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler) \
118 resource_t name = { NULL, NULL, HAS_SUB_RESOURCES, attributes, get_handler, post_handler, put_handler, delete_handler, { NULL } }
120 #define SEPARATE_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler, resume_handler) \
121 resource_t name = { NULL, NULL, IS_SEPARATE, attributes, get_handler, post_handler, put_handler, delete_handler, { .resume = resume_handler } }
123 #define EVENT_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler, event_handler) \
124 resource_t name = { NULL, NULL, IS_OBSERVABLE, attributes, get_handler, post_handler, put_handler, delete_handler, { .trigger = event_handler } }
132 #define PERIODIC_RESOURCE(name, attributes, get_handler, post_handler, put_handler, delete_handler, period, periodic_handler) \
133 periodic_resource_t periodic_##name; \
134 resource_t name = { NULL, NULL, IS_OBSERVABLE | IS_PERIODIC, attributes, get_handler, post_handler, put_handler, delete_handler, { .periodic = &periodic_##name } }; \
135 periodic_resource_t periodic_##name = { NULL, &name, period, { { 0 } }, periodic_handler };
137 struct rest_implementation {
144 void (*set_service_callback)(service_callback_t callback);
147 int (*get_url)(
void *request,
const char **url);
153 int (*set_response_status)(
void *response,
unsigned int code);
156 int (*get_header_content_type)(
void *request,
157 unsigned int *content_format);
160 int (*set_header_content_type)(
void *response,
161 unsigned int content_format);
164 int (*get_header_accept)(
void *request,
unsigned int *
accept);
167 int (*get_header_length)(
void *request, uint32_t *size);
170 int (*set_header_length)(
void *response, uint32_t size);
173 int (*get_header_max_age)(
void *request, uint32_t *age);
176 int (*set_header_max_age)(
void *response, uint32_t age);
179 int (*set_header_etag)(
void *response,
const uint8_t *etag,
183 int (*get_header_if_match)(
void *request,
const uint8_t **etag);
186 int (*get_header_if_none_match)(
void *request);
189 int (*get_header_host)(
void *request,
const char **host);
192 int (*set_header_location)(
void *response,
const char *location);
195 int (*get_request_payload)(
void *request,
const uint8_t **payload);
198 int (*set_response_payload)(
void *response,
const void *payload,
202 int (*get_query)(
void *request,
const char **value);
205 int (*get_query_variable)(
void *request,
const char *name,
209 int (*get_post_variable)(
void *request,
const char *name,
213 void (*notify_subscribers)(resource_t *resource);
216 restful_final_handler subscription_handler;
226 extern const struct rest_implementation REST;
232 int rest_invoke_restful_service(
void *request,
void *response,
233 uint8_t *buffer, uint16_t buffer_size,
rest_resource_flags_t
Resource flags for allowed methods and special functionalities.
List of Content-Formats which are Internet Media Types plus encoding.
list_t rest_get_resources(void)
Returns the list of registered RESTful resources.
void ** list_t
The linked list type.
void rest_activate_resource(resource_t *resource, char *path)
Resources wanted to be accessible should be activated with the following code.
Generic status codes that are mapped to either HTTP or CoAP codes.
void rest_init_engine(void)
Initializes REST framework and starts the HTTP or CoAP process.
Constants for the REST Engine (Erbium).
static uint8_t accept(uint8_t in)
Processes an incoming or outgoing multicast message and determines whether it should be dropped or ac...