res_pjsip res_pjsip_mwi: Misc fixes and cleanups.
[asterisk/asterisk.git] / res / res_ari_playbacks.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2012 - 2013, Digium, Inc.
5  *
6  * David M. Lee, II <dlee@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 Playback control resources
30  *
31  * \author David M. Lee, II <dlee@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 ASTERISK_REGISTER_FILE()
44
45 #include "asterisk/app.h"
46 #include "asterisk/module.h"
47 #include "asterisk/stasis_app.h"
48 #include "ari/resource_playbacks.h"
49 #if defined(AST_DEVMODE)
50 #include "ari/ari_model_validators.h"
51 #endif
52
53 #define MAX_VALS 128
54
55 /*!
56  * \brief Parameter parsing callback for /playbacks/{playbackId}.
57  * \param get_params GET parameters in the HTTP request.
58  * \param path_vars Path variables extracted from the request.
59  * \param headers HTTP headers.
60  * \param[out] response Response to the HTTP request.
61  */
62 static void ast_ari_playbacks_get_cb(
63         struct ast_tcptls_session_instance *ser,
64         struct ast_variable *get_params, struct ast_variable *path_vars,
65         struct ast_variable *headers, struct ast_ari_response *response)
66 {
67         struct ast_ari_playbacks_get_args args = {};
68         struct ast_variable *i;
69         RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
70 #if defined(AST_DEVMODE)
71         int is_valid;
72         int code;
73 #endif /* AST_DEVMODE */
74
75         for (i = path_vars; i; i = i->next) {
76                 if (strcmp(i->name, "playbackId") == 0) {
77                         args.playback_id = (i->value);
78                 } else
79                 {}
80         }
81         ast_ari_playbacks_get(headers, &args, response);
82 #if defined(AST_DEVMODE)
83         code = response->response_code;
84
85         switch (code) {
86         case 0: /* Implementation is still a stub, or the code wasn't set */
87                 is_valid = response->message == NULL;
88                 break;
89         case 500: /* Internal Server Error */
90         case 501: /* Not Implemented */
91         case 404: /* The playback cannot be found */
92                 is_valid = 1;
93                 break;
94         default:
95                 if (200 <= code && code <= 299) {
96                         is_valid = ast_ari_validate_playback(
97                                 response->message);
98                 } else {
99                         ast_log(LOG_ERROR, "Invalid error response %d for /playbacks/{playbackId}\n", code);
100                         is_valid = 0;
101                 }
102         }
103
104         if (!is_valid) {
105                 ast_log(LOG_ERROR, "Response validation failed for /playbacks/{playbackId}\n");
106                 ast_ari_response_error(response, 500,
107                         "Internal Server Error", "Response validation failed");
108         }
109 #endif /* AST_DEVMODE */
110
111 fin: __attribute__((unused))
112         return;
113 }
114 /*!
115  * \brief Parameter parsing callback for /playbacks/{playbackId}.
116  * \param get_params GET parameters in the HTTP request.
117  * \param path_vars Path variables extracted from the request.
118  * \param headers HTTP headers.
119  * \param[out] response Response to the HTTP request.
120  */
121 static void ast_ari_playbacks_stop_cb(
122         struct ast_tcptls_session_instance *ser,
123         struct ast_variable *get_params, struct ast_variable *path_vars,
124         struct ast_variable *headers, struct ast_ari_response *response)
125 {
126         struct ast_ari_playbacks_stop_args args = {};
127         struct ast_variable *i;
128         RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
129 #if defined(AST_DEVMODE)
130         int is_valid;
131         int code;
132 #endif /* AST_DEVMODE */
133
134         for (i = path_vars; i; i = i->next) {
135                 if (strcmp(i->name, "playbackId") == 0) {
136                         args.playback_id = (i->value);
137                 } else
138                 {}
139         }
140         ast_ari_playbacks_stop(headers, &args, response);
141 #if defined(AST_DEVMODE)
142         code = response->response_code;
143
144         switch (code) {
145         case 0: /* Implementation is still a stub, or the code wasn't set */
146                 is_valid = response->message == NULL;
147                 break;
148         case 500: /* Internal Server Error */
149         case 501: /* Not Implemented */
150         case 404: /* The playback cannot be found */
151                 is_valid = 1;
152                 break;
153         default:
154                 if (200 <= code && code <= 299) {
155                         is_valid = ast_ari_validate_void(
156                                 response->message);
157                 } else {
158                         ast_log(LOG_ERROR, "Invalid error response %d for /playbacks/{playbackId}\n", code);
159                         is_valid = 0;
160                 }
161         }
162
163         if (!is_valid) {
164                 ast_log(LOG_ERROR, "Response validation failed for /playbacks/{playbackId}\n");
165                 ast_ari_response_error(response, 500,
166                         "Internal Server Error", "Response validation failed");
167         }
168 #endif /* AST_DEVMODE */
169
170 fin: __attribute__((unused))
171         return;
172 }
173 int ast_ari_playbacks_control_parse_body(
174         struct ast_json *body,
175         struct ast_ari_playbacks_control_args *args)
176 {
177         struct ast_json *field;
178         /* Parse query parameters out of it */
179         field = ast_json_object_get(body, "operation");
180         if (field) {
181                 args->operation = ast_json_string_get(field);
182         }
183         return 0;
184 }
185
186 /*!
187  * \brief Parameter parsing callback for /playbacks/{playbackId}/control.
188  * \param get_params GET parameters in the HTTP request.
189  * \param path_vars Path variables extracted from the request.
190  * \param headers HTTP headers.
191  * \param[out] response Response to the HTTP request.
192  */
193 static void ast_ari_playbacks_control_cb(
194         struct ast_tcptls_session_instance *ser,
195         struct ast_variable *get_params, struct ast_variable *path_vars,
196         struct ast_variable *headers, struct ast_ari_response *response)
197 {
198         struct ast_ari_playbacks_control_args args = {};
199         struct ast_variable *i;
200         RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
201 #if defined(AST_DEVMODE)
202         int is_valid;
203         int code;
204 #endif /* AST_DEVMODE */
205
206         for (i = get_params; i; i = i->next) {
207                 if (strcmp(i->name, "operation") == 0) {
208                         args.operation = (i->value);
209                 } else
210                 {}
211         }
212         for (i = path_vars; i; i = i->next) {
213                 if (strcmp(i->name, "playbackId") == 0) {
214                         args.playback_id = (i->value);
215                 } else
216                 {}
217         }
218         /* Look for a JSON request entity */
219         body = ast_http_get_json(ser, headers);
220         if (!body) {
221                 switch (errno) {
222                 case EFBIG:
223                         ast_ari_response_error(response, 413, "Request Entity Too Large", "Request body too large");
224                         goto fin;
225                 case ENOMEM:
226                         ast_ari_response_error(response, 500, "Internal Server Error", "Error processing request");
227                         goto fin;
228                 case EIO:
229                         ast_ari_response_error(response, 400, "Bad Request", "Error parsing request body");
230                         goto fin;
231                 }
232         }
233         if (ast_ari_playbacks_control_parse_body(body, &args)) {
234                 ast_ari_response_alloc_failed(response);
235                 goto fin;
236         }
237         ast_ari_playbacks_control(headers, &args, response);
238 #if defined(AST_DEVMODE)
239         code = response->response_code;
240
241         switch (code) {
242         case 0: /* Implementation is still a stub, or the code wasn't set */
243                 is_valid = response->message == NULL;
244                 break;
245         case 500: /* Internal Server Error */
246         case 501: /* Not Implemented */
247         case 400: /* The provided operation parameter was invalid */
248         case 404: /* The playback cannot be found */
249         case 409: /* The operation cannot be performed in the playback's current state */
250                 is_valid = 1;
251                 break;
252         default:
253                 if (200 <= code && code <= 299) {
254                         is_valid = ast_ari_validate_void(
255                                 response->message);
256                 } else {
257                         ast_log(LOG_ERROR, "Invalid error response %d for /playbacks/{playbackId}/control\n", code);
258                         is_valid = 0;
259                 }
260         }
261
262         if (!is_valid) {
263                 ast_log(LOG_ERROR, "Response validation failed for /playbacks/{playbackId}/control\n");
264                 ast_ari_response_error(response, 500,
265                         "Internal Server Error", "Response validation failed");
266         }
267 #endif /* AST_DEVMODE */
268
269 fin: __attribute__((unused))
270         return;
271 }
272
273 /*! \brief REST handler for /api-docs/playbacks.{format} */
274 static struct stasis_rest_handlers playbacks_playbackId_control = {
275         .path_segment = "control",
276         .callbacks = {
277                 [AST_HTTP_POST] = ast_ari_playbacks_control_cb,
278         },
279         .num_children = 0,
280         .children = {  }
281 };
282 /*! \brief REST handler for /api-docs/playbacks.{format} */
283 static struct stasis_rest_handlers playbacks_playbackId = {
284         .path_segment = "playbackId",
285         .is_wildcard = 1,
286         .callbacks = {
287                 [AST_HTTP_GET] = ast_ari_playbacks_get_cb,
288                 [AST_HTTP_DELETE] = ast_ari_playbacks_stop_cb,
289         },
290         .num_children = 1,
291         .children = { &playbacks_playbackId_control, }
292 };
293 /*! \brief REST handler for /api-docs/playbacks.{format} */
294 static struct stasis_rest_handlers playbacks = {
295         .path_segment = "playbacks",
296         .callbacks = {
297         },
298         .num_children = 1,
299         .children = { &playbacks_playbackId, }
300 };
301
302 static int load_module(void)
303 {
304         int res = 0;
305         stasis_app_ref();
306         res |= ast_ari_add_handler(&playbacks);
307         return res;
308 }
309
310 static int unload_module(void)
311 {
312         ast_ari_remove_handler(&playbacks);
313         stasis_app_unref();
314         return 0;
315 }
316
317 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "RESTful API module - Playback control resources",
318         .support_level = AST_MODULE_SUPPORT_CORE,
319         .load = load_module,
320         .unload = unload_module,
321         .nonoptreq = "res_ari,res_stasis",
322 );