Merge "res_pjsip/res_pjsip_callerid: NULL check on caller id name string"
[asterisk/asterisk.git] / res / res_ari_device_states.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2012 - 2013, Digium, Inc.
5  *
6  * Kevin Harwell <kharwell@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*
20  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21  * !!!!!                               DO NOT EDIT                        !!!!!
22  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23  * This file is generated by a mustache template. Please see the original
24  * template in rest-api-templates/res_ari_resource.c.mustache
25  */
26
27 /*! \file
28  *
29  * \brief Device state resources
30  *
31  * \author Kevin Harwell <kharwell@digium.com>
32  */
33
34 /*** MODULEINFO
35         <depend type="module">res_ari</depend>
36         <depend type="module">res_ari_model</depend>
37         <depend type="module">res_stasis</depend>
38         <support_level>core</support_level>
39  ***/
40
41 #include "asterisk.h"
42
43 #include "asterisk/app.h"
44 #include "asterisk/module.h"
45 #include "asterisk/stasis_app.h"
46 #include "ari/resource_device_states.h"
47 #if defined(AST_DEVMODE)
48 #include "ari/ari_model_validators.h"
49 #endif
50
51 #define MAX_VALS 128
52
53 /*!
54  * \brief Parameter parsing callback for /deviceStates.
55  * \param get_params GET parameters in the HTTP request.
56  * \param path_vars Path variables extracted from the request.
57  * \param headers HTTP headers.
58  * \param[out] response Response to the HTTP request.
59  */
60 static void ast_ari_device_states_list_cb(
61         struct ast_tcptls_session_instance *ser,
62         struct ast_variable *get_params, struct ast_variable *path_vars,
63         struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
64 {
65         struct ast_ari_device_states_list_args args = {};
66 #if defined(AST_DEVMODE)
67         int is_valid;
68         int code;
69 #endif /* AST_DEVMODE */
70
71         ast_ari_device_states_list(headers, &args, response);
72 #if defined(AST_DEVMODE)
73         code = response->response_code;
74
75         switch (code) {
76         case 0: /* Implementation is still a stub, or the code wasn't set */
77                 is_valid = response->message == NULL;
78                 break;
79         case 500: /* Internal Server Error */
80         case 501: /* Not Implemented */
81                 is_valid = 1;
82                 break;
83         default:
84                 if (200 <= code && code <= 299) {
85                         is_valid = ast_ari_validate_list(response->message,
86                                 ast_ari_validate_device_state_fn());
87                 } else {
88                         ast_log(LOG_ERROR, "Invalid error response %d for /deviceStates\n", code);
89                         is_valid = 0;
90                 }
91         }
92
93         if (!is_valid) {
94                 ast_log(LOG_ERROR, "Response validation failed for /deviceStates\n");
95                 ast_ari_response_error(response, 500,
96                         "Internal Server Error", "Response validation failed");
97         }
98 #endif /* AST_DEVMODE */
99
100 fin: __attribute__((unused))
101         return;
102 }
103 /*!
104  * \brief Parameter parsing callback for /deviceStates/{deviceName}.
105  * \param get_params GET parameters in the HTTP request.
106  * \param path_vars Path variables extracted from the request.
107  * \param headers HTTP headers.
108  * \param[out] response Response to the HTTP request.
109  */
110 static void ast_ari_device_states_get_cb(
111         struct ast_tcptls_session_instance *ser,
112         struct ast_variable *get_params, struct ast_variable *path_vars,
113         struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
114 {
115         struct ast_ari_device_states_get_args args = {};
116         struct ast_variable *i;
117 #if defined(AST_DEVMODE)
118         int is_valid;
119         int code;
120 #endif /* AST_DEVMODE */
121
122         for (i = path_vars; i; i = i->next) {
123                 if (strcmp(i->name, "deviceName") == 0) {
124                         args.device_name = (i->value);
125                 } else
126                 {}
127         }
128         ast_ari_device_states_get(headers, &args, response);
129 #if defined(AST_DEVMODE)
130         code = response->response_code;
131
132         switch (code) {
133         case 0: /* Implementation is still a stub, or the code wasn't set */
134                 is_valid = response->message == NULL;
135                 break;
136         case 500: /* Internal Server Error */
137         case 501: /* Not Implemented */
138                 is_valid = 1;
139                 break;
140         default:
141                 if (200 <= code && code <= 299) {
142                         is_valid = ast_ari_validate_device_state(
143                                 response->message);
144                 } else {
145                         ast_log(LOG_ERROR, "Invalid error response %d for /deviceStates/{deviceName}\n", code);
146                         is_valid = 0;
147                 }
148         }
149
150         if (!is_valid) {
151                 ast_log(LOG_ERROR, "Response validation failed for /deviceStates/{deviceName}\n");
152                 ast_ari_response_error(response, 500,
153                         "Internal Server Error", "Response validation failed");
154         }
155 #endif /* AST_DEVMODE */
156
157 fin: __attribute__((unused))
158         return;
159 }
160 int ast_ari_device_states_update_parse_body(
161         struct ast_json *body,
162         struct ast_ari_device_states_update_args *args)
163 {
164         struct ast_json *field;
165         /* Parse query parameters out of it */
166         field = ast_json_object_get(body, "deviceState");
167         if (field) {
168                 args->device_state = ast_json_string_get(field);
169         }
170         return 0;
171 }
172
173 /*!
174  * \brief Parameter parsing callback for /deviceStates/{deviceName}.
175  * \param get_params GET parameters in the HTTP request.
176  * \param path_vars Path variables extracted from the request.
177  * \param headers HTTP headers.
178  * \param[out] response Response to the HTTP request.
179  */
180 static void ast_ari_device_states_update_cb(
181         struct ast_tcptls_session_instance *ser,
182         struct ast_variable *get_params, struct ast_variable *path_vars,
183         struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
184 {
185         struct ast_ari_device_states_update_args args = {};
186         struct ast_variable *i;
187 #if defined(AST_DEVMODE)
188         int is_valid;
189         int code;
190 #endif /* AST_DEVMODE */
191
192         for (i = get_params; i; i = i->next) {
193                 if (strcmp(i->name, "deviceState") == 0) {
194                         args.device_state = (i->value);
195                 } else
196                 {}
197         }
198         for (i = path_vars; i; i = i->next) {
199                 if (strcmp(i->name, "deviceName") == 0) {
200                         args.device_name = (i->value);
201                 } else
202                 {}
203         }
204         if (ast_ari_device_states_update_parse_body(body, &args)) {
205                 ast_ari_response_alloc_failed(response);
206                 goto fin;
207         }
208         ast_ari_device_states_update(headers, &args, response);
209 #if defined(AST_DEVMODE)
210         code = response->response_code;
211
212         switch (code) {
213         case 0: /* Implementation is still a stub, or the code wasn't set */
214                 is_valid = response->message == NULL;
215                 break;
216         case 500: /* Internal Server Error */
217         case 501: /* Not Implemented */
218         case 404: /* Device name is missing */
219         case 409: /* Uncontrolled device specified */
220                 is_valid = 1;
221                 break;
222         default:
223                 if (200 <= code && code <= 299) {
224                         is_valid = ast_ari_validate_void(
225                                 response->message);
226                 } else {
227                         ast_log(LOG_ERROR, "Invalid error response %d for /deviceStates/{deviceName}\n", code);
228                         is_valid = 0;
229                 }
230         }
231
232         if (!is_valid) {
233                 ast_log(LOG_ERROR, "Response validation failed for /deviceStates/{deviceName}\n");
234                 ast_ari_response_error(response, 500,
235                         "Internal Server Error", "Response validation failed");
236         }
237 #endif /* AST_DEVMODE */
238
239 fin: __attribute__((unused))
240         return;
241 }
242 /*!
243  * \brief Parameter parsing callback for /deviceStates/{deviceName}.
244  * \param get_params GET parameters in the HTTP request.
245  * \param path_vars Path variables extracted from the request.
246  * \param headers HTTP headers.
247  * \param[out] response Response to the HTTP request.
248  */
249 static void ast_ari_device_states_delete_cb(
250         struct ast_tcptls_session_instance *ser,
251         struct ast_variable *get_params, struct ast_variable *path_vars,
252         struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
253 {
254         struct ast_ari_device_states_delete_args args = {};
255         struct ast_variable *i;
256 #if defined(AST_DEVMODE)
257         int is_valid;
258         int code;
259 #endif /* AST_DEVMODE */
260
261         for (i = path_vars; i; i = i->next) {
262                 if (strcmp(i->name, "deviceName") == 0) {
263                         args.device_name = (i->value);
264                 } else
265                 {}
266         }
267         ast_ari_device_states_delete(headers, &args, response);
268 #if defined(AST_DEVMODE)
269         code = response->response_code;
270
271         switch (code) {
272         case 0: /* Implementation is still a stub, or the code wasn't set */
273                 is_valid = response->message == NULL;
274                 break;
275         case 500: /* Internal Server Error */
276         case 501: /* Not Implemented */
277         case 404: /* Device name is missing */
278         case 409: /* Uncontrolled device specified */
279                 is_valid = 1;
280                 break;
281         default:
282                 if (200 <= code && code <= 299) {
283                         is_valid = ast_ari_validate_void(
284                                 response->message);
285                 } else {
286                         ast_log(LOG_ERROR, "Invalid error response %d for /deviceStates/{deviceName}\n", code);
287                         is_valid = 0;
288                 }
289         }
290
291         if (!is_valid) {
292                 ast_log(LOG_ERROR, "Response validation failed for /deviceStates/{deviceName}\n");
293                 ast_ari_response_error(response, 500,
294                         "Internal Server Error", "Response validation failed");
295         }
296 #endif /* AST_DEVMODE */
297
298 fin: __attribute__((unused))
299         return;
300 }
301
302 /*! \brief REST handler for /api-docs/deviceStates.json */
303 static struct stasis_rest_handlers deviceStates_deviceName = {
304         .path_segment = "deviceName",
305         .is_wildcard = 1,
306         .callbacks = {
307                 [AST_HTTP_GET] = ast_ari_device_states_get_cb,
308                 [AST_HTTP_PUT] = ast_ari_device_states_update_cb,
309                 [AST_HTTP_DELETE] = ast_ari_device_states_delete_cb,
310         },
311         .num_children = 0,
312         .children = {  }
313 };
314 /*! \brief REST handler for /api-docs/deviceStates.json */
315 static struct stasis_rest_handlers deviceStates = {
316         .path_segment = "deviceStates",
317         .callbacks = {
318                 [AST_HTTP_GET] = ast_ari_device_states_list_cb,
319         },
320         .num_children = 1,
321         .children = { &deviceStates_deviceName, }
322 };
323
324 static int unload_module(void)
325 {
326         ast_ari_remove_handler(&deviceStates);
327         stasis_app_unref();
328         return 0;
329 }
330
331 static int load_module(void)
332 {
333         int res = 0;
334         stasis_app_ref();
335         res |= ast_ari_add_handler(&deviceStates);
336         if (res) {
337                 unload_module();
338                 return AST_MODULE_LOAD_DECLINE;
339         }
340
341         return AST_MODULE_LOAD_SUCCESS;
342 }
343
344 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "RESTful API module - Device state resources",
345         .support_level = AST_MODULE_SUPPORT_CORE,
346         .load = load_module,
347         .unload = unload_module,
348         .nonoptreq = "res_ari,res_stasis",
349 );