Asterisk - The Open Source Telephony Project  18.5.0
Macros | Functions
bridge_roles.h File Reference

Channel Bridging Roles API. More...

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

Go to the source code of this file.

Macros

#define AST_ROLE_LEN   32
 

Functions

void ast_bridge_channel_clear_roles (struct ast_bridge_channel *bridge_channel)
 Clear all roles from a bridge_channel's role list. More...
 
int ast_bridge_channel_establish_roles (struct ast_bridge_channel *bridge_channel)
 Clone the roles from a bridge_channel's attached ast_channel onto the bridge_channel's role list. More...
 
const char * ast_bridge_channel_get_role_option (struct ast_bridge_channel *bridge_channel, const char *role_name, const char *option)
 Retrieve the value of a requested role option from a bridge channel. More...
 
int ast_bridge_channel_has_role (struct ast_bridge_channel *bridge_channel, const char *role_name)
 Check to see if a bridge channel inherited a specific role from its channel. More...
 
int ast_channel_add_bridge_role (struct ast_channel *chan, const char *role_name)
 Adds a bridge role to a channel. More...
 
void ast_channel_clear_bridge_roles (struct ast_channel *chan)
 Removes all bridge roles currently on a channel. More...
 
const char * ast_channel_get_role_option (struct ast_channel *channel, const char *role_name, const char *option)
 Retrieve the value of a requested role option from a channel. More...
 
int ast_channel_has_role (struct ast_channel *channel, const char *role_name)
 Check if a role exists on a channel. More...
 
void ast_channel_remove_bridge_role (struct ast_channel *chan, const char *role_name)
 Removes a bridge role from a channel. More...
 
int ast_channel_set_bridge_role_option (struct ast_channel *channel, const char *role_name, const char *option, const char *value)
 Set a role option on a channel. More...
 

Detailed Description

Channel Bridging Roles API.

Author
Jonathan Rose jrose.nosp@m.@dig.nosp@m.ium.c.nosp@m.om

Definition in file bridge_roles.h.

Macro Definition Documentation

◆ AST_ROLE_LEN

#define AST_ROLE_LEN   32

Definition at line 33 of file bridge_roles.h.

Function Documentation

◆ ast_bridge_channel_clear_roles()

void ast_bridge_channel_clear_roles ( struct ast_bridge_channel bridge_channel)

Clear all roles from a bridge_channel's role list.

Parameters
bridge_channelthe bridge channel that we are scrubbing

If roles are already established on a bridge channel, ast_bridge_channel_establish_roles will fail unconditionally without changing any roles. In order to update a bridge channel's roles, they must first be cleared from the bridge channel using this function.

Note
ast_bridge_channel_clear_roles also serves as the destructor for the role list of a bridge channel.

Definition at line 495 of file bridge_roles.c.

References bridge_role_datastore_destroy(), ast_bridge_channel::bridge_roles, and NULL.

Referenced by agent_alert(), ast_bridge_channel_establish_roles(), and bridge_channel_internal_pull().

496 {
497  if (bridge_channel->bridge_roles) {
499  bridge_channel->bridge_roles = NULL;
500  }
501 }
#define NULL
Definition: resample.c:96
static void bridge_role_datastore_destroy(void *data)
Definition: bridge_roles.c:90
struct bridge_roles_datastore * bridge_roles

◆ ast_bridge_channel_establish_roles()

int ast_bridge_channel_establish_roles ( struct ast_bridge_channel bridge_channel)

Clone the roles from a bridge_channel's attached ast_channel onto the bridge_channel's role list.

Parameters
bridge_channelThe bridge channel that we are preparing
Return values
0on success
-1on failure

This function should always be called when the bridge_channel binds to an ast_channel at some point before the bridge_channel joins or is imparted onto a bridge. Failure to do so will result in an empty role list. While the list remains established, changes to roles on the ast_channel will not propogate to the bridge channel and roles can not be re-established on the bridge channel without first clearing the roles with ast_bridge_roles_bridge_channel_clear_roles.

Definition at line 447 of file bridge_roles.c.

