Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Functions
resource_bridges.h File Reference

Generated file - declares stubs to be implemented in res/ari/resource_bridges.c. More...

#include "asterisk/ari.h"
Include dependency graph for resource_bridges.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_ari_bridges_add_channel_args
 
struct  ast_ari_bridges_clear_video_source_args
 
struct  ast_ari_bridges_create_args
 
struct  ast_ari_bridges_create_with_id_args
 
struct  ast_ari_bridges_destroy_args
 
struct  ast_ari_bridges_get_args
 
struct  ast_ari_bridges_list_args
 
struct  ast_ari_bridges_play_args
 
struct  ast_ari_bridges_play_with_id_args
 
struct  ast_ari_bridges_record_args
 
struct  ast_ari_bridges_remove_channel_args
 
struct  ast_ari_bridges_set_video_source_args
 
struct  ast_ari_bridges_start_moh_args
 
struct  ast_ari_bridges_stop_moh_args
 

Functions

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. 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...
 
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 bridges with two or fewer participants. When no explicit video source is set, talk detection will be used to determine the active video stream. More...
 
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. 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...
 
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. 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...
 
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. More...
 
void ast_ari_bridges_get (struct ast_variable *headers, struct ast_ari_bridges_get_args *args, struct ast_ari_response *response)
 Get bridge details. More...
 
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. More...
 
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. 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...
 
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. 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...
 
void ast_ari_bridges_record (struct ast_variable *headers, struct ast_ari_bridges_record_args *args, struct ast_ari_response *response)
 Start a recording. 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...
 
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. 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...
 
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 bridges with two or fewer participants. More...
 
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. 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...
 
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. More...
 

Detailed Description

Generated file - declares stubs to be implemented in res/ari/resource_bridges.c.

Bridge resources

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

Definition in file resource_bridges.h.

Function Documentation

◆ ast_ari_bridges_add_channel()

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.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 191 of file resource_bridges.c.

194 {
195  RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
196  RAII_VAR(struct control_list *, list, NULL, ao2_cleanup);
197  size_t i;
198  int has_error = 0;
199 
200  if (!bridge) {
201  /* Response filled in by find_bridge() */
202  return;
203  }
204 
205  list = control_list_create(response, args->channel_count, args->channel);
206  if (!list) {
207  /* Response filled in by control_list_create() */
208  return;
209  }
210 
211  for (i = 0; i < list->count; ++i) {
212  stasis_app_control_clear_roles(list->controls[i]);
213  if (!ast_strlen_zero(args->role)) {
214  if (stasis_app_control_add_role(list->controls[i], args->role)) {
216  return;
217  }
218  }
219 
220  /* Apply bridge features to each of the channel controls */
221  if (!stasis_app_control_bridge_features_init(list->controls[i])) {
222  stasis_app_control_absorb_dtmf_in_bridge(list->controls[i], args->absorb_dtmf);
223  stasis_app_control_mute_in_bridge(list->controls[i], args->mute);
224  stasis_app_control_inhibit_colp_in_bridge(list->controls[i], args->inhibit_connected_line_updates);
225  }
226  }
227 
228  for (i = 0; i < list->count; ++i) {
229  if ((has_error = check_add_remove_channel(response, list->controls[i],
231  list->controls[i], bridge)))) {
232  break;
233  }
234  }
235 
236  if (!has_error) {
237  ast_ari_response_no_content(response);
238  }
239 }
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
void ast_ari_response_no_content(struct ast_ari_response *response)
Fill in a No Content (204) ast_ari_response.
Definition: res_ari.c:284
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define NULL
Definition: resample.c:96
static int check_add_remove_channel(struct ast_ari_response *response, struct stasis_app_control *control, enum stasis_app_control_channel_result result)
static struct control_list * control_list_create(struct ast_ari_response *response, size_t count, const char **channels)
static struct ast_bridge * find_bridge(struct ast_ari_response *response, const char *bridge_id)
Finds a bridge, filling the response with an error, if appropriate.
void stasis_app_control_mute_in_bridge(struct stasis_app_control *control, int mute)
Set whether audio from the channel is muted instead of passing through to the bridge.
Definition: control.c:1470
int stasis_app_control_add_channel_to_bridge(struct stasis_app_control *control, struct ast_bridge *bridge)
Add a channel to the bridge.
Definition: control.c:1383
void stasis_app_control_clear_roles(struct stasis_app_control *control)
Clear bridge roles currently applied to a channel controlled by a stasis app control.
Definition: control.c:338
void stasis_app_control_absorb_dtmf_in_bridge(struct stasis_app_control *control, int absorb)
Set whether DTMF from the channel is absorbed instead of passing through to the bridge.
Definition: control.c:1464
int stasis_app_control_add_role(struct stasis_app_control *control, const char *role)
Apply a bridge role to a channel controlled by a stasis app control.
Definition: control.c:316
void stasis_app_control_inhibit_colp_in_bridge(struct stasis_app_control *control, int inhibit_colp)
Set whether COLP frames should be generated when joining the bridge.
Definition: control.c:1476
int stasis_app_control_bridge_features_init(struct stasis_app_control *control)
Initialize bridge features into a channel control.
Definition: control.c:1451
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Structure that contains information about a bridge.
Definition: bridge.h:349
const char * args
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:936

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_no_content(), ast_strlen_zero(), check_add_remove_channel(), control_list_create(), find_bridge(), NULL, RAII_VAR, stasis_app_control_absorb_dtmf_in_bridge(), stasis_app_control_add_channel_to_bridge(), stasis_app_control_add_role(), stasis_app_control_bridge_features_init(), stasis_app_control_clear_roles(), stasis_app_control_inhibit_colp_in_bridge(), and stasis_app_control_mute_in_bridge().

