Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Macros | Functions | Variables
res_ari_bridges.c File Reference

Bridge resources. More...

#include "asterisk.h"
#include "asterisk/app.h"
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "ari/resource_bridges.h"
Include dependency graph for res_ari_bridges.c:

Go to the source code of this file.

Macros

#define MAX_VALS   128
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static void ast_ari_bridges_add_channel_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/addChannel. More...
 
int ast_ari_bridges_add_channel_parse_body (struct ast_json *body, struct ast_ari_bridges_add_channel_args *args)
 Body parsing function for /bridges/{bridgeId}/addChannel. More...
 
static void ast_ari_bridges_clear_video_source_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/videoSource. More...
 
static void ast_ari_bridges_create_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges. More...
 
int ast_ari_bridges_create_parse_body (struct ast_json *body, struct ast_ari_bridges_create_args *args)
 Body parsing function for /bridges. More...
 
static void ast_ari_bridges_create_with_id_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}. More...
 
int ast_ari_bridges_create_with_id_parse_body (struct ast_json *body, struct ast_ari_bridges_create_with_id_args *args)
 Body parsing function for /bridges/{bridgeId}. More...
 
static void ast_ari_bridges_destroy_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}. More...
 
static void ast_ari_bridges_get_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}. More...
 
static void ast_ari_bridges_list_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges. More...
 
static void ast_ari_bridges_play_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/play. More...
 
int ast_ari_bridges_play_parse_body (struct ast_json *body, struct ast_ari_bridges_play_args *args)
 Body parsing function for /bridges/{bridgeId}/play. More...
 
static void ast_ari_bridges_play_with_id_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/play/{playbackId}. More...
 
int ast_ari_bridges_play_with_id_parse_body (struct ast_json *body, struct ast_ari_bridges_play_with_id_args *args)
 Body parsing function for /bridges/{bridgeId}/play/{playbackId}. More...
 
static void ast_ari_bridges_record_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/record. More...
 
int ast_ari_bridges_record_parse_body (struct ast_json *body, struct ast_ari_bridges_record_args *args)
 Body parsing function for /bridges/{bridgeId}/record. More...
 
static void ast_ari_bridges_remove_channel_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/removeChannel. More...
 
int ast_ari_bridges_remove_channel_parse_body (struct ast_json *body, struct ast_ari_bridges_remove_channel_args *args)
 Body parsing function for /bridges/{bridgeId}/removeChannel. More...
 
static void ast_ari_bridges_set_video_source_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/videoSource/{channelId}. More...
 
static void ast_ari_bridges_start_moh_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/moh. More...
 
int ast_ari_bridges_start_moh_parse_body (struct ast_json *body, struct ast_ari_bridges_start_moh_args *args)
 Body parsing function for /bridges/{bridgeId}/moh. More...
 
static void ast_ari_bridges_stop_moh_cb (struct ast_tcptls_session_instance *ser, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
 Parameter parsing callback for /bridges/{bridgeId}/moh. More...
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "RESTful API module - Bridge resources" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "res_ari,res_ari_model,res_stasis,res_stasis_recording,res_stasis_playback", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct stasis_rest_handlers bridges
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_addChannel
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_moh
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_play
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_play_playbackId
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_record
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_removeChannel
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_videoSource
 REST handler for /api-docs/bridges.json. More...
 
static struct stasis_rest_handlers bridges_bridgeId_videoSource_channelId
 REST handler for /api-docs/bridges.json. More...
 

Detailed Description

Bridge resources.

Author
David M. Lee, II dlee@.nosp@m.digi.nosp@m.um.co.nosp@m.m

Definition in file res_ari_bridges.c.

Macro Definition Documentation

◆ MAX_VALS

#define MAX_VALS   128

Definition at line 53 of file res_ari_bridges.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 1616 of file res_ari_bridges.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 1616 of file res_ari_bridges.c.

◆ ast_ari_bridges_add_channel_cb()

static void ast_ari_bridges_add_channel_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/addChannel.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 469 of file res_ari_bridges.c.

473 {
475  struct ast_variable *i;
476 #if defined(AST_DEVMODE)
477  int is_valid;
478  int code;
479 #endif /* AST_DEVMODE */
480 
481  for (i = get_params; i; i = i->next) {
482  if (strcmp(i->name, "channel") == 0) {
483  /* Parse comma separated list */
484  char *vals[MAX_VALS];
485  size_t j;
486 
487  args.channel_parse = ast_strdup(i->value);
488  if (!args.channel_parse) {
490  goto fin;
491  }
492 
493  if (strlen(args.channel_parse) == 0) {
494  /* ast_app_separate_args can't handle "" */
495  args.channel_count = 1;
496  vals[0] = args.channel_parse;
497  } else {
498  args.channel_count = ast_app_separate_args(
499  args.channel_parse, ',', vals,
500  ARRAY_LEN(vals));
501  }
502 
503  if (args.channel_count == 0) {
505  goto fin;
506  }
507 
508  if (args.channel_count >= MAX_VALS) {
509  ast_ari_response_error(response, 400,
510  "Bad Request",
511  "Too many values for channel");
512  goto fin;
513  }
514 
515  args.channel = ast_malloc(sizeof(*args.channel) * args.channel_count);
516  if (!args.channel) {
518  goto fin;
519  }
520 
521  for (j = 0; j < args.channel_count; ++j) {
522  args.channel[j] = (vals[j]);
523  }
524  } else
525  if (strcmp(i->name, "role") == 0) {
526  args.role = (i->value);
527  } else
528  if (strcmp(i->name, "absorbDTMF") == 0) {
529  args.absorb_dtmf = ast_true(i->value);
530  } else
531  if (strcmp(i->name, "mute") == 0) {
532  args.mute = ast_true(i->value);
533  } else
534  if (strcmp(i->name, "inhibitConnectedLineUpdates") == 0) {
535  args.inhibit_connected_line_updates = ast_true(i->value);
536  } else
537  {}
538  }
539  for (i = path_vars; i; i = i->next) {
540  if (strcmp(i->name, "bridgeId") == 0) {
541  args.bridge_id = (i->value);
542  } else
543  {}
544  }
547  goto fin;
548  }
549  ast_ari_bridges_add_channel(headers, &args, response);
550 #if defined(AST_DEVMODE)
551  code = response->response_code;
552 
553  switch (code) {
554  case 0: /* Implementation is still a stub, or the code wasn't set */
555  is_valid = response->message == NULL;
556  break;
557  case 500: /* Internal Server Error */
558  case 501: /* Not Implemented */
559  case 400: /* Channel not found */
560  case 404: /* Bridge not found */
561  case 409: /* Bridge not in Stasis application; Channel currently recording */
562  case 422: /* Channel not in Stasis application */
563  is_valid = 1;
564  break;
565  default:
566  if (200 <= code && code <= 299) {
567  is_valid = ast_ari_validate_void(
568  response->message);
569  } else {
570  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/addChannel\n", code);
571  is_valid = 0;
572  }
573  }
574 
575  if (!is_valid) {
576  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/addChannel\n");
577  ast_ari_response_error(response, 500,
578  "Internal Server Error", "Response validation failed");
579  }
580 #endif /* AST_DEVMODE */
581 
582 fin: __attribute__((unused))
583  ast_free(args.channel_parse);
584  ast_free(args.channel);
585  return;
586 }
void ast_ari_response_error(struct ast_ari_response *response, int response_code, const char *response_text, const char *message_fmt,...)
Fill in an error ast_ari_response.
Definition: res_ari.c:259
void ast_ari_response_alloc_failed(struct ast_ari_response *response)
Fill in response with a 500 message for allocation failures.
Definition: res_ari.c:298
int ast_ari_validate_void(struct ast_json *json)
Validator for native Swagger void.
Definition: res_ari_model.c:91
#define ast_free(a)
Definition: astmm.h:180
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
#define ast_log
Definition: astobj2.c:42
#define ast_app_separate_args(a, b, c, d)
#define LOG_ERROR
#define MAX_VALS
int ast_ari_bridges_add_channel_parse_body(struct ast_json *body, struct ast_ari_bridges_add_channel_args *args)
Body parsing function for /bridges/{bridgeId}/addChannel.
#define NULL
Definition: resample.c:96
void ast_ari_bridges_add_channel(struct ast_variable *headers, struct ast_ari_bridges_add_channel_args *args, struct ast_ari_response *response)
Add a channel to a bridge.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition: main/utils.c:2097
struct ast_json * message
Definition: ari.h:94
int response_code
Definition: ari.h:99
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
const char * args
#define ARRAY_LEN(a)
Definition: utils.h:661