References ast_bridge_channel_clear_roles(), ast_calloc, ast_debug, AST_LIST_LAST, AST_LIST_TRAVERSE, ast_bridge_channel::bridge_roles, ast_bridge_channel::chan, fetch_bridge_roles_datastore(), bridge_role_option::list, NULL, bridge_role_option::option, bridge_role::options, bridge_role::role, bridge_roles_datastore::role_list, setup_bridge_role(), setup_bridge_role_option(), and bridge_role_option::value.

Referenced by agent_alert(), and bridge_channel_internal_push_full().

448 {
449  struct bridge_roles_datastore *roles_datastore;
450  struct bridge_role *role = NULL;
451  struct bridge_role_option *role_option;
452 
453  if (!bridge_channel->chan) {
454  ast_debug(2, "Attempted to set roles on a bridge channel that has no associated channel. That's a bad idea.\n");
455  return -1;
456  }
457 
458  if (bridge_channel->bridge_roles) {
459  ast_debug(2, "Attempted to reset roles while roles were already established. Purge existing roles first.\n");
460  return -1;
461  }
462 
463  roles_datastore = fetch_bridge_roles_datastore(bridge_channel->chan);
464  if (!roles_datastore) {
465  /* No roles to establish. */
466  return 0;
467  }
468 
469  if (!(bridge_channel->bridge_roles = ast_calloc(1, sizeof(*bridge_channel->bridge_roles)))) {
470  return -1;
471  }
472 
473  AST_LIST_TRAVERSE(&roles_datastore->role_list, role, list) {
474  struct bridge_role *this_role_copy;
475 
476  if (setup_bridge_role(bridge_channel->bridge_roles, role->role)) {
477  /* We need to abandon the copy because we couldn't setup a role */
478  ast_bridge_channel_clear_roles(bridge_channel);
479  return -1;
480  }
481  this_role_copy = AST_LIST_LAST(&bridge_channel->bridge_roles->role_list);
482 
483  AST_LIST_TRAVERSE(&role->options, role_option, list) {
484  if (setup_bridge_role_option(this_role_copy, role_option->option, role_option->value)) {
485  /* We need to abandon the copy because we couldn't setup a role option */
486  ast_bridge_channel_clear_roles(bridge_channel);
487  return -1;
488  }
489  }
490  }
491 
492  return 0;
493 }
void ast_bridge_channel_clear_roles(struct ast_bridge_channel *bridge_channel)
Clear all roles from a bridge_channel's role list.
Definition: bridge_roles.c:495
char role[AST_ROLE_LEN]
Definition: bridge_roles.c:55
struct bridge_roles_datastore::@358 role_list
#define NULL
Definition: resample.c:96
static struct bridge_roles_datastore * fetch_bridge_roles_datastore(struct ast_channel *chan)
Definition: bridge_roles.c:148
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
const ast_string_field value
Definition: bridge_roles.c:49
struct bridge_roles_datastore * bridge_roles
static int setup_bridge_role(struct bridge_roles_datastore *roles_datastore, const char *role_name)
Definition: bridge_roles.c:260
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:428
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct bridge_role::@357 options
struct bridge_role::@356 list
struct ast_channel * chan
const ast_string_field option
Definition: bridge_roles.c:49
static int setup_bridge_role_option(struct bridge_role *role, const char *option, const char *value)
Definition: bridge_roles.c:291
struct bridge_role_option::@355 list

◆ ast_bridge_channel_get_role_option()

const char* ast_bridge_channel_get_role_option ( struct ast_bridge_channel bridge_channel,
const char *  role_name,
const char *  option 
)

Retrieve the value of a requested role option from a bridge channel.

Parameters
bridge_channelThe bridge channel we are retrieving the option from
role_nameName of the role the option will be retrieved from
optionName of the option we are retrieving the value of
Return values
NULLIf either the role does not exist on the bridge_channel or the role does exist but the option has not been set
Thevalue of the option
Note
See ast_channel_set_role_option note about the need to call ast_bridge_channel_establish_roles.
The returned character pointer is only valid as long as the bridge_channel is guaranteed to be alive and hasn't had ast_bridge_channel_clear_roles called against it (as this will free all roles and role options in the bridge channel). If you need this value after one of these destruction events occurs, you must make a local copy while it is still valid.