Referenced by ast_ari_bridges_add_channel_cb().

◆ 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 }
#define ast_free(a)
Definition: astmm.h:180
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
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()

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 bridges with two or fewer participants. When no explicit video source is set, talk detection will be used to determine the active video stream.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1064 of file resource_bridges.c.

1066 {
1067  struct ast_bridge *bridge;
1068 
1069  bridge = find_bridge(response, args->bridge_id);
1070  if (!bridge) {
1071  return;
1072  }
1073 
1074  ast_bridge_lock(bridge);
1076  ast_bridge_unlock(bridge);
1077 
1078  ao2_ref(bridge, -1);
1079  ast_ari_response_no_content(response);
1080 }
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
void ast_bridge_set_talker_src_video_mode(struct ast_bridge *bridge)
Set the bridge to pick the strongest talker supporting video as the single source video feed.
Definition: bridge.c:3766
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:481
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:470

References ao2_ref, args, ast_ari_response_no_content(), ast_bridge_lock, ast_bridge_set_talker_src_video_mode(), ast_bridge_unlock, and find_bridge().

Referenced by ast_ari_bridges_clear_video_source_cb().

◆ ast_ari_bridges_create()

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.

This bridge persists until it has been shut down, or Asterisk has been shut down.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 938 of file resource_bridges.c.