References args, ARRAY_LEN, ast_app_separate_args, ast_ari_bridges_add_channel(), ast_ari_bridges_add_channel_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_void(), ast_free, ast_log, ast_malloc, ast_strdup, ast_true(), LOG_ERROR, MAX_VALS, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_add_channel_parse_body()

int ast_ari_bridges_add_channel_parse_body ( struct ast_json body,
struct ast_ari_bridges_add_channel_args args 
)

Body parsing function for /bridges/{bridgeId}/addChannel.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 406 of file res_ari_bridges.c.

409 {
410  struct ast_json *field;
411  /* Parse query parameters out of it */
412  field = ast_json_object_get(body, "channel");
413  if (field) {
414  /* If they were silly enough to both pass in a query param and a
415  * JSON body, free up the query value.
416  */
417  ast_free(args->channel);
418  if (ast_json_typeof(field) == AST_JSON_ARRAY) {
419  /* Multiple param passed as array */
420  size_t i;
421  args->channel_count = ast_json_array_size(field);
422  args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
423 
424  if (!args->channel) {
425  return -1;
426  }
427 
428  for (i = 0; i < args->channel_count; ++i) {
429  args->channel[i] = ast_json_string_get(ast_json_array_get(field, i));
430  }
431  } else {
432  /* Multiple param passed as single value */
433  args->channel_count = 1;
434  args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
435  if (!args->channel) {
436  return -1;
437  }
438  args->channel[0] = ast_json_string_get(field);
439  }
440  }
441  field = ast_json_object_get(body, "role");
442  if (field) {
443  args->role = ast_json_string_get(field);
444  }
445  field = ast_json_object_get(body, "absorbDTMF");
446  if (field) {
447  args->absorb_dtmf = ast_json_is_true(field);
448  }
449  field = ast_json_object_get(body, "mute");
450  if (field) {
451  args->mute = ast_json_is_true(field);
452  }
453  field = ast_json_object_get(body, "inhibitConnectedLineUpdates");
454  if (field) {
455  args->inhibit_connected_line_updates = ast_json_is_true(field);
456  }
457  return 0;
458 }
enum ast_json_type ast_json_typeof(const struct ast_json *value)
Get the type of value.
Definition: json.c:78
struct ast_json * ast_json_array_get(const struct ast_json *array, size_t index)
Get an element from an array.
Definition: json.c:360
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
Definition: json.c:397
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
Definition: json.c:273
@ AST_JSON_ARRAY
Definition: json.h:165
int ast_json_is_true(const struct ast_json *value)
Check if value is JSON true.
Definition: json.c:253
size_t ast_json_array_size(const struct ast_json *array)
Get the size of a JSON array.
Definition: json.c:356
Abstract JSON element (object, array, string, int, ...).

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_is_true(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_add_channel_cb().

◆ ast_ari_bridges_clear_video_source_cb()

static void ast_ari_bridges_clear_video_source_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/videoSource.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 814 of file res_ari_bridges.c.

818 {
820  struct ast_variable *i;
821 #if defined(AST_DEVMODE)
822  int is_valid;
823  int code;
824 #endif /* AST_DEVMODE */
825 
826  for (i = path_vars; i; i = i->next) {
827  if (strcmp(i->name, "bridgeId") == 0) {
828  args.bridge_id = (i->value);
829  } else
830  {}
831  }
832  ast_ari_bridges_clear_video_source(headers, &args, response);
833 #if defined(AST_DEVMODE)
834  code = response->response_code;
835 
836  switch (code) {
837  case 0: /* Implementation is still a stub, or the code wasn't set */
838  is_valid = response->message == NULL;
839  break;
840  case 500: /* Internal Server Error */
841  case 501: /* Not Implemented */
842  case 404: /* Bridge not found */
843  is_valid = 1;
844  break;
845  default:
846  if (200 <= code && code <= 299) {
847  is_valid = ast_ari_validate_void(
848  response->message);
849  } else {
850  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/videoSource\n", code);
851  is_valid = 0;
852  }
853  }
854 
855  if (!is_valid) {
856  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/videoSource\n");
857  ast_ari_response_error(response, 500,
858  "Internal Server Error", "Response validation failed");
859  }
860 #endif /* AST_DEVMODE */
861 
862 fin: __attribute__((unused))
863  return;
864 }
void ast_ari_bridges_clear_video_source(struct ast_variable *headers, struct ast_ari_bridges_clear_video_source_args *args, struct ast_ari_response *response)
Removes any explicit video source in a multi-party mixing bridge. This operation has no effect on bri...

References args, ast_ari_bridges_clear_video_source(), ast_ari_response_error(), ast_ari_validate_void(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_create_cb()

static void ast_ari_bridges_create_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 137 of file res_ari_bridges.c.

141 {
142  struct ast_ari_bridges_create_args args = {};
143  struct ast_variable *i;
144 #if defined(AST_DEVMODE)
145  int is_valid;
146  int code;
147 #endif /* AST_DEVMODE */
148 
149  for (i = get_params; i; i = i->next) {
150  if (strcmp(i->name, "type") == 0) {
151  args.type = (i->value);
152  } else
153  if (strcmp(i->name, "bridgeId") == 0) {
154  args.bridge_id = (i->value);
155  } else
156  if (strcmp(i->name, "name") == 0) {
157  args.name = (i->value);
158  } else
159  {}
160  }
163  goto fin;
164  }
165  ast_ari_bridges_create(headers, &args, response);
166 #if defined(AST_DEVMODE)
167  code = response->response_code;
168 
169  switch (code) {
170  case 0: /* Implementation is still a stub, or the code wasn't set */
171  is_valid = response->message == NULL;
172  break;
173  case 500: /* Internal Server Error */
174  case 501: /* Not Implemented */
175  is_valid = 1;
176  break;
177  default:
178  if (200 <= code && code <= 299) {
179  is_valid = ast_ari_validate_bridge(
180  response->message);
181  } else {
182  ast_log(LOG_ERROR, "Invalid error response %d for /bridges\n", code);
183  is_valid = 0;
184  }
185  }
186 
187  if (!is_valid) {
188  ast_log(LOG_ERROR, "Response validation failed for /bridges\n");
189  ast_ari_response_error(response, 500,
190  "Internal Server Error", "Response validation failed");
191  }
192 #endif /* AST_DEVMODE */
193 
194 fin: __attribute__((unused))
195  return;
196 }
int ast_ari_validate_bridge(struct ast_json *json)
Validator for Bridge.
int ast_ari_bridges_create_parse_body(struct ast_json *body, struct ast_ari_bridges_create_args *args)
Body parsing function for /bridges.
void ast_ari_bridges_create(struct ast_variable *headers, struct ast_ari_bridges_create_args *args, struct ast_ari_response *response)
Create a new bridge.

References args, ast_ari_bridges_create(), ast_ari_bridges_create_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_bridge(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_create_parse_body()

int ast_ari_bridges_create_parse_body ( struct ast_json body,
struct ast_ari_bridges_create_args args 
)

Body parsing function for /bridges.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 107 of file res_ari_bridges.c.

110 {
111  struct ast_json *field;
112  /* Parse query parameters out of it */
113  field = ast_json_object_get(body, "type");
114  if (field) {
115  args->type = ast_json_string_get(field);
116  }
117  field = ast_json_object_get(body, "bridgeId");
118  if (field) {
119  args->bridge_id = ast_json_string_get(field);
120  }
121  field = ast_json_object_get(body, "name");
122  if (field) {
123  args->name = ast_json_string_get(field);
124  }
125  return 0;
126 }

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_create_cb().

◆ ast_ari_bridges_create_with_id_cb()

static void ast_ari_bridges_create_with_id_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 223 of file res_ari_bridges.c.

227 {
229  struct ast_variable *i;
230 #if defined(AST_DEVMODE)
231  int is_valid;
232  int code;
233 #endif /* AST_DEVMODE */
234 
235  for (i = get_params; i; i = i->next) {
236  if (strcmp(i->name, "type") == 0) {
237  args.type = (i->value);
238  } else
239  if (strcmp(i->name, "name") == 0) {
240  args.name = (i->value);
241  } else
242  {}
243  }
244  for (i = path_vars; i; i = i->next) {
245  if (strcmp(i->name, "bridgeId") == 0) {
246  args.bridge_id = (i->value);
247  } else
248  {}
249  }
252  goto fin;
253  }
254  ast_ari_bridges_create_with_id(headers, &args, response);
255 #if defined(AST_DEVMODE)
256  code = response->response_code;
257 
258  switch (code) {
259  case 0: /* Implementation is still a stub, or the code wasn't set */
260  is_valid = response->message == NULL;
261  break;
262  case 500: /* Internal Server Error */
263  case 501: /* Not Implemented */
264  is_valid = 1;
265  break;
266  default:
267  if (200 <= code && code <= 299) {
268  is_valid = ast_ari_validate_bridge(
269  response->message);
270  } else {
271  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}\n", code);
272  is_valid = 0;
273  }
274  }
275 
276  if (!is_valid) {
277  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}\n");
278  ast_ari_response_error(response, 500,
279  "Internal Server Error", "Response validation failed");
280  }
281 #endif /* AST_DEVMODE */
282 
283 fin: __attribute__((unused))
284  return;
285 }
int ast_ari_bridges_create_with_id_parse_body(struct ast_json *body, struct ast_ari_bridges_create_with_id_args *args)
Body parsing function for /bridges/{bridgeId}.
void ast_ari_bridges_create_with_id(struct ast_variable *headers, struct ast_ari_bridges_create_with_id_args *args, struct ast_ari_response *response)
Create a new bridge or updates an existing one.