Definition at line 427 of file bridge_roles.c.

References ast_bridge_channel::bridge_roles, get_role_from_datastore(), get_role_option(), NULL, bridge_role::role, and bridge_role_option::value.

Referenced by bridge_parking_push(), participant_entertainment_start(), and participant_idle_mode_setup().

428 {
429  struct bridge_role *role;
430  struct bridge_role_option *role_option = NULL;
431 
432  if (!bridge_channel->bridge_roles) {
433  return NULL;
434  }
435 
436  role = get_role_from_datastore(bridge_channel->bridge_roles, role_name);
437 
438  if (!role) {
439  return NULL;
440  }
441 
442  role_option = get_role_option(role, option);
443 
444  return role_option ? role_option->value : NULL;
445 }
char role[AST_ROLE_LEN]
Definition: bridge_roles.c:55
static struct bridge_role * get_role_from_datastore(struct bridge_roles_datastore *roles_datastore, const char *role_name)
Definition: bridge_roles.c:197
#define NULL
Definition: resample.c:96
const ast_string_field value
Definition: bridge_roles.c:49
struct bridge_roles_datastore * bridge_roles
static struct bridge_role_option * get_role_option(struct bridge_role *role, const char *option)
Definition: bridge_roles.c:238
const ast_string_field option
Definition: bridge_roles.c:49

◆ ast_bridge_channel_has_role()

int ast_bridge_channel_has_role ( struct ast_bridge_channel bridge_channel,
const char *  role_name 
)

Check to see if a bridge channel inherited a specific role from its channel.

Parameters
bridge_channelThe bridge channel being checked
role_nameName of the role being checked
Return values
0The bridge channel does not have the requested role
1The bridge channel does have the requested role
Note
Before a bridge_channel can effectively check roles against a bridge, ast_bridge_channel_establish_roles should be called on the bridge_channel so that roles and their respective role options can be copied from the channel datastore into the bridge_channel roles list. Otherwise this function will just return 0 because the list will be NULL.

Definition at line 418 of file bridge_roles.c.

References ast_bridge_channel::bridge_roles, and get_role_from_datastore().

Referenced by bridge_parking_push(), and holding_bridge_join().

419 {
420  if (!bridge_channel->bridge_roles) {
421  return 0;
422  }
423 
424  return get_role_from_datastore(bridge_channel->bridge_roles, role_name) ? 1 : 0;
425 }
static struct bridge_role * get_role_from_datastore(struct bridge_roles_datastore *roles_datastore, const char *role_name)
Definition: bridge_roles.c:197
struct bridge_roles_datastore * bridge_roles

◆ ast_channel_add_bridge_role()

int ast_channel_add_bridge_role ( struct ast_channel chan,
const char *  role_name 
)

Adds a bridge role to a channel.

Parameters
chanAcquirer of the requested role
role_nameName of the role being attached
Return values
0on success
-1on failure

Definition at line 317 of file bridge_roles.c.

References ast_channel_name(), ast_debug, ast_log, fetch_or_create_bridge_roles_datastore(), get_role_from_datastore(), LOG_WARNING, and setup_bridge_role().

Referenced by add_transferer_role(), announce_request(), app_control_add_role(), bridge_agent_hold_push(), bridge_stasis_push(), media_request_helper(), parking_channel_set_roles(), process_options(), and rec_request().

318 {
319  struct bridge_roles_datastore *roles_datastore = fetch_or_create_bridge_roles_datastore(chan);
320 
321  if (!roles_datastore) {
322  ast_log(LOG_WARNING, "Unable to set up bridge role datastore on channel %s\n", ast_channel_name(chan));
323  return -1;
324  }
325 
326  /* Check to make sure we aren't adding a redundant role */
327  if (get_role_from_datastore(roles_datastore, role_name)) {
328  ast_debug(2, "Bridge role %s is already applied to the channel %s\n", role_name, ast_channel_name(chan));
329  return 0;
330  }
331 
332  /* It wasn't already there, so we can just finish setting it up now. */
333  return setup_bridge_role(roles_datastore, role_name);
334 }
static struct bridge_role * get_role_from_datastore(struct bridge_roles_datastore *roles_datastore, const char *role_name)
Definition: bridge_roles.c:197
static struct bridge_roles_datastore * fetch_or_create_bridge_roles_datastore(struct ast_channel *chan)
Definition: bridge_roles.c:172
#define LOG_WARNING
Definition: logger.h:274
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
static int setup_bridge_role(struct bridge_roles_datastore *roles_datastore, const char *role_name)
Definition: bridge_roles.c:260
const char * ast_channel_name(const struct ast_channel *chan)