941 {
942  RAII_VAR(struct ast_bridge *, bridge, stasis_app_bridge_create(args->type, args->name, args->bridge_id), ao2_cleanup);
943  RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
944 
945  if (!bridge) {
947  response, 500, "Internal Error",
948  "Unable to create bridge");
949  return;
950  }
951 
952  ast_bridge_lock(bridge);
953  snapshot = ast_bridge_snapshot_create(bridge);
954  ast_bridge_unlock(bridge);
955 
956  if (!snapshot) {
958  response, 500, "Internal Error",
959  "Unable to create snapshot for new bridge");
960  return;
961  }
962 
963  ast_ari_response_ok(response,
965 }
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_ok(struct ast_ari_response *response, struct ast_json *message)
Fill in an OK (200) ast_ari_response.
Definition: res_ari.c:276
struct stasis_message_sanitizer * stasis_app_get_sanitizer(void)
Get the Stasis message sanitizer for app_stasis applications.
Definition: res_stasis.c:2264
struct ast_bridge * stasis_app_bridge_create(const char *type, const char *name, const char *id)
Create a bridge of the specified type.
Definition: res_stasis.c:851
struct ast_json * ast_bridge_snapshot_to_json(const struct ast_bridge_snapshot *snapshot, const struct stasis_message_sanitizer *sanitize)
Build a JSON object from a ast_bridge_snapshot.
struct ast_bridge_snapshot * ast_bridge_snapshot_create(struct ast_bridge *bridge)
Generate a snapshot of the bridge state. This is an ao2 object, so ao2_cleanup() to deallocate.
Structure that contains a snapshot of information about a bridge.
Definition: bridge.h:314

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_ok(), ast_bridge_lock, ast_bridge_snapshot_create(), ast_bridge_snapshot_to_json(), ast_bridge_unlock, NULL, RAII_VAR, stasis_app_bridge_create(), and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_create_cb().

◆ 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()

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.

This bridge persists until it has been shut down, or Asterisk has been shut down.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 967 of file resource_bridges.c.

970 {
971  RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
972  RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
973 
974  if (bridge) {
975  /* update */
976  if (!ast_strlen_zero(args->name)
977  && strcmp(args->name, bridge->name)) {
979  response, 500, "Internal Error",
980  "Changing bridge name is not implemented");
981  return;
982  }
983  if (!ast_strlen_zero(args->type)) {
985  response, 500, "Internal Error",
986  "Supplying a bridge type when updating a bridge is not allowed.");
987  return;
988  }
989  ast_ari_response_ok(response,
991  return;
992  }
993 
994  bridge = stasis_app_bridge_create(args->type, args->name, args->bridge_id);
995  if (!bridge) {
997  response, 500, "Internal Error",
998  "Unable to create bridge");
999  return;
1000  }
1001 
1002  ast_bridge_lock(bridge);
1003  snapshot = ast_bridge_snapshot_create(bridge);
1004  ast_bridge_unlock(bridge);
1005 
1006  if (!snapshot) {
1008  response, 500, "Internal Error",
1009  "Unable to create snapshot for new bridge");
1010  return;
1011  }
1012 
1013  ast_ari_response_ok(response,
1015 }

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_ok(), ast_bridge_lock, ast_bridge_snapshot_create(), ast_bridge_snapshot_to_json(), ast_bridge_unlock, ast_strlen_zero(), find_bridge(), ast_bridge::name, NULL, RAII_VAR, stasis_app_bridge_create(), and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_create_with_id_cb().

◆ 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()

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.

If any channels are in this bridge, they will be removed and resume whatever they were doing beforehand.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 874 of file resource_bridges.c.

877 {
878  RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
879  if (!bridge) {
880  return;
881  }
882 
883  stasis_app_bridge_destroy(args->bridge_id);
884  ast_ari_response_no_content(response);
885 }
void stasis_app_bridge_destroy(const char *bridge_id)
Destroy the bridge.
Definition: res_stasis.c:861

References ao2_cleanup, args, ast_ari_response_no_content(), ast_channel::bridge, find_bridge(), RAII_VAR, and stasis_app_bridge_destroy().

Referenced by ast_ari_bridges_destroy_cb().

◆ ast_ari_bridges_get()

void ast_ari_bridges_get ( struct ast_variable headers,
struct ast_ari_bridges_get_args args,
struct ast_ari_response response 
)

Get bridge details.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 858 of file resource_bridges.c.

