741 .name =
"bridge_profile",
743 .category =
"general",
744 .matchfield =
"type",
745 .matchvalue =
"bridge",
778 .name =
"user_profile",
780 .category =
"general",
781 .matchfield =
"type",
782 .matchvalue =
"user",
811 .category =
"general",
812 .matchfield =
"type",
813 .matchvalue =
"menu",
829 .category =
"general",
834 .types =
ACO_TYPES(&bridge_type, &user_type, &menu_type, &general_type),
851 const char *right_name = arg;
857 right_name = right->
name;
860 cmp = strcasecmp(left->
name, right_name);
863 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
872 const char *
name = obj;
878 name = b_profile->
name;
897 const char *right_name = arg;
903 right_name = right->
name;
906 cmp = strcasecmp(left->
name, right_name);
909 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
918 const char *
name = obj;
954 const char *right_name = arg;
960 right_name = right->
name;
963 cmp = strcasecmp(left->
name, right_name);
966 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
975 const char *
name = obj;
981 name = u_profile->
name;
1024 if (!strcasecmp(sound_name,
"sound_only_person")) {
1026 }
else if (!strcasecmp(sound_name,
"sound_only_one")) {
1028 }
else if (!strcasecmp(sound_name,
"sound_has_joined")) {
1030 }
else if (!strcasecmp(sound_name,
"sound_has_left")) {
1032 }
else if (!strcasecmp(sound_name,
"sound_kicked")) {
1034 }
else if (!strcasecmp(sound_name,
"sound_muted")) {
1036 }
else if (!strcasecmp(sound_name,
"sound_unmuted")) {
1038 }
else if (!strcasecmp(sound_name,
"sound_binaural_on")) {
1040 }
else if (!strcasecmp(sound_name,
"sound_binaural_off")) {
1042 }
else if (!strcasecmp(sound_name,
"sound_there_are")) {
1044 }
else if (!strcasecmp(sound_name,
"sound_other_in_party")) {
1046 }
else if (!strcasecmp(sound_name,
"sound_place_into_conference")) {
1047 static int deprecation_warning = 1;
1048 if (deprecation_warning) {
1050 " and unused. Use sound_begin for similar functionality.");
1051 deprecation_warning = 0;
1054 }
else if (!strcasecmp(sound_name,
"sound_wait_for_leader")) {
1056 }
else if (!strcasecmp(sound_name,
"sound_leader_has_left")) {
1058 }
else if (!strcasecmp(sound_name,
"sound_get_pin")) {
1060 }
else if (!strcasecmp(sound_name,
"sound_invalid_pin")) {
1062 }
else if (!strcasecmp(sound_name,
"sound_locked")) {
1064 }
else if (!strcasecmp(sound_name,
"sound_unlocked_now")) {
1066 }
else if (!strcasecmp(sound_name,
"sound_locked_now")) {
1068 }
else if (!strcasecmp(sound_name,
"sound_error_menu")) {
1070 }
else if (!strcasecmp(sound_name,
"sound_join")) {
1072 }
else if (!strcasecmp(sound_name,
"sound_leave")) {
1074 }
else if (!strcasecmp(sound_name,
"sound_participants_muted")) {
1076 }
else if (!strcasecmp(sound_name,
"sound_participants_unmuted")) {
1078 }
else if (!strcasecmp(sound_name,
"sound_begin")) {
1111 .
type =
"confbridge",
1123 .file =
"CONFBRIDGE" 1159 datastore->
data = b_data;
1173 b_data = datastore->
data;
1183 tmpvar.
file =
"CONFBRIDGE";
1184 if (!strcasecmp(
args.type,
"bridge")) {
1185 if (!strcasecmp(
args.option,
"clear")) {
1199 if (b_data && !b_data->
b_usable && strcasecmp(
args.option,
"template")) {
1208 }
else if (!strcasecmp(
args.type,
"user")) {
1209 if (!strcasecmp(
args.option,
"clear")) {
1216 if (b_data && !b_data->
u_usable && strcasecmp(
args.option,
"template")) {
1225 }
else if (!strcasecmp(
args.type,
"menu")) {
1226 if (!strcasecmp(
args.option,
"clear")) {
1239 if (b_data && !b_data->
m_usable && strcasecmp(
args.option,
"template")) {
1250 ast_log(
LOG_WARNING,
"%s(%s,%s) cannot be set to '%s'. Invalid type, option, or value.\n",
1251 cmd,
args.type,
args.option, value);
1262 menu_action->
id =
id;
1331 char *tmp_action_names =
ast_strdupa(action_names);
1332 char *action =
NULL;
1336 char *delimiter =
",";
1338 if (!(menu_entry =
ast_calloc(1,
sizeof(*menu_entry)))) {
1346 unsigned int action_len;
1351 startbrace = strchr(tmp_action_names,
'(');
1352 endbrace = strchr(tmp_action_names,
')');
1353 comma = strchr(tmp_action_names,
',');
1357 if (startbrace && endbrace && comma && (comma > startbrace && comma < endbrace)) {
1363 if (!(action =
strsep(&tmp_action_names, delimiter))) {
1372 action_len = strlen(action);
1374 if (!strcasecmp(action,
"toggle_mute")) {
1376 }
else if (!strcasecmp(action,
"toggle_binaural")) {
1378 }
else if (!strcasecmp(action,
"no_op")) {
1380 }
else if (!strcasecmp(action,
"increase_listening_volume")) {
1382 }
else if (!strcasecmp(action,
"decrease_listening_volume")) {
1384 }
else if (!strcasecmp(action,
"increase_talking_volume")) {
1386 }
else if (!strcasecmp(action,
"reset_listening_volume")) {
1388 }
else if (!strcasecmp(action,
"reset_talking_volume")) {
1390 }
else if (!strcasecmp(action,
"decrease_talking_volume")) {
1392 }
else if (!strcasecmp(action,
"admin_toggle_conference_lock")) {
1394 }
else if (!strcasecmp(action,
"admin_toggle_mute_participants")) {
1396 }
else if (!strcasecmp(action,
"participant_count")) {
1398 }
else if (!strcasecmp(action,
"admin_kick_last")) {
1400 }
else if (!strcasecmp(action,
"leave_conference")) {
1402 }
else if (!strcasecmp(action,
"set_as_single_video_src")) {
1404 }
else if (!strcasecmp(action,
"release_as_single_video_src")) {
1406 }
else if (!strncasecmp(action,
"dialplan_exec(", 14)) {
1409 if ((action_args = strchr(action,
'('))) {
1415 if ((tmp = strchr(action,
')'))) {
1419 }
else if (action_len >= 21 && !strncasecmp(action,
"playback_and_continue(", 22)) {
1422 if ((action_args = strchr(action,
'(')) && (tmp = strrchr(action_args,
')'))) {
1427 }
else if (action_len >= 8 && !strncasecmp(action,
"playback(", 9)) {
1430 if ((action_args = strchr(action,
'(')) && (tmp = strrchr(action_args,
')'))) {
1450 if (!strcasecmp(cur->dtmf, menu_entry->
dtmf)) {
1467 int wordlen = strlen(word);
1478 if (!strncasecmp(u_profile->
name, word, wordlen) && ++which > state) {
1498 e->
command =
"confbridge show profile users";
1500 "Usage: confbridge show profile users\n";
1510 ast_cli(a->
fd,
"--------- User Profiles -----------\n");
1528 e->
command =
"confbridge show profile user";
1530 "Usage: confbridge show profile user [<profile name>]\n";
1544 ast_cli(a->
fd,
"No conference user profile named '%s' found!\n", a->
argv[4]);
1548 ast_cli(a->
fd,
"--------------------------------------------\n");
1568 "enabled" :
"disabled");
1576 "enabled" :
"disabled");
1579 "enabled" :
"disabled");
1582 "enabled" :
"disabled");
1585 "enabled" :
"disabled");
1586 ast_cli(a->
fd,
"Silence Threshold: %ums\n",
1588 ast_cli(a->
fd,
"Talking Threshold: %u\n",
1592 "enabled" :
"disabled");
1595 "enabled" :
"disabled");
1596 ast_cli(a->
fd,
"Talk Detect Events: %s\n",
1598 "enabled" :
"disabled");
1599 ast_cli(a->
fd,
"DTMF Pass Through: %s\n",
1601 "enabled" :
"disabled");
1604 "None" : u_profile.
pin);
1605 ast_cli(a->
fd,
"Announce User Count: %s\n",
1607 "enabled" :
"disabled");
1608 ast_cli(a->
fd,
"Announce join/leave: %s\n",
1611 "enabled (with review)" :
"enabled" :
"disabled");
1612 ast_cli(a->
fd,
"Announce User Count all: %s\n",
1614 "enabled" :
"disabled");
1617 "enabled" :
"disabled");
1630 int wordlen = strlen(word);
1641 if (!strncasecmp(b_profile->
name, word, wordlen) && ++which > state) {
1661 e->
command =
"confbridge show profile bridges";
1663 "Usage: confbridge show profile bridges\n";
1673 ast_cli(a->
fd,
"--------- Bridge Profiles -----------\n");
1693 e->
command =
"confbridge show profile bridge";
1695 "Usage: confbridge show profile bridge <profile name>\n";
1709 ast_cli(a->
fd,
"No conference bridge profile named '%s' found!\n", a->
argv[4]);
1713 ast_cli(a->
fd,
"--------------------------------------------\n");
1722 ast_cli(a->
fd,
"Internal Sample Rate: %s\n", tmp);
1729 ast_cli(a->
fd,
"Maximum Sample Rate: %s\n", tmp);
1734 ast_cli(a->
fd,
"Mixing Interval: Default 20ms\n");
1737 ast_cli(a->
fd,
"Record Conference: %s\n",
1741 ast_cli(a->
fd,
"Record File Append: %s\n",
1745 ast_cli(a->
fd,
"Record File Timestamp: %s\n",
1762 ast_cli(a->
fd,
"Max Members: No Limit\n");
1767 switch (b_profile.
flags 1773 ast_cli(a->
fd,
"Video Mode: last_marked\n");
1776 ast_cli(a->
fd,
"Video Mode: first_marked\n");
1779 ast_cli(a->
fd,
"Video Mode: follow_talker\n");
1785 ast_cli(a->
fd,
"Video Mode: no video\n");
1796 switch (b_profile.
flags 1801 ast_cli(a->
fd,
"REMB Behavior: average\n");
1804 ast_cli(a->
fd,
"REMB Behavior: lowest\n");
1807 ast_cli(a->
fd,
"REMB Behavior: highest\n");
1810 ast_cli(a->
fd,
"REMB Behavior: average_all\n");
1813 ast_cli(a->
fd,
"REMB Behavior: lowest_all\n");
1816 ast_cli(a->
fd,
"REMB Behavior: highest_all\n");
1862 int wordlen = strlen(word);
1873 if (!strncasecmp(menu->
name, word, wordlen) && ++which > state) {
1893 e->
command =
"confbridge show menus";
1895 "Usage: confbridge show profile menus\n";
1905 ast_cli(a->
fd,
"--------- Menus -----------\n");
1927 e->
command =
"confbridge show menu";
1929 "Usage: confbridge show menu [<menu name>]\n";
1947 ast_cli(a->
fd,
"No conference menu named '%s' found!\n", a->
argv[3]);
1952 ast_cli(a->
fd,
"Name: %s\n", menu->name);
1960 switch (menu_action->
id) {
1971 ast_cli(a->
fd,
"increase_listening_volume");
1974 ast_cli(a->
fd,
"decrease_listening_volume");
1977 ast_cli(a->
fd,
"reset_listening_volume");
1983 ast_cli(a->
fd,
"increase_talking_volume");
1986 ast_cli(a->
fd,
"decrease_talking_volume");
1995 ast_cli(a->
fd,
"dialplan_exec(%s,%s,%d)",
2001 ast_cli(a->
fd,
"admin_toggle_conference_lock");
2004 ast_cli(a->
fd,
"admin_toggle_mute_participants");
2016 ast_cli(a->
fd,
"set_as_single_video_src");
2019 ast_cli(a->
fd,
"release_as_single_video_src");
2086 if (strcasecmp(var->
name,
"announce_user_count_all")) {
2105 if (strcasecmp(var->
name,
"mixing_interval")) {
2126 if (strcasecmp(var->
name,
"video_mode")) {
2129 if (!strcasecmp(var->
value,
"first_marked")) {
2136 }
else if (!strcasecmp(var->
value,
"last_marked")) {
2143 }
else if (!strcasecmp(var->
value,
"follow_talker")) {
2150 }
else if (!strcasecmp(var->
value,
"sfu")) {
2157 }
else if (!strcasecmp(var->
value,
"none")) {
2173 if (strcasecmp(var->
name,
"remb_behavior")) {
2186 if (!strcasecmp(var->
value,
"average")) {
2188 }
else if (!strcasecmp(var->
value,
"lowest")) {
2190 }
else if (!strcasecmp(var->
value,
"highest")) {
2192 }
else if (!strcasecmp(var->
value,
"average_all")) {
2194 }
else if (!strcasecmp(var->
value,
"lowest_all")) {
2196 }
else if (!strcasecmp(var->
value,
"highest_all")) {
2198 }
else if (!strcasecmp(var->
value,
"force")) {
2269 if (!(new_menu_action =
ast_calloc(1,
sizeof(*new_menu_action)))) {
2272 memcpy(new_menu_action, menu_action,
sizeof(*new_menu_action));
2371 if (!menu_profile) {
2373 if (!menu_profile) {
2498 b_data = datastore->
data;
2512 if (!(tmp2 =
ao2_find(cfg->user_profiles, user_profile_name,
OBJ_KEY))) {
2551 b_data = datastore->
data;
2565 if (!(tmp2 =
ao2_find(cfg->bridge_profiles, bridge_profile_name,
OBJ_KEY))) {
2616 if (!strcasecmp(menu_entry->
dtmf, dtmf_sequence)) {
2670 b_data = datastore->
data;
const ast_string_field unlockednow
static char * complete_menu_name(const char *line, const char *word, int pos, int state)
static int mix_interval_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
const ast_string_field thereare
static int verify_default_profiles(void)
#define ast_channel_lock(chan)
static char exten[AST_MAX_EXTENSION]
Main Channel structure associated with a channel.
#define AST_CLI_DEFINE(fn, txt,...)
static int user_hash_cb(const void *obj, const int flags)
static int user_cmp_cb(void *obj, void *arg, int flags)
Asterisk main include file. File version handling, generic pbx functions.
struct user_profile u_profile
const ast_string_field join
static int menu_hash_cb(const void *obj, const int flags)
static char * handle_cli_confbridge_show_menus(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void * confbridge_cfg_alloc(void)
static int sound_option_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static char * handle_cli_confbridge_show_user_profiles(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static AO2_GLOBAL_OBJ_STATIC(cfg_handle)
const ast_string_field otherinparty
#define aco_option_register_custom(info, name, matchtype, types, default_val, handler, flags)
Register a config option.
static unsigned char leave[]
static struct aco_type user_type
static int menu_hook_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
const char * conf_get_sound(enum conf_sounds sound, struct bridge_profile_sounds *custom_sounds)
Looks to see if sound file is stored in bridge profile sounds, if not default sound is provided...
char name[MAX_PROFILE_NAME]
#define ast_set_flag(p, flag)
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
descriptor for a cli entry.
static void func_confbridge_data_destructor(struct func_confbridge_data *b_data)
static int apply_menu_to_user(struct confbridge_user *user, struct conf_menu *menu)
static struct aco_file confbridge_conf
static void conf_user_profile_copy(struct user_profile *dst, struct user_profile *src)
const struct user_profile * conf_find_user_profile(struct ast_channel *chan, const char *user_profile_name, struct user_profile *result)
find a user profile given a user profile's name and store that profile in result structure.
#define aco_option_register(info, name, matchtype, types, default_val, opt_type, flags,...)
Register a config option.
static struct aco_type general_type
Structure for variables, used for configurations and for channel variables.
struct bridge_profile_sounds * sounds
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
const ast_string_field onlyone
void conf_menu_entry_destroy(struct conf_menu_entry *menu_entry)
Destroys and frees all the actions stored in a menu_entry structure.
#define CHARFLDSET(type, field)
A helper macro to pass the appropriate arguments to aco_option_register for OPT_CHAR_ARRAY_T.
Type for a default handler that should do nothing.
Structure for a data store type.
struct bridge_profile b_profile
#define ast_cli_register_multiple(e, len)
Register multiple commands.
enum aco_process_status aco_process_config(struct aco_info *info, int reload)
Process a config info via the options registered with an aco_info.
#define ao2_global_obj_ref(holder)
struct ao2_container * bridge_profiles
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
static char * complete_bridge_profile_name(const char *line, const char *word, int pos, int state)
unsigned int silence_threshold
static char * handle_cli_confbridge_show_bridge_profiles(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void func_confbridge_destroy_cb(void *data)
Type for default option handler for bools (ast_true/ast_false) that are stored in a flag...
#define ast_strdup(str)
A wrapper for strdup()
Structure for a data store object.
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
static char * complete_user_profile_name(const char *line, const char *word, int pos, int state)
static struct aco_type bridge_type
The representation of a single configuration file to be processed.
void ast_cli(int fd, const char *fmt,...)
static void menu_hook_destroy(void *hook_pvt)
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define ACO_TYPES(...)
A helper macro to ensure that aco_info types always have a sentinel.
unsigned int announce_user_count_all_after
#define ast_set_flags_to(p, flag, value)
const ast_string_field hasjoin
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
static struct aco_type * menu_types[]
#define ast_strlen_zero(foo)
void conf_bridge_profile_copy(struct bridge_profile *dst, struct bridge_profile *src)
copies a bridge profile
Type for default option handler for character array strings.
static int menu_option_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
Configuration File Parser.
const ast_string_field begin
struct ao2_container * menus
static struct aco_type menu_type
#define FLDSET(type,...)
Convert a struct and list of fields to an argument list of field offsets.
#define DEFAULT_TALKING_THRESHOLD
int aco_info_init(struct aco_info *info)
Initialize an aco_info structure.
static void bridge_profile_sounds_destroy_cb(void *obj)
static void menu_destructor(void *obj)
static void * bridge_profile_alloc(const char *category)
static int set_sound(const char *sound_name, const char *sound_file, struct bridge_profile *b_profile)
void * aco_pending_config(struct aco_info *info)
Get pending config changes.
const ast_string_field errormenu
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Type for default option handler for unsigned integers.
static int video_mode_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
int conf_handle_dtmf(struct ast_bridge_channel *bridge_channel, struct confbridge_user *user, struct conf_menu_entry *menu_entry, struct conf_menu *menu)
Once a DTMF sequence matches a sequence in the user's DTMF menu, this function will get called to per...
static int copy_menu_entry(struct conf_menu_entry *dst, struct conf_menu_entry *src)
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
static int add_menu_entry(struct conf_menu *menu, const char *dtmf, const char *action_names)
void conf_bridge_profile_destroy(struct bridge_profile *b_profile)
Destroy a bridge profile found by 'conf_find_bridge_profile'.
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
#define ao2_ref(o, delta)
int conf_reload_config(void)
reload confbridge.conf file
const ast_string_field binauraloff
#define ast_strdupa(s)
duplicate a string in memory from the stack
static int bridge_template_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static char language[MAX_LANGUAGE]
struct ao2_container * container
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
char language[MAX_LANGUAGE]
const ast_string_field waitforleader
static int announce_user_count_all_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
unsigned int maximum_sample_rate
static void confbridge_cfg_destructor(void *obj)
Core PBX routines and definitions.
unsigned int internal_sample_rate
static struct stasis_rest_handlers sounds
REST handler for /api-docs/sounds.json.
Their was an error and no changes were applied.
static int menu_cmp_cb(void *obj, void *arg, int flags)
Configuration option-handling.
unsigned int video_update_discard
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".
static int user_template_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
void conf_destroy_config(void)
destroy the information loaded from the confbridge.conf file
const ast_string_field getpin
void aco_info_destroy(struct aco_info *info)
Destroy an initialized aco_info struct.
static struct ast_cli_entry cli_confbridge_parser[]
static struct aco_type * user_types[]
#define ao2_global_obj_release(holder)
static void * user_profile_alloc(const char *category)
const ast_string_field participantsmuted
static struct aco_type * bridge_types[]
#define ao2_iterator_next(iter)
#define ao2_alloc(data_size, destructor_fn)
struct ao2_container * user_profiles
static const struct ast_datastore_info confbridge_datastore
static char * handle_cli_confbridge_show_menu(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
const ast_string_field leave
unsigned int talking_threshold
const ast_string_field lockednow
static void * menu_alloc(const char *category)
#define ast_channel_unlock(chan)
static void parse(struct mgcp_request *req)
int conf_set_menu_to_user(struct ast_channel *chan, struct confbridge_user *user, const char *menu_profile_name)
find a menu profile given a menu profile's name and apply the menu in DTMF hooks. ...
#define SCOPED_AO2LOCK(varname, obj)
scoped lock specialization for ao2 mutexes.
const ast_string_field binauralon
#define ast_calloc(num, len)
A wrapper for calloc()
const ast_string_field participantsunmuted
int aco_set_defaults(struct aco_type *type, const char *category, void *obj)
Set all default options of obj.
struct ast_bridge_features features
char regcontext[AST_MAX_CONTEXT]
#define ao2_find(container, arg, flags)
const ast_string_field unmuted
int conf_find_menu_entry_by_sequence(const char *dtmf_sequence, struct conf_menu *menu, struct conf_menu_entry *result)
Finds a menu_entry in a menu structure matched by DTMF sequence.
static int conf_menu_profile_copy(struct conf_menu *dst, struct conf_menu *src)
structure to hold users read from users.conf
int ast_bridge_dtmf_hook(struct ast_bridge_features *features, const char *dtmf, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Attach a DTMF hook to a bridge features structure.
#define ast_clear_flag(p, flag)
static char * handle_cli_confbridge_show_user_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Support for logging to various files, console and syslog Configuration in file logger.conf.
static corosync_cfg_handle_t cfg_handle
const ast_string_field invalidpin
static int bridge_hash_cb(const void *obj, const int flags)
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Structure that contains information regarding a channel in a bridge.
char * strsep(char **str, const char *delims)
const ast_string_field onlyperson
char menu_name[MAX_PROFILE_NAME]
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Standard Command Line Interface.
Type information about a category-level configurable object.
static void * menu_find(struct ao2_container *container, const char *category)
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
static int bridge_cmp_cb(void *obj, void *arg, int flags)
static int remb_behavior_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"...
char name[MAX_PROFILE_NAME]
#define DEFAULT_MENU_PROFILE
int func_confbridge_helper(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static char regcontext[AST_MAX_CONTEXT]
static void * user_profile_find(struct ao2_container *container, const char *category)
The structure that represents a conference bridge user.
#define DEFAULT_BRIDGE_PROFILE
int error(const char *format,...)
#define ast_datastore_alloc(info, uid)
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
int conf_load_config(void)
load confbridge.conf file
#define DEFAULT_USER_PROFILE
static void bridge_profile_destructor(void *obj)
static char context[AST_MAX_CONTEXT]
const ast_string_field muted
static char * handle_cli_confbridge_show_bridge_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
int aco_process_var(struct aco_type *type, const char *cat, struct ast_variable *var, void *obj)
Parse a single ast_variable and apply it to an object.
unsigned int remb_send_interval
const ast_string_field leaderhasleft
const ast_string_field kicked
CONFIG_INFO_STANDARD(cfg_info, cfg_handle, confbridge_cfg_alloc,.files=ACO_FILES(&confbridge_conf),.pre_apply_config=verify_default_profiles,)
unsigned int mix_interval
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
static int add_action_to_menu_entry(struct conf_menu_entry *menu_entry, enum conf_menu_action_id id, char *databuf)
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
static void user_profile_destructor(void *obj)
const ast_string_field locked
#define DEFAULT_SILENCE_THRESHOLD
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
static struct bridge_profile_sounds * bridge_profile_sounds_alloc(void)
static void * bridge_profile_find(struct ao2_container *container, const char *category)
char announcement[PATH_MAX]
#define AST_APP_ARG(name)
Define an application argument.
const ast_string_field placeintoconf
const ast_string_field hasleft
const struct bridge_profile * conf_find_bridge_profile(struct ast_channel *chan, const char *bridge_profile_name, struct bridge_profile *result)
Find a bridge profile given a bridge profile's name and store that profile in result structure...
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
#define ao2_link(container, obj)
static int menu_template_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)