References args, ast_ari_bridges_create_with_id(), ast_ari_bridges_create_with_id_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_bridge(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_create_with_id_parse_body()

int ast_ari_bridges_create_with_id_parse_body ( struct ast_json body,
struct ast_ari_bridges_create_with_id_args args 
)

Body parsing function for /bridges/{bridgeId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 197 of file res_ari_bridges.c.

200 {
201  struct ast_json *field;
202  /* Parse query parameters out of it */
203  field = ast_json_object_get(body, "type");
204  if (field) {
205  args->type = ast_json_string_get(field);
206  }
207  field = ast_json_object_get(body, "name");
208  if (field) {
209  args->name = ast_json_string_get(field);
210  }
211  return 0;
212 }

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_create_with_id_cb().

◆ ast_ari_bridges_destroy_cb()

static void ast_ari_bridges_destroy_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 355 of file res_ari_bridges.c.

359 {
361  struct ast_variable *i;
362 #if defined(AST_DEVMODE)
363  int is_valid;
364  int code;
365 #endif /* AST_DEVMODE */
366 
367  for (i = path_vars; i; i = i->next) {
368  if (strcmp(i->name, "bridgeId") == 0) {
369  args.bridge_id = (i->value);
370  } else
371  {}
372  }
373  ast_ari_bridges_destroy(headers, &args, response);
374 #if defined(AST_DEVMODE)
375  code = response->response_code;
376 
377  switch (code) {
378  case 0: /* Implementation is still a stub, or the code wasn't set */
379  is_valid = response->message == NULL;
380  break;
381  case 500: /* Internal Server Error */
382  case 501: /* Not Implemented */
383  case 404: /* Bridge not found */
384  is_valid = 1;
385  break;
386  default:
387  if (200 <= code && code <= 299) {
388  is_valid = ast_ari_validate_void(
389  response->message);
390  } else {
391  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}\n", code);
392  is_valid = 0;
393  }
394  }
395 
396  if (!is_valid) {
397  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}\n");
398  ast_ari_response_error(response, 500,
399  "Internal Server Error", "Response validation failed");
400  }
401 #endif /* AST_DEVMODE */
402 
403 fin: __attribute__((unused))
404  return;
405 }
void ast_ari_bridges_destroy(struct ast_variable *headers, struct ast_ari_bridges_destroy_args *args, struct ast_ari_response *response)
Shut down a bridge.