861 {
863  if (!snapshot) {
865  response, 404, "Not Found",
866  "Bridge not found");
867  return;
868  }
869 
870  ast_ari_response_ok(response,
872 }
struct ast_bridge_snapshot * ast_bridge_get_snapshot_by_uniqueid(const char *bridge_id)
Returns the current snapshot for the bridge.

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_ok(), ast_bridge_get_snapshot_by_uniqueid(), ast_bridge_snapshot_to_json(), RAII_VAR, ast_channel::snapshot, and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_get_cb().

◆ ast_ari_bridges_list()

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.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 887 of file resource_bridges.c.

890 {
892  RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
893  struct ao2_iterator i;
894  struct ast_bridge *bridge;
895 
896  bridges = ast_bridges();
897  if (!bridges) {
899  return;
900  }
901 
902  json = ast_json_array_create();
903  if (!json) {
905  return;
906  }
907 
908  i = ao2_iterator_init(bridges, 0);
909  while ((bridge = ao2_iterator_next(&i))) {
910  struct ast_bridge_snapshot *snapshot;
911  struct ast_json *json_bridge = NULL;
912 
913  /* Invisible bridges don't get shown externally and have no snapshot */
915  ao2_ref(bridge, -1);
916  continue;
917  }
918 
919  snapshot = ast_bridge_get_snapshot(bridge);
920  if (snapshot) {
921  json_bridge = ast_bridge_snapshot_to_json(snapshot, stasis_app_get_sanitizer());
922  ao2_ref(snapshot, -1);
923  }
924 
925  ao2_ref(bridge, -1);
926 
927  if (!json_bridge || ast_json_array_append(json, json_bridge)) {
930  return;
931  }
932  }
934 
935  ast_ari_response_ok(response, ast_json_ref(json));
936 }
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
static struct ao2_container * bridges
Definition: bridge.c:123
struct ao2_container * ast_bridges(void)
Returns the global bridges container.
Definition: bridge.c:174
@ AST_BRIDGE_FLAG_INVISIBLE
struct ast_json * ast_json_ref(struct ast_json *value)
Increase refcount on value.
Definition: json.c:67
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
int ast_json_array_append(struct ast_json *array, struct ast_json *value)
Append to an array.
Definition: json.c:368
struct ast_json * ast_json_array_create(void)
Create a empty JSON array.
Definition: json.c:352
struct ast_bridge_snapshot * ast_bridge_get_snapshot(struct ast_bridge *bridge)
Returns the current snapshot for the bridge.
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821
struct ast_flags feature_flags
Definition: bridge.h:369
#define ast_test_flag(p, flag)
Definition: utils.h:63

References ao2_cleanup, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_ari_response_alloc_failed(), ast_ari_response_ok(), AST_BRIDGE_FLAG_INVISIBLE, ast_bridge_get_snapshot(), ast_bridge_snapshot_to_json(), ast_bridges(), ast_json_array_append(), ast_json_array_create(), ast_json_ref(), ast_json_unref(), ast_test_flag, bridges, ast_bridge::feature_flags, NULL, RAII_VAR, and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_list_cb().

◆ ast_ari_bridges_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.

The media URI may be any of a number of URI's. Currently sound:, recording:, number:, digits:, characters:, and tone: URI's are supported. This operation creates a playback resource that can be used to control the playback of media (pause, rewind, fast forward, etc.)

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 608 of file resource_bridges.c.

611 {
612  ari_bridges_handle_play(args->bridge_id,
613  args->media,
614  args->media_count,
615  args->lang,
616  args->offsetms,
617  args->skipms,
618  args->playback_id,
619  response);
620 }
static void ari_bridges_handle_play(const char *args_bridge_id, const char **args_media, size_t args_media_count, const char *args_lang, int args_offset_ms, int args_skipms, const char *args_playback_id, struct ast_ari_response *response)

References args, and ari_bridges_handle_play().

Referenced by ast_ari_bridges_play_cb().

◆ 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()

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.