◆ ast_channel_clear_bridge_roles()

void ast_channel_clear_bridge_roles ( struct ast_channel chan)

Removes all bridge roles currently on a channel.

Parameters
chanChannel the roles are being removed from

Definition at line 360 of file bridge_roles.c.

References ast_channel_name(), ast_debug, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, bridge_role_destroy(), fetch_bridge_roles_datastore(), bridge_role_option::list, bridge_role::role, and bridge_roles_datastore::role_list.

Referenced by app_control_clear_roles(), and bridge_stasis_pull().

361 {
362  struct bridge_roles_datastore *roles_datastore = fetch_bridge_roles_datastore(chan);
363  struct bridge_role *role;
364 
365  if (!roles_datastore) {
366  /* The roles datastore didn't already exist, so there is no need to remove any roles */
367  ast_debug(2, "Roles did not exist on channel %s\n", ast_channel_name(chan));
368  return;
369  }
370 
371  AST_LIST_TRAVERSE_SAFE_BEGIN(&roles_datastore->role_list, role, list) {
372  ast_debug(2, "Removing bridge role %s from channel %s\n", role->role, ast_channel_name(chan));
374  bridge_role_destroy(role);
375  }
377 }
char role[AST_ROLE_LEN]
Definition: bridge_roles.c:55
struct bridge_roles_datastore::@358 role_list
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
static struct bridge_roles_datastore * fetch_bridge_roles_datastore(struct ast_channel *chan)
Definition: bridge_roles.c:148
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
static void bridge_role_destroy(struct bridge_role *role)
Definition: bridge_roles.c:71
struct bridge_role::@356 list
const char * ast_channel_name(const struct ast_channel *chan)
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528

◆ ast_channel_get_role_option()

const char* ast_channel_get_role_option ( struct ast_channel channel,
const char *  role_name,
const char *  option 
)

Retrieve the value of a requested role option from a channel.

Parameters
channelThe channel to retrieve the requested option from
role_nameThe role to which the option belongs
optionThe name of the option to retrieve
Return values
NULLThe option does not exist
non-NULLThe value of the option

This is an alternative to ast_bridge_channel_get_role_option that is useful if bridge roles have not yet been esstablished on a channel's bridge_channel. A possible example of when this could be used is in a bridge v_table's push() callback.

Definition at line 403 of file bridge_roles.c.

References get_role_from_channel(), get_role_option(), NULL, bridge_role::role, and bridge_role_option::value.

Referenced by bridge_personality_atxfer_push().

404 {
405  struct bridge_role *role;
406  struct bridge_role_option *role_option;
407 
408  role = get_role_from_channel(channel, role_name);
409  if (!role) {
410  return NULL;
411  }
412 
413  role_option = get_role_option(role, option);
414 
415  return role_option ? role_option->value : NULL;
416 }
char role[AST_ROLE_LEN]
Definition: bridge_roles.c:55
static struct bridge_role * get_role_from_channel(struct ast_channel *channel, const char *role_name)
Definition: bridge_roles.c:221
#define NULL
Definition: resample.c:96
const ast_string_field value
Definition: bridge_roles.c:49
static struct bridge_role_option * get_role_option(struct bridge_role *role, const char *option)
Definition: bridge_roles.c:238
const ast_string_field option
Definition: bridge_roles.c:49

◆ ast_channel_has_role()

int ast_channel_has_role ( struct ast_channel channel,
const char *  role_name 
)

Check if a role exists on a channel.

Parameters
channelThe channel to check
role_nameThe name of the role to search for
Return values
0The requested role does not exist on the channel
1The requested role exists on the channel

This is an alternative to ast_bridge_channel_has_role that is useful if bridge roles have not yet been established on a channel's bridge_channel. A possible example of when this could be used is in a bridge v_table's push() callback.