References args, ast_ari_bridges_destroy(), ast_ari_response_error(), ast_ari_validate_void(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_get_cb()

static void ast_ari_bridges_get_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 295 of file res_ari_bridges.c.

299 {
300  struct ast_ari_bridges_get_args args = {};
301  struct ast_variable *i;
302 #if defined(AST_DEVMODE)
303  int is_valid;
304  int code;
305 #endif /* AST_DEVMODE */
306 
307  for (i = path_vars; i; i = i->next) {
308  if (strcmp(i->name, "bridgeId") == 0) {
309  args.bridge_id = (i->value);
310  } else
311  {}
312  }
313  ast_ari_bridges_get(headers, &args, response);
314 #if defined(AST_DEVMODE)
315  code = response->response_code;
316 
317  switch (code) {
318  case 0: /* Implementation is still a stub, or the code wasn't set */
319  is_valid = response->message == NULL;
320  break;
321  case 500: /* Internal Server Error */
322  case 501: /* Not Implemented */
323  case 404: /* Bridge not found */
324  is_valid = 1;
325  break;
326  default:
327  if (200 <= code && code <= 299) {
328  is_valid = ast_ari_validate_bridge(
329  response->message);
330  } else {
331  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}\n", code);
332  is_valid = 0;
333  }
334  }
335 
336  if (!is_valid) {
337  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}\n");
338  ast_ari_response_error(response, 500,
339  "Internal Server Error", "Response validation failed");
340  }
341 #endif /* AST_DEVMODE */
342 
343 fin: __attribute__((unused))
344  return;
345 }
void ast_ari_bridges_get(struct ast_variable *headers, struct ast_ari_bridges_get_args *args, struct ast_ari_response *response)
Get bridge details.