The media URI may be any of a number of URI's. Currently sound:, recording:, number:, digits:, characters:, and tone: URI's are supported. This operation creates a playback resource that can be used to control the playback of media (pause, rewind, fast forward, etc.)

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 622 of file resource_bridges.c.

625 {
626  ari_bridges_handle_play(args->bridge_id,
627  args->media,
628  args->media_count,
629  args->lang,
630  args->offsetms,
631  args->skipms,
632  args->playback_id,
633  response);
634 }

References args, and ari_bridges_handle_play().

Referenced by ast_ari_bridges_play_with_id_cb().

◆ 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()

void ast_ari_bridges_record ( struct ast_variable headers,
struct ast_ari_bridges_record_args args,
struct ast_ari_response response 
)

Start a recording.

This records the mixed audio from all channels participating in this bridge.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 636 of file resource_bridges.c.

639 {
640  RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
641  RAII_VAR(struct ast_channel *, record_channel, NULL, ast_hangup);
642  RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
643  RAII_VAR(struct stasis_app_recording *, recording, NULL, ao2_cleanup);
644  RAII_VAR(char *, recording_url, NULL, ast_free);
645  RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
647  RAII_VAR(char *, uri_encoded_name, NULL, ast_free);
648  RAII_VAR(struct stasis_forward *, channel_forward, NULL, stasis_forward_cancel);
649 
650  struct stasis_topic *channel_topic;
651  struct stasis_topic *bridge_topic;
652  size_t uri_name_maxlen;
653  struct bridge_channel_control_thread_data *thread_data;
654  pthread_t threadid;
655 
656  ast_assert(response != NULL);
657 
658  if (bridge == NULL) {
659  return;
660  }
661 
662  if (!(record_channel = prepare_bridge_media_channel("Recorder"))) {
664  response, 500, "Internal Server Error", "Failed to create recording channel");
665  return;
666  }
667 
668  bridge_topic = ast_bridge_topic(bridge);
669  channel_topic = ast_channel_topic(record_channel);
670 
671  /* Forward messages from the recording channel topic to the bridge topic so that anything listening for
672  * messages on the bridge topic will receive the recording start/stop messages. Other messages that would
673  * go to this channel will be suppressed since the channel is marked as internal.
674  */
675  if (!bridge_topic || !channel_topic || !(channel_forward = stasis_forward_all(channel_topic, bridge_topic))) {
677  response, 500, "Internal Error", "Could not forward record channel stasis messages to bridge topic");
678  return;
679  }
680 
681  if (ast_unreal_channel_push_to_bridge(record_channel, bridge,
684  response, 500, "Internal Error", "Failed to put recording channel into the bridge");
685  return;
686  }
687 
688  control = stasis_app_control_create(record_channel);
689  if (control == NULL) {
691  return;
692  }
693 
695  if (options == NULL) {
697  return;
698  }
699 
700  ast_string_field_build(options, target, "bridge:%s", args->bridge_id);
701  options->max_silence_seconds = args->max_silence_seconds;
702  options->max_duration_seconds = args->max_duration_seconds;
703  options->terminate_on =
705  options->if_exists =
707  options->beep = args->beep;
708 
709  if (options->terminate_on == STASIS_APP_RECORDING_TERMINATE_INVALID) {
711  response, 400, "Bad Request",
712  "terminateOn invalid");
713  return;
714  }
715 
716  if (options->if_exists == AST_RECORD_IF_EXISTS_ERROR) {
718  response, 400, "Bad Request",
719  "ifExists invalid");
720  return;
721  }
722 
723  if (!ast_get_format_for_file_ext(options->format)) {
725  response, 422, "Unprocessable Entity",
726  "specified format is unknown on this system");
727  return;
728  }
729 
731  if (recording == NULL) {
732  switch(errno) {
733  case EINVAL:
734  /* While the arguments are invalid, we should have
735  * caught them prior to calling record.
736  */
738  response, 500, "Internal Server Error",
739  "Error parsing request");
740  break;
741  case EEXIST:
742  ast_ari_response_error(response, 409, "Conflict",
743  "Recording '%s' already exists and can not be overwritten",
744  args->name);
745  break;
746  case ENOMEM:
748  break;
749  case EPERM:
751  response, 400, "Bad Request",
752  "Recording name invalid");
753  break;
754  default:
756  "Unrecognized recording error: %s\n",
757  strerror(errno));
759  response, 500, "Internal Server Error",
760  "Internal Server Error");
761  break;
762  }
763  return;
764  }
765 
766  uri_name_maxlen = strlen(args->name) * 3;
767  uri_encoded_name = ast_malloc(uri_name_maxlen);
768  if (!uri_encoded_name) {
770  return;
771  }
772  ast_uri_encode(args->name, uri_encoded_name, uri_name_maxlen, ast_uri_http);
773 
774  if (ast_asprintf(&recording_url, "/recordings/live/%s",
775  uri_encoded_name) == -1) {
776  recording_url = NULL;
778  return;
779  }
780 
781  json = stasis_app_recording_to_json(recording);
782  if (!json) {
784  return;
785  }
786 
787  thread_data = ast_calloc(1, sizeof(*thread_data));
788  if (!thread_data) {
790  return;
791  }
792 
793  thread_data->bridge_channel = record_channel;
794  thread_data->control = control;
795  thread_data->forward = channel_forward;
796 
797  if (ast_pthread_create_detached(&threadid, NULL, bridge_channel_control_thread, thread_data)) {
799  ast_free(thread_data);
800  return;
801  }
802 
803  /* These are owned by the other thread now, so we don't want RAII_VAR disposing of them. */
804  record_channel = NULL;
805  control = NULL;
806  channel_forward = NULL;
807 
808  ast_ari_response_created(response, recording_url, ast_json_ref(json));
809 }
void ast_ari_response_created(struct ast_ari_response *response, const char *url, struct ast_json *message)
Fill in a Created (201) ast_ari_response.
Definition: res_ari.c:305
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ast_log
Definition: astobj2.c:42
@ AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE
@ AST_BRIDGE_CHANNEL_FLAG_LONELY
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2542
struct stasis_topic * ast_channel_topic(struct ast_channel *chan)
A topic which publishes the events for a particular channel.
int ast_unreal_channel_push_to_bridge(struct ast_channel *ast, struct ast_bridge *bridge, unsigned int flags)
Push the semi2 unreal channel into a bridge from either member of the unreal pair.
Definition: core_unreal.c:928
struct ast_format * ast_get_format_for_file_ext(const char *file_ext)
Get the ast_format associated with the given file extension.
Definition: file.c:1979
@ AST_RECORD_IF_EXISTS_ERROR
#define LOG_WARNING
int errno
static void * bridge_channel_control_thread(void *data)
static struct ast_channel * prepare_bridge_media_channel(const char *type)
struct stasis_forward * stasis_forward_all(struct stasis_topic *from_topic, struct stasis_topic *to_topic)
Create a subscription which forwards all messages from one topic to another.
Definition: stasis.c:1580
struct stasis_forward * stasis_forward_cancel(struct stasis_forward *forward)
Definition: stasis.c:1550
struct stasis_app_control * stasis_app_control_create(struct ast_channel *chan)
Creates a control handler for a channel that isn't in a stasis app.
Definition: res_stasis.c:333
struct stasis_app_recording_options * stasis_app_recording_options_create(const char *name, const char *format)
Allocate a recording options object.
enum ast_record_if_exists stasis_app_recording_if_exists_parse(const char *str)
Parse a string into the if_exists enum.
#define STASIS_APP_RECORDING_TERMINATE_INVALID
struct ast_json * stasis_app_recording_to_json(const struct stasis_app_recording *recording)
Construct a JSON model of a recording.
char stasis_app_recording_termination_parse(const char *str)
Parse a string into the recording termination enum.
struct stasis_app_recording * stasis_app_control_record(struct stasis_app_control *control, struct stasis_app_recording_options *options)
Record media from a channel.
struct stasis_topic * ast_bridge_topic(struct ast_bridge *bridge)
A topic which publishes the events for a particular bridge.
#define ast_string_field_build(x, field, fmt, args...)
Set a field to a complex (built) value.
Definition: stringfields.h:555
Main Channel structure associated with a channel.
struct stasis_app_control * control
Forwarding information.
Definition: stasis.c:1533
static struct test_options options
#define ast_assert(a)
Definition: utils.h:734
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:723
const struct ast_flags ast_uri_http
Definition: main/utils.c:719
#define ast_pthread_create_detached(a, b, c, d)
Definition: utils.h:583

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_created(), ast_ari_response_error(), ast_asprintf, ast_assert, AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE, AST_BRIDGE_CHANNEL_FLAG_LONELY, ast_bridge_topic(), ast_calloc, ast_channel_topic(), ast_free, ast_get_format_for_file_ext(), ast_hangup(), ast_json_ref(), ast_json_unref(), ast_log, ast_malloc, ast_pthread_create_detached, AST_RECORD_IF_EXISTS_ERROR, ast_string_field_build, ast_unreal_channel_push_to_bridge(), ast_uri_encode(), ast_uri_http, ast_channel::bridge, bridge_channel_control_thread_data::bridge_channel, bridge_channel_control_thread(), ast_channel::channel_forward, bridge_channel_control_thread_data::control, errno, find_bridge(), bridge_channel_control_thread_data::forward, LOG_WARNING, NULL, options, prepare_bridge_media_channel(), RAII_VAR, stasis_app_control_create(), stasis_app_control_record(), stasis_app_recording_if_exists_parse(), stasis_app_recording_options_create(), STASIS_APP_RECORDING_TERMINATE_INVALID, stasis_app_recording_termination_parse(), stasis_app_recording_to_json(), stasis_forward_all(), and stasis_forward_cancel().