Definition at line 398 of file bridge_roles.c.

References get_role_from_channel().

Referenced by bridge_personality_atxfer_push(), bridge_stasis_push(), and handle_hangup().

399 {
400  return get_role_from_channel(channel, role_name) ? 1 : 0;
401 }
static struct bridge_role * get_role_from_channel(struct ast_channel *channel, const char *role_name)
Definition: bridge_roles.c:221

◆ ast_channel_remove_bridge_role()

void ast_channel_remove_bridge_role ( struct ast_channel chan,
const char *  role_name 
)

Removes a bridge role from a channel.

Parameters
chanChannel the role is being removed from
role_nameName of the role being removed

Definition at line 336 of file bridge_roles.c.

References ast_channel_name(), ast_debug, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, bridge_role_destroy(), fetch_bridge_roles_datastore(), bridge_role_option::list, bridge_role::role, and bridge_roles_datastore::role_list.

Referenced by attended_transfer_properties_shutdown(), bridge_agent_hold_pull(), and bridge_agent_hold_push().

337 {
338  struct bridge_roles_datastore *roles_datastore = fetch_bridge_roles_datastore(chan);
339  struct bridge_role *role;
340 
341  if (!roles_datastore) {
342  /* The roles datastore didn't already exist, so there is no need to remove a role */
343  ast_debug(2, "Role %s did not exist on channel %s\n", role_name, ast_channel_name(chan));
344  return;
345  }
346 
347  AST_LIST_TRAVERSE_SAFE_BEGIN(&roles_datastore->role_list, role, list) {
348  if (!strcmp(role->role, role_name)) {
349  ast_debug(2, "Removing bridge role %s from channel %s\n", role_name, ast_channel_name(chan));
351  bridge_role_destroy(role);
352  return;
353  }
354  }
356 
357  ast_debug(2, "Role %s did not exist on channel %s\n", role_name, ast_channel_name(chan));
358 }
char role[AST_ROLE_LEN]
Definition: bridge_roles.c:55
struct bridge_roles_datastore::@358 role_list
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
static struct bridge_roles_datastore * fetch_bridge_roles_datastore(struct ast_channel *chan)
Definition: bridge_roles.c:148
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
static void bridge_role_destroy(struct bridge_role *role)
Definition: bridge_roles.c:71
struct bridge_role::@356 list
const char * ast_channel_name(const struct ast_channel *chan)
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528

◆ ast_channel_set_bridge_role_option()

int ast_channel_set_bridge_role_option ( struct ast_channel channel,
const char *  role_name,
const char *  option,
const char *  value 
)

Set a role option on a channel.

Parameters
channelChannel receiving the role option
role_nameRole the role option is applied to
optionName of the option
valueValue of the option
0on success
Return values
-1on failure

Definition at line 379 of file bridge_roles.c.

References ast_string_field_set, get_role_from_channel(), get_role_option(), bridge_role::role, and setup_bridge_role_option().

Referenced by add_transferer_role(), agent_alert(), apply_option_entertainment(), apply_option_moh(), bridge_agent_hold_push(), bridge_stasis_push(), and parking_channel_set_roles().

380 {
381  struct bridge_role *role = get_role_from_channel(channel, role_name);
382  struct bridge_role_option *role_option;
383 
384  if (!role) {
385  return -1;
386  }
387 
388  role_option = get_role_option(role, option);
389 
390  if (role_option) {
391  ast_string_field_set(role_option, value, value);
392  return 0;
393  }
394 
395  return setup_bridge_role_option(role, option, value);
396 }
char role[AST_ROLE_LEN]
Definition: bridge_roles.c:55
static struct bridge_role * get_role_from_channel(struct ast_channel *channel, const char *role_name)
Definition: bridge_roles.c:221
int value
Definition: syslog.c:37
static struct bridge_role_option * get_role_option(struct bridge_role *role, const char *option)
Definition: bridge_roles.c:238
const ast_string_field option
Definition: bridge_roles.c:49
static int setup_bridge_role_option(struct bridge_role *role, const char *option, const char *value)
Definition: bridge_roles.c:291
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:514