References args, ast_ari_bridges_get(), ast_ari_response_error(), ast_ari_validate_bridge(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_list_cb()

static void ast_ari_bridges_list_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 64 of file res_ari_bridges.c.

68 {
69  struct ast_ari_bridges_list_args args = {};
70 #if defined(AST_DEVMODE)
71  int is_valid;
72  int code;
73 #endif /* AST_DEVMODE */
74 
75  ast_ari_bridges_list(headers, &args, response);
76 #if defined(AST_DEVMODE)
77  code = response->response_code;
78 
79  switch (code) {
80  case 0: /* Implementation is still a stub, or the code wasn't set */
81  is_valid = response->message == NULL;
82  break;
83  case 500: /* Internal Server Error */
84  case 501: /* Not Implemented */
85  is_valid = 1;
86  break;
87  default:
88  if (200 <= code && code <= 299) {
89  is_valid = ast_ari_validate_list(response->message,
91  } else {
92  ast_log(LOG_ERROR, "Invalid error response %d for /bridges\n", code);
93  is_valid = 0;
94  }
95  }
96 
97  if (!is_valid) {
98  ast_log(LOG_ERROR, "Response validation failed for /bridges\n");
99  ast_ari_response_error(response, 500,
100  "Internal Server Error", "Response validation failed");
101  }
102 #endif /* AST_DEVMODE */
103 
104 fin: __attribute__((unused))
105  return;
106 }
ari_validator ast_ari_validate_bridge_fn(void)
Function pointer to ast_ari_validate_bridge().
int ast_ari_validate_list(struct ast_json *json, int(*fn)(struct ast_json *))
Validator for a Swagger List[]/JSON array.
void ast_ari_bridges_list(struct ast_variable *headers, struct ast_ari_bridges_list_args *args, struct ast_ari_response *response)
List all active bridges in Asterisk.

References args, ast_ari_bridges_list(), ast_ari_response_error(), ast_ari_validate_bridge_fn(), ast_ari_validate_list(), ast_log, LOG_ERROR, ast_ari_response::message, NULL, and ast_ari_response::response_code.

◆ ast_ari_bridges_play_cb()

static void ast_ari_bridges_play_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/play.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 1073 of file res_ari_bridges.c.

1077 {
1078  struct ast_ari_bridges_play_args args = {};
1079  struct ast_variable *i;
1080 #if defined(AST_DEVMODE)
1081  int is_valid;
1082  int code;
1083 #endif /* AST_DEVMODE */
1084 
1085  for (i = get_params; i; i = i->next) {
1086  if (strcmp(i->name, "media") == 0) {
1087  /* Parse comma separated list */
1088  char *vals[MAX_VALS];
1089  size_t j;
1090 
1091  args.media_parse = ast_strdup(i->value);
1092  if (!args.media_parse) {
1094  goto fin;
1095  }
1096 
1097  if (strlen(args.media_parse) == 0) {
1098  /* ast_app_separate_args can't handle "" */
1099  args.media_count = 1;
1100  vals[0] = args.media_parse;
1101  } else {
1102  args.media_count = ast_app_separate_args(
1103  args.media_parse, ',', vals,
1104  ARRAY_LEN(vals));
1105  }
1106 
1107  if (args.media_count == 0) {
1109  goto fin;
1110  }
1111 
1112  if (args.media_count >= MAX_VALS) {
1113  ast_ari_response_error(response, 400,
1114  "Bad Request",
1115  "Too many values for media");
1116  goto fin;
1117  }
1118 
1119  args.media = ast_malloc(sizeof(*args.media) * args.media_count);
1120  if (!args.media) {
1122  goto fin;
1123  }
1124 
1125  for (j = 0; j < args.media_count; ++j) {
1126  args.media[j] = (vals[j]);
1127  }
1128  } else
1129  if (strcmp(i->name, "lang") == 0) {
1130  args.lang = (i->value);
1131  } else
1132  if (strcmp(i->name, "offsetms") == 0) {
1133  args.offsetms = atoi(i->value);
1134  } else
1135  if (strcmp(i->name, "skipms") == 0) {
1136  args.skipms = atoi(i->value);
1137  } else
1138  if (strcmp(i->name, "playbackId") == 0) {
1139  args.playback_id = (i->value);
1140  } else
1141  {}
1142  }
1143  for (i = path_vars; i; i = i->next) {
1144  if (strcmp(i->name, "bridgeId") == 0) {
1145  args.bridge_id = (i->value);
1146  } else
1147  {}
1148  }
1149  if (ast_ari_bridges_play_parse_body(body, &args)) {
1151  goto fin;
1152  }
1153  ast_ari_bridges_play(headers, &args, response);
1154 #if defined(AST_DEVMODE)
1155  code = response->response_code;
1156 
1157  switch (code) {
1158  case 0: /* Implementation is still a stub, or the code wasn't set */
1159  is_valid = response->message == NULL;
1160  break;
1161  case 500: /* Internal Server Error */
1162  case 501: /* Not Implemented */
1163  case 404: /* Bridge not found */
1164  case 409: /* Bridge not in a Stasis application */
1165  is_valid = 1;
1166  break;
1167  default:
1168  if (200 <= code && code <= 299) {
1169  is_valid = ast_ari_validate_playback(
1170  response->message);
1171  } else {
1172  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/play\n", code);
1173  is_valid = 0;
1174  }
1175  }
1176 
1177  if (!is_valid) {
1178  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/play\n");
1179  ast_ari_response_error(response, 500,
1180  "Internal Server Error", "Response validation failed");
1181  }
1182 #endif /* AST_DEVMODE */
1183 
1184 fin: __attribute__((unused))
1185  ast_free(args.media_parse);
1186  ast_free(args.media);
1187  return;
1188 }
int ast_ari_validate_playback(struct ast_json *json)
Validator for Playback.
int ast_ari_bridges_play_parse_body(struct ast_json *body, struct ast_ari_bridges_play_args *args)
Body parsing function for /bridges/{bridgeId}/play.
void ast_ari_bridges_play(struct ast_variable *headers, struct ast_ari_bridges_play_args *args, struct ast_ari_response *response)
Start playback of media on a bridge.

References args, ARRAY_LEN, ast_app_separate_args, ast_ari_bridges_play(), ast_ari_bridges_play_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_playback(), ast_free, ast_log, ast_malloc, ast_strdup, LOG_ERROR, MAX_VALS, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_play_parse_body()

int ast_ari_bridges_play_parse_body ( struct ast_json body,
struct ast_ari_bridges_play_args args 
)

Body parsing function for /bridges/{bridgeId}/play.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1010 of file res_ari_bridges.c.

1013 {
1014  struct ast_json *field;
1015  /* Parse query parameters out of it */
1016  field = ast_json_object_get(body, "media");
1017  if (field) {
1018  /* If they were silly enough to both pass in a query param and a
1019  * JSON body, free up the query value.
1020  */
1021  ast_free(args->media);
1022  if (ast_json_typeof(field) == AST_JSON_ARRAY) {
1023  /* Multiple param passed as array */
1024  size_t i;
1025  args->media_count = ast_json_array_size(field);
1026  args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1027 
1028  if (!args->media) {
1029  return -1;
1030  }
1031 
1032  for (i = 0; i < args->media_count; ++i) {
1033  args->media[i] = ast_json_string_get(ast_json_array_get(field, i));
1034  }
1035  } else {
1036  /* Multiple param passed as single value */
1037  args->media_count = 1;
1038  args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1039  if (!args->media) {
1040  return -1;
1041  }
1042  args->media[0] = ast_json_string_get(field);
1043  }
1044  }
1045  field = ast_json_object_get(body, "lang");
1046  if (field) {
1047  args->lang = ast_json_string_get(field);
1048  }
1049  field = ast_json_object_get(body, "offsetms");
1050  if (field) {
1051  args->offsetms = ast_json_integer_get(field);
1052  }
1053  field = ast_json_object_get(body, "skipms");
1054  if (field) {
1055  args->skipms = ast_json_integer_get(field);
1056  }
1057  field = ast_json_object_get(body, "playbackId");
1058  if (field) {
1059  args->playback_id = ast_json_string_get(field);
1060  }
1061  return 0;
1062 }
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
Definition: json.c:322

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_integer_get(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_play_cb().

◆ ast_ari_bridges_play_with_id_cb()

static void ast_ari_bridges_play_with_id_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/play/{playbackId}.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 1248 of file res_ari_bridges.c.

1252 {
1254  struct ast_variable *i;
1255 #if defined(AST_DEVMODE)
1256  int is_valid;
1257  int code;
1258 #endif /* AST_DEVMODE */
1259 
1260  for (i = get_params; i; i = i->next) {
1261  if (strcmp(i->name, "media") == 0) {
1262  /* Parse comma separated list */
1263  char *vals[MAX_VALS];
1264  size_t j;
1265 
1266  args.media_parse = ast_strdup(i->value);
1267  if (!args.media_parse) {
1269  goto fin;
1270  }
1271 
1272  if (strlen(args.media_parse) == 0) {
1273  /* ast_app_separate_args can't handle "" */
1274  args.media_count = 1;
1275  vals[0] = args.media_parse;
1276  } else {
1277  args.media_count = ast_app_separate_args(
1278  args.media_parse, ',', vals,
1279  ARRAY_LEN(vals));
1280  }
1281 
1282  if (args.media_count == 0) {
1284  goto fin;
1285  }
1286 
1287  if (args.media_count >= MAX_VALS) {
1288  ast_ari_response_error(response, 400,
1289  "Bad Request",
1290  "Too many values for media");
1291  goto fin;
1292  }
1293 
1294  args.media = ast_malloc(sizeof(*args.media) * args.media_count);
1295  if (!args.media) {
1297  goto fin;
1298  }
1299 
1300  for (j = 0; j < args.media_count; ++j) {
1301  args.media[j] = (vals[j]);
1302  }
1303  } else
1304  if (strcmp(i->name, "lang") == 0) {
1305  args.lang = (i->value);
1306  } else
1307  if (strcmp(i->name, "offsetms") == 0) {
1308  args.offsetms = atoi(i->value);
1309  } else
1310  if (strcmp(i->name, "skipms") == 0) {
1311  args.skipms = atoi(i->value);
1312  } else
1313  {}
1314  }
1315  for (i = path_vars; i; i = i->next) {
1316  if (strcmp(i->name, "bridgeId") == 0) {
1317  args.bridge_id = (i->value);
1318  } else
1319  if (strcmp(i->name, "playbackId") == 0) {
1320  args.playback_id = (i->value);
1321  } else
1322  {}
1323  }
1326  goto fin;
1327  }
1328  ast_ari_bridges_play_with_id(headers, &args, response);
1329 #if defined(AST_DEVMODE)
1330  code = response->response_code;
1331 
1332  switch (code) {
1333  case 0: /* Implementation is still a stub, or the code wasn't set */
1334  is_valid = response->message == NULL;
1335  break;
1336  case 500: /* Internal Server Error */
1337  case 501: /* Not Implemented */
1338  case 404: /* Bridge not found */
1339  case 409: /* Bridge not in a Stasis application */
1340  is_valid = 1;
1341  break;
1342  default:
1343  if (200 <= code && code <= 299) {
1344  is_valid = ast_ari_validate_playback(
1345  response->message);
1346  } else {
1347  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/play/{playbackId}\n", code);
1348  is_valid = 0;
1349  }
1350  }
1351 
1352  if (!is_valid) {
1353  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/play/{playbackId}\n");
1354  ast_ari_response_error(response, 500,
1355  "Internal Server Error", "Response validation failed");
1356  }
1357 #endif /* AST_DEVMODE */
1358 
1359 fin: __attribute__((unused))
1360  ast_free(args.media_parse);
1361  ast_free(args.media);
1362  return;
1363 }
int ast_ari_bridges_play_with_id_parse_body(struct ast_json *body, struct ast_ari_bridges_play_with_id_args *args)
Body parsing function for /bridges/{bridgeId}/play/{playbackId}.
void ast_ari_bridges_play_with_id(struct ast_variable *headers, struct ast_ari_bridges_play_with_id_args *args, struct ast_ari_response *response)
Start playback of media on a bridge.

References args, ARRAY_LEN, ast_app_separate_args, ast_ari_bridges_play_with_id(), ast_ari_bridges_play_with_id_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_playback(), ast_free, ast_log, ast_malloc, ast_strdup, LOG_ERROR, MAX_VALS, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_play_with_id_parse_body()

int ast_ari_bridges_play_with_id_parse_body ( struct ast_json body,
struct ast_ari_bridges_play_with_id_args args 
)

Body parsing function for /bridges/{bridgeId}/play/{playbackId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1189 of file res_ari_bridges.c.

1192 {
1193  struct ast_json *field;
1194  /* Parse query parameters out of it */
1195  field = ast_json_object_get(body, "media");
1196  if (field) {
1197  /* If they were silly enough to both pass in a query param and a
1198  * JSON body, free up the query value.
1199  */
1200  ast_free(args->media);
1201  if (ast_json_typeof(field) == AST_JSON_ARRAY) {
1202  /* Multiple param passed as array */
1203  size_t i;
1204  args->media_count = ast_json_array_size(field);
1205  args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1206 
1207  if (!args->media) {
1208  return -1;
1209  }
1210 
1211  for (i = 0; i < args->media_count; ++i) {
1212  args->media[i] = ast_json_string_get(ast_json_array_get(field, i));
1213  }
1214  } else {
1215  /* Multiple param passed as single value */
1216  args->media_count = 1;
1217  args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1218  if (!args->media) {
1219  return -1;
1220  }
1221  args->media[0] = ast_json_string_get(field);
1222  }
1223  }
1224  field = ast_json_object_get(body, "lang");
1225  if (field) {
1226  args->lang = ast_json_string_get(field);
1227  }
1228  field = ast_json_object_get(body, "offsetms");
1229  if (field) {
1230  args->offsetms = ast_json_integer_get(field);
1231  }
1232  field = ast_json_object_get(body, "skipms");
1233  if (field) {
1234  args->skipms = ast_json_integer_get(field);
1235  }
1236  return 0;
1237 }

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_integer_get(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_play_with_id_cb().

◆ ast_ari_bridges_record_cb()

static void ast_ari_bridges_record_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/record.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 1410 of file res_ari_bridges.c.

1414 {
1415  struct ast_ari_bridges_record_args args = {};
1416  struct ast_variable *i;
1417 #if defined(AST_DEVMODE)
1418  int is_valid;
1419  int code;
1420 #endif /* AST_DEVMODE */
1421 
1422  for (i = get_params; i; i = i->next) {
1423  if (strcmp(i->name, "name") == 0) {
1424  args.name = (i->value);
1425  } else
1426  if (strcmp(i->name, "format") == 0) {
1427  args.format = (i->value);
1428  } else
1429  if (strcmp(i->name, "maxDurationSeconds") == 0) {
1430  args.max_duration_seconds = atoi(i->value);
1431  } else
1432  if (strcmp(i->name, "maxSilenceSeconds") == 0) {
1433  args.max_silence_seconds = atoi(i->value);
1434  } else
1435  if (strcmp(i->name, "ifExists") == 0) {
1436  args.if_exists = (i->value);
1437  } else
1438  if (strcmp(i->name, "beep") == 0) {
1439  args.beep = ast_true(i->value);
1440  } else
1441  if (strcmp(i->name, "terminateOn") == 0) {
1442  args.terminate_on = (i->value);
1443  } else
1444  {}
1445  }
1446  for (i = path_vars; i; i = i->next) {
1447  if (strcmp(i->name, "bridgeId") == 0) {
1448  args.bridge_id = (i->value);
1449  } else
1450  {}
1451  }
1454  goto fin;
1455  }
1456  ast_ari_bridges_record(headers, &args, response);
1457 #if defined(AST_DEVMODE)
1458  code = response->response_code;
1459 
1460  switch (code) {
1461  case 0: /* Implementation is still a stub, or the code wasn't set */
1462  is_valid = response->message == NULL;
1463  break;
1464  case 500: /* Internal Server Error */
1465  case 501: /* Not Implemented */
1466  case 400: /* Invalid parameters */
1467  case 404: /* Bridge not found */
1468  case 409: /* Bridge is not in a Stasis application; A recording with the same name already exists on the system and can not be overwritten because it is in progress or ifExists=fail */
1469  case 422: /* The format specified is unknown on this system */
1470  is_valid = 1;
1471  break;
1472  default:
1473  if (200 <= code && code <= 299) {
1475  response->message);
1476  } else {
1477  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/record\n", code);
1478  is_valid = 0;
1479  }
1480  }
1481 
1482  if (!is_valid) {
1483  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/record\n");
1484  ast_ari_response_error(response, 500,
1485  "Internal Server Error", "Response validation failed");
1486  }
1487 #endif /* AST_DEVMODE */
1488 
1489 fin: __attribute__((unused))
1490  return;
1491 }
int ast_ari_validate_live_recording(struct ast_json *json)
Validator for LiveRecording.
int ast_ari_bridges_record_parse_body(struct ast_json *body, struct ast_ari_bridges_record_args *args)
Body parsing function for /bridges/{bridgeId}/record.
void ast_ari_bridges_record(struct ast_variable *headers, struct ast_ari_bridges_record_args *args, struct ast_ari_response *response)
Start a recording.

References args, ast_ari_bridges_record(), ast_ari_bridges_record_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_live_recording(), ast_log, ast_true(), LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_record_parse_body()

int ast_ari_bridges_record_parse_body ( struct ast_json body,
struct ast_ari_bridges_record_args args 
)

Body parsing function for /bridges/{bridgeId}/record.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1364 of file res_ari_bridges.c.

1367 {
1368  struct ast_json *field;
1369  /* Parse query parameters out of it */
1370  field = ast_json_object_get(body, "name");
1371  if (field) {
1372  args->name = ast_json_string_get(field);
1373  }
1374  field = ast_json_object_get(body, "format");
1375  if (field) {
1376  args->format = ast_json_string_get(field);
1377  }
1378  field = ast_json_object_get(body, "maxDurationSeconds");
1379  if (field) {
1380  args->max_duration_seconds = ast_json_integer_get(field);
1381  }
1382  field = ast_json_object_get(body, "maxSilenceSeconds");
1383  if (field) {
1384  args->max_silence_seconds = ast_json_integer_get(field);
1385  }
1386  field = ast_json_object_get(body, "ifExists");
1387  if (field) {
1388  args->if_exists = ast_json_string_get(field);
1389  }
1390  field = ast_json_object_get(body, "beep");
1391  if (field) {
1392  args->beep = ast_json_is_true(field);
1393  }
1394  field = ast_json_object_get(body, "terminateOn");
1395  if (field) {
1396  args->terminate_on = ast_json_string_get(field);
1397  }
1398  return 0;
1399 }

References args, ast_json_integer_get(), ast_json_is_true(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_record_cb().

◆ ast_ari_bridges_remove_channel_cb()

static void ast_ari_bridges_remove_channel_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/removeChannel.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 634 of file res_ari_bridges.c.

638 {
640  struct ast_variable *i;
641 #if defined(AST_DEVMODE)
642  int is_valid;
643  int code;
644 #endif /* AST_DEVMODE */
645 
646  for (i = get_params; i; i = i->next) {
647  if (strcmp(i->name, "channel") == 0) {
648  /* Parse comma separated list */
649  char *vals[MAX_VALS];
650  size_t j;
651 
652  args.channel_parse = ast_strdup(i->value);
653  if (!args.channel_parse) {
655  goto fin;
656  }
657 
658  if (strlen(args.channel_parse) == 0) {
659  /* ast_app_separate_args can't handle "" */
660  args.channel_count = 1;
661  vals[0] = args.channel_parse;
662  } else {
663  args.channel_count = ast_app_separate_args(
664  args.channel_parse, ',', vals,
665  ARRAY_LEN(vals));
666  }
667 
668  if (args.channel_count == 0) {
670  goto fin;
671  }
672 
673  if (args.channel_count >= MAX_VALS) {
674  ast_ari_response_error(response, 400,
675  "Bad Request",
676  "Too many values for channel");
677  goto fin;
678  }
679 
680  args.channel = ast_malloc(sizeof(*args.channel) * args.channel_count);
681  if (!args.channel) {
683  goto fin;
684  }
685 
686  for (j = 0; j < args.channel_count; ++j) {
687  args.channel[j] = (vals[j]);
688  }
689  } else
690  {}
691  }
692  for (i = path_vars; i; i = i->next) {
693  if (strcmp(i->name, "bridgeId") == 0) {
694  args.bridge_id = (i->value);
695  } else
696  {}
697  }
700  goto fin;
701  }
702  ast_ari_bridges_remove_channel(headers, &args, response);
703 #if defined(AST_DEVMODE)
704  code = response->response_code;
705 
706  switch (code) {
707  case 0: /* Implementation is still a stub, or the code wasn't set */
708  is_valid = response->message == NULL;
709  break;
710  case 500: /* Internal Server Error */
711  case 501: /* Not Implemented */
712  case 400: /* Channel not found */
713  case 404: /* Bridge not found */
714  case 409: /* Bridge not in Stasis application */
715  case 422: /* Channel not in this bridge */
716  is_valid = 1;
717  break;
718  default:
719  if (200 <= code && code <= 299) {
720  is_valid = ast_ari_validate_void(
721  response->message);
722  } else {
723  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/removeChannel\n", code);
724  is_valid = 0;
725  }
726  }
727 
728  if (!is_valid) {
729  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/removeChannel\n");
730  ast_ari_response_error(response, 500,
731  "Internal Server Error", "Response validation failed");
732  }
733 #endif /* AST_DEVMODE */
734 
735 fin: __attribute__((unused))
736  ast_free(args.channel_parse);
737  ast_free(args.channel);
738  return;
739 }
int ast_ari_bridges_remove_channel_parse_body(struct ast_json *body, struct ast_ari_bridges_remove_channel_args *args)
Body parsing function for /bridges/{bridgeId}/removeChannel.
void ast_ari_bridges_remove_channel(struct ast_variable *headers, struct ast_ari_bridges_remove_channel_args *args, struct ast_ari_response *response)
Remove a channel from a bridge.

References args, ARRAY_LEN, ast_app_separate_args, ast_ari_bridges_remove_channel(), ast_ari_bridges_remove_channel_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_void(), ast_free, ast_log, ast_malloc, ast_strdup, LOG_ERROR, MAX_VALS, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_remove_channel_parse_body()

int ast_ari_bridges_remove_channel_parse_body ( struct ast_json body,
struct ast_ari_bridges_remove_channel_args args 
)

Body parsing function for /bridges/{bridgeId}/removeChannel.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 587 of file res_ari_bridges.c.

590 {
591  struct ast_json *field;
592  /* Parse query parameters out of it */
593  field = ast_json_object_get(body, "channel");
594  if (field) {
595  /* If they were silly enough to both pass in a query param and a
596  * JSON body, free up the query value.
597  */
598  ast_free(args->channel);
599  if (ast_json_typeof(field) == AST_JSON_ARRAY) {
600  /* Multiple param passed as array */
601  size_t i;
602  args->channel_count = ast_json_array_size(field);
603  args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
604 
605  if (!args->channel) {
606  return -1;
607  }
608 
609  for (i = 0; i < args->channel_count; ++i) {
610  args->channel[i] = ast_json_string_get(ast_json_array_get(field, i));
611  }
612  } else {
613  /* Multiple param passed as single value */
614  args->channel_count = 1;
615  args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
616  if (!args->channel) {
617  return -1;
618  }
619  args->channel[0] = ast_json_string_get(field);
620  }
621  }
622  return 0;
623 }

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_remove_channel_cb().

◆ ast_ari_bridges_set_video_source_cb()

static void ast_ari_bridges_set_video_source_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/videoSource/{channelId}.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 749 of file res_ari_bridges.c.

753 {
755  struct ast_variable *i;
756 #if defined(AST_DEVMODE)
757  int is_valid;
758  int code;
759 #endif /* AST_DEVMODE */
760 
761  for (i = path_vars; i; i = i->next) {
762  if (strcmp(i->name, "bridgeId") == 0) {
763  args.bridge_id = (i->value);
764  } else
765  if (strcmp(i->name, "channelId") == 0) {
766  args.channel_id = (i->value);
767  } else
768  {}
769  }
770  ast_ari_bridges_set_video_source(headers, &args, response);
771 #if defined(AST_DEVMODE)
772  code = response->response_code;
773 
774  switch (code) {
775  case 0: /* Implementation is still a stub, or the code wasn't set */
776  is_valid = response->message == NULL;
777  break;
778  case 500: /* Internal Server Error */
779  case 501: /* Not Implemented */
780  case 404: /* Bridge or Channel not found */
781  case 409: /* Channel not in Stasis application */
782  case 422: /* Channel not in this Bridge */
783  is_valid = 1;
784  break;
785  default:
786  if (200 <= code && code <= 299) {
787  is_valid = ast_ari_validate_void(
788  response->message);
789  } else {
790  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/videoSource/{channelId}\n", code);
791  is_valid = 0;
792  }
793  }
794 
795  if (!is_valid) {
796  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/videoSource/{channelId}\n");
797  ast_ari_response_error(response, 500,
798  "Internal Server Error", "Response validation failed");
799  }
800 #endif /* AST_DEVMODE */
801 
802 fin: __attribute__((unused))
803  return;
804 }
void ast_ari_bridges_set_video_source(struct ast_variable *headers, struct ast_ari_bridges_set_video_source_args *args, struct ast_ari_response *response)
Set a channel as the video source in a multi-party mixing bridge. This operation has no effect on bri...

References args, ast_ari_bridges_set_video_source(), ast_ari_response_error(), ast_ari_validate_void(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_start_moh_cb()

static void ast_ari_bridges_start_moh_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/moh.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 887 of file res_ari_bridges.c.

891 {
893  struct ast_variable *i;
894 #if defined(AST_DEVMODE)
895  int is_valid;
896  int code;
897 #endif /* AST_DEVMODE */
898 
899  for (i = get_params; i; i = i->next) {
900  if (strcmp(i->name, "mohClass") == 0) {
901  args.moh_class = (i->value);
902  } else
903  {}
904  }
905  for (i = path_vars; i; i = i->next) {
906  if (strcmp(i->name, "bridgeId") == 0) {
907  args.bridge_id = (i->value);
908  } else
909  {}
910  }
913  goto fin;
914  }
915  ast_ari_bridges_start_moh(headers, &args, response);
916 #if defined(AST_DEVMODE)
917  code = response->response_code;
918 
919  switch (code) {
920  case 0: /* Implementation is still a stub, or the code wasn't set */
921  is_valid = response->message == NULL;
922  break;
923  case 500: /* Internal Server Error */
924  case 501: /* Not Implemented */
925  case 404: /* Bridge not found */
926  case 409: /* Bridge not in Stasis application */
927  is_valid = 1;
928  break;
929  default:
930  if (200 <= code && code <= 299) {
931  is_valid = ast_ari_validate_void(
932  response->message);
933  } else {
934  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/moh\n", code);
935  is_valid = 0;
936  }
937  }
938 
939  if (!is_valid) {
940  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/moh\n");
941  ast_ari_response_error(response, 500,
942  "Internal Server Error", "Response validation failed");
943  }
944 #endif /* AST_DEVMODE */
945 
946 fin: __attribute__((unused))
947  return;
948 }
int ast_ari_bridges_start_moh_parse_body(struct ast_json *body, struct ast_ari_bridges_start_moh_args *args)
Body parsing function for /bridges/{bridgeId}/moh.
void ast_ari_bridges_start_moh(struct ast_variable *headers, struct ast_ari_bridges_start_moh_args *args, struct ast_ari_response *response)
Play music on hold to a bridge or change the MOH class that is playing.

References args, ast_ari_bridges_start_moh(), ast_ari_bridges_start_moh_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_validate_void(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ ast_ari_bridges_start_moh_parse_body()

int ast_ari_bridges_start_moh_parse_body ( struct ast_json body,
struct ast_ari_bridges_start_moh_args args 
)

Body parsing function for /bridges/{bridgeId}/moh.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 865 of file res_ari_bridges.c.

868 {
869  struct ast_json *field;
870  /* Parse query parameters out of it */
871  field = ast_json_object_get(body, "mohClass");
872  if (field) {
873  args->moh_class = ast_json_string_get(field);
874  }
875  return 0;
876 }

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_start_moh_cb().

◆ ast_ari_bridges_stop_moh_cb()

static void ast_ari_bridges_stop_moh_cb ( struct ast_tcptls_session_instance ser,
struct ast_variable get_params,
struct ast_variable path_vars,
struct ast_variable headers,
struct ast_json body,
struct ast_ari_response response 
)
static

Parameter parsing callback for /bridges/{bridgeId}/moh.

Parameters
serTCP/TLS session object
get_paramsGET parameters in the HTTP request.
path_varsPath variables extracted from the request.
headersHTTP headers.
body
[out]responseResponse to the HTTP request.

Definition at line 958 of file res_ari_bridges.c.

962 {
964  struct ast_variable *i;
965 #if defined(AST_DEVMODE)
966  int is_valid;
967  int code;
968 #endif /* AST_DEVMODE */
969 
970  for (i = path_vars; i; i = i->next) {
971  if (strcmp(i->name, "bridgeId") == 0) {
972  args.bridge_id = (i->value);
973  } else
974  {}
975  }
976  ast_ari_bridges_stop_moh(headers, &args, response);
977 #if defined(AST_DEVMODE)
978  code = response->response_code;
979 
980  switch (code) {
981  case 0: /* Implementation is still a stub, or the code wasn't set */
982  is_valid = response->message == NULL;
983  break;
984  case 500: /* Internal Server Error */
985  case 501: /* Not Implemented */
986  case 404: /* Bridge not found */
987  case 409: /* Bridge not in Stasis application */
988  is_valid = 1;
989  break;
990  default:
991  if (200 <= code && code <= 299) {
992  is_valid = ast_ari_validate_void(
993  response->message);
994  } else {
995  ast_log(LOG_ERROR, "Invalid error response %d for /bridges/{bridgeId}/moh\n", code);
996  is_valid = 0;
997  }
998  }
999 
1000  if (!is_valid) {
1001  ast_log(LOG_ERROR, "Response validation failed for /bridges/{bridgeId}/moh\n");
1002  ast_ari_response_error(response, 500,
1003  "Internal Server Error", "Response validation failed");
1004  }
1005 #endif /* AST_DEVMODE */
1006 
1007 fin: __attribute__((unused))
1008  return;
1009 }
void ast_ari_bridges_stop_moh(struct ast_variable *headers, struct ast_ari_bridges_stop_moh_args *args, struct ast_ari_response *response)
Stop playing music on hold to a bridge.

References args, ast_ari_bridges_stop_moh(), ast_ari_response_error(), ast_ari_validate_void(), ast_log, LOG_ERROR, ast_ari_response::message, ast_variable::name, ast_variable::next, NULL, ast_ari_response::response_code, and ast_variable::value.

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 1616 of file res_ari_bridges.c.

◆ load_module()

static int load_module ( void  )
static

Definition at line 1597 of file res_ari_bridges.c.

1598 {
1599  int res = 0;
1600 
1601 
1602  res |= ast_ari_add_handler(&bridges);
1603  if (res) {
1604  unload_module();
1605  return AST_MODULE_LOAD_DECLINE;
1606  }
1607 
1608  return AST_MODULE_LOAD_SUCCESS;
1609 }
int ast_ari_add_handler(struct stasis_rest_handlers *handler)
Definition: res_ari.c:179
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
static int unload_module(void)
static struct stasis_rest_handlers bridges
REST handler for /api-docs/bridges.json.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 1591 of file res_ari_bridges.c.

1592 {
1594  return 0;
1595 }
int ast_ari_remove_handler(struct stasis_rest_handlers *handler)
Definition: res_ari.c:202

References ast_ari_remove_handler(), and bridges.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "RESTful API module - Bridge resources" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "res_ari,res_ari_model,res_stasis,res_stasis_recording,res_stasis_playback", }
static

Definition at line 1597 of file res_ari_bridges.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 1616 of file res_ari_bridges.c.

◆ bridges

struct stasis_rest_handlers bridges
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

Referenced by unload_module().

◆ bridges_bridgeId

struct stasis_rest_handlers bridges_bridgeId
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_addChannel

struct stasis_rest_handlers bridges_bridgeId_addChannel
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_moh

struct stasis_rest_handlers bridges_bridgeId_moh
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_play

struct stasis_rest_handlers bridges_bridgeId_play
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_play_playbackId

struct stasis_rest_handlers bridges_bridgeId_play_playbackId
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_record

struct stasis_rest_handlers bridges_bridgeId_record
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_removeChannel

struct stasis_rest_handlers bridges_bridgeId_removeChannel
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_videoSource

struct stasis_rest_handlers bridges_bridgeId_videoSource
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.

◆ bridges_bridgeId_videoSource_channelId

struct stasis_rest_handlers bridges_bridgeId_videoSource_channelId
static

REST handler for /api-docs/bridges.json.

Definition at line 1410 of file res_ari_bridges.c.