Referenced by ast_ari_bridges_record_cb().

◆ 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()

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.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 241 of file resource_bridges.c.

244 {
245  RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
246  RAII_VAR(struct control_list *, list, NULL, ao2_cleanup);
247  size_t i;
248 
249  if (!bridge) {
250  /* Response filled in by find_bridge() */
251  return;
252  }
253 
254  list = control_list_create(response, args->channel_count, args->channel);
255  if (!list) {
256  /* Response filled in by control_list_create() */
257  return;
258  }
259 
260  /* Make sure all of the channels are in this bridge */
261  for (i = 0; i < list->count; ++i) {
262  if (stasis_app_get_bridge(list->controls[i]) != bridge) {
263  ast_log(LOG_WARNING, "Channel %s not in bridge %s\n",
264  args->channel[i], args->bridge_id);
265  ast_ari_response_error(response, 422,
266  "Unprocessable Entity",
267  "Channel not in this bridge");
268  return;
269  }
270  }
271 
272  /* Now actually remove it */
273  for (i = 0; i < list->count; ++i) {
275  bridge);
276  }
277 
278  ast_ari_response_no_content(response);
279 }
struct ast_bridge * stasis_app_get_bridge(struct stasis_app_control *control)
Gets the bridge currently associated with a control object.
Definition: control.c:931
int stasis_app_control_remove_channel_from_bridge(struct stasis_app_control *control, struct ast_bridge *bridge)
Remove a channel from the bridge.
Definition: control.c:1420

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_log, control_list_create(), find_bridge(), LOG_WARNING, NULL, RAII_VAR, stasis_app_control_remove_channel_from_bridge(), and stasis_app_get_bridge().

Referenced by ast_ari_bridges_remove_channel_cb().

◆ 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()

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 bridges with two or fewer participants.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1029 of file resource_bridges.c.

1031 {
1032  struct ast_bridge *bridge;
1033  struct stasis_app_control *control;
1034 
1035  bridge = find_bridge(response, args->bridge_id);
1036  if (!bridge) {
1037  return;
1038  }
1039 
1040  control = find_channel_control(response, args->channel_id);
1041  if (!control) {
1042  ao2_ref(bridge, -1);
1043  return;
1044  }
1045 
1046  if (stasis_app_get_bridge(control) != bridge) {
1047  ast_ari_response_error(response, 422,
1048  "Unprocessable Entity",
1049  "Channel not in this bridge");
1050  ao2_ref(bridge, -1);
1051  ao2_ref(control, -1);
1052  return;
1053  }
1054 
1057 
1058  ao2_ref(bridge, -1);
1059  ao2_ref(control, -1);
1060 
1061  ast_ari_response_no_content(response);
1062 }
void __ao2_cleanup(void *obj)
Definition: astobj2.c:677
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
static int bridge_set_video_source_cb(struct stasis_app_control *control, struct ast_channel *chan, void *data)
static struct stasis_app_control * find_channel_control(struct ast_ari_response *response, const char *channel_id)
Finds the control object for a channel, filling the response with an error, if appropriate.
int stasis_app_send_command(struct stasis_app_control *control, stasis_app_command_cb command, void *data, command_data_destructor_fn data_destructor)
Invokes a command on a control's channel.
Definition: control.c:898
struct ast_bridge * bridge
Definition: control.c:64

References __ao2_cleanup(), ao2_bump, ao2_ref, args, ast_ari_response_error(), ast_ari_response_no_content(), stasis_app_control::bridge, bridge_set_video_source_cb(), find_bridge(), find_channel_control(), stasis_app_get_bridge(), and stasis_app_send_command().

Referenced by ast_ari_bridges_set_video_source_cb().

◆ ast_ari_bridges_start_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.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 811 of file resource_bridges.c.

814 {
815  RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
816  struct ast_channel *moh_channel;
817  const char *moh_class = args->moh_class;
818 
819  if (!bridge) {
820  /* The response is provided by find_bridge() */
821  return;
822  }
823 
824  moh_channel = stasis_app_bridge_moh_channel(bridge);
825  if (!moh_channel) {
827  return;
828  }
829 
830  ast_moh_start(moh_channel, moh_class, NULL);
831  ast_channel_cleanup(moh_channel);
832 
833  ast_ari_response_no_content(response);
834 
835 }
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:2969
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
Definition: channel.c:7849
struct ast_channel * stasis_app_bridge_moh_channel(struct ast_bridge *bridge)
Finds or creates an announcer channel in a bridge that can play music on hold.
Definition: res_stasis.c:629
struct ast_bridge * bridge

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_no_content(), ast_channel_cleanup, ast_moh_start(), ast_channel::bridge, find_bridge(), NULL, RAII_VAR, and stasis_app_bridge_moh_channel().

Referenced by ast_ari_bridges_start_moh_cb().

◆ 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()

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.

This will only stop music on hold being played via POST bridges/{bridgeId}/moh.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 837 of file resource_bridges.c.

840 {
841  RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
842 
843  if (!bridge) {
844  /* the response is provided by find_bridge() */
845  return;
846  }
847 
848  if (stasis_app_bridge_moh_stop(bridge)) {
850  response, 409, "Conflict",
851  "Bridge isn't playing music");
852  return;
853  }
854 
855  ast_ari_response_no_content(response);
856 }
int stasis_app_bridge_moh_stop(struct ast_bridge *bridge)
Breaks down MOH channels playing on the bridge created by stasis_app_bridge_moh_channel.
Definition: res_stasis.c:649

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_channel::bridge, find_bridge(), RAII_VAR, and stasis_app_bridge_moh_stop().

Referenced by ast_ari_bridges_stop_moh_cb().