Asterisk - The Open Source Telephony Project GIT-master-a358458
Data Structures | Macros | Enumerations | Functions | Variables
app_bridgewait.c File Reference

Application to place the channel into a holding Bridge. More...

#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/features.h"
#include "asterisk/say.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/bridge.h"
#include "asterisk/musiconhold.h"
#include "asterisk/astobj2.h"
#include "asterisk/causes.h"
Include dependency graph for app_bridgewait.c:

Go to the source code of this file.

Data Structures

struct  wait_bridge_wrapper
 

Macros

#define APP_NAME   "BridgeWait"
 
#define DEFAULT_BRIDGE_NAME   "default"
 

Enumerations

enum  bridgewait_args { OPT_ARG_ENTERTAINMENT , OPT_ARG_MOHCLASS , OPT_ARG_TIMEOUT , OPT_ARG_ARRAY_SIZE }
 
enum  bridgewait_flags { MUXFLAG_MOHCLASS = (1 << 0) , MUXFLAG_ENTERTAINMENT = (1 << 1) , MUXFLAG_TIMEOUT = (1 << 2) , MUXFLAG_NOANSWER = (1 << 3) }
 
enum  wait_bridge_roles { ROLE_PARTICIPANT = 0 , ROLE_ANNOUNCER , ROLE_INVALID }
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static int apply_option_entertainment (struct ast_channel *chan, const char *entertainment_arg)
 
static int apply_option_moh (struct ast_channel *chan, const char *class_arg)
 
static int apply_option_timeout (struct ast_bridge_features *features, char *duration_arg)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int bridgewait_exec (struct ast_channel *chan, const char *data)
 
static int bridgewait_timeout_callback (struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 
static struct wait_bridge_wrapperget_wait_bridge_wrapper (const char *bridge_name)
 
static int load_module (void)
 
static int process_options (struct ast_channel *chan, struct ast_flags *flags, char **opts, struct ast_bridge_features *features, enum wait_bridge_roles role)
 
static int unload_module (void)
 
static enum wait_bridge_roles validate_role (const char *role)
 
static int wait_bridge_hash_fn (const void *obj, const int flags)
 
static int wait_bridge_sort_fn (const void *obj_left, const void *obj_right, const int flags)
 
static struct wait_bridge_wrapperwait_bridge_wrapper_alloc (const char *bridge_name, struct ast_bridge *bridge)
 
static void wait_bridge_wrapper_destructor (void *obj)
 
static struct wait_bridge_wrapperwait_bridge_wrapper_find_by_name (const char *bridge_name)
 
static void wait_wrapper_removal (struct wait_bridge_wrapper *wrapper)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Place the channel into a holding bridge application" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static const struct ast_app_option bridgewait_opts [128] = { [ 'e' ] = { .flag = MUXFLAG_ENTERTAINMENT , .arg_index = OPT_ARG_ENTERTAINMENT + 1 }, [ 'm' ] = { .flag = MUXFLAG_MOHCLASS , .arg_index = OPT_ARG_MOHCLASS + 1 }, [ 'S' ] = { .flag = MUXFLAG_TIMEOUT , .arg_index = OPT_ARG_TIMEOUT + 1 }, [ 'n' ] = { .flag = MUXFLAG_NOANSWER }, }
 
static struct ao2_containerwait_bridge_wrappers
 

Detailed Description

Application to place the channel into a holding Bridge.

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

Definition in file app_bridgewait.c.

Macro Definition Documentation

◆ APP_NAME

#define APP_NAME   "BridgeWait"

Definition at line 119 of file app_bridgewait.c.

◆ DEFAULT_BRIDGE_NAME

#define DEFAULT_BRIDGE_NAME   "default"

Definition at line 120 of file app_bridgewait.c.

Enumeration Type Documentation

◆ bridgewait_args

Enumerator
OPT_ARG_ENTERTAINMENT 
OPT_ARG_MOHCLASS 
OPT_ARG_TIMEOUT 
OPT_ARG_ARRAY_SIZE 

Definition at line 195 of file app_bridgewait.c.

195 {
199 OPT_ARG_ARRAY_SIZE, /* Always the last element of the enum */
200};
@ OPT_ARG_MOHCLASS
@ OPT_ARG_ENTERTAINMENT
@ OPT_ARG_TIMEOUT
@ OPT_ARG_ARRAY_SIZE

◆ bridgewait_flags

Enumerator
MUXFLAG_MOHCLASS 
MUXFLAG_ENTERTAINMENT 
MUXFLAG_TIMEOUT 
MUXFLAG_NOANSWER 

Definition at line 188 of file app_bridgewait.c.

188 {
189 MUXFLAG_MOHCLASS = (1 << 0),
190 MUXFLAG_ENTERTAINMENT = (1 << 1),
191 MUXFLAG_TIMEOUT = (1 << 2),
192 MUXFLAG_NOANSWER = (1 << 3),
193};
@ MUXFLAG_ENTERTAINMENT
@ MUXFLAG_NOANSWER
@ MUXFLAG_TIMEOUT
@ MUXFLAG_MOHCLASS

◆ wait_bridge_roles

Enumerator
ROLE_PARTICIPANT 
ROLE_ANNOUNCER 
ROLE_INVALID 

Definition at line 267 of file app_bridgewait.c.

267 {
271};
@ ROLE_ANNOUNCER
@ ROLE_INVALID
@ ROLE_PARTICIPANT

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 517 of file app_bridgewait.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 517 of file app_bridgewait.c.

◆ apply_option_entertainment()

static int apply_option_entertainment ( struct ast_channel chan,
const char *  entertainment_arg 
)
static

Definition at line 246 of file app_bridgewait.c.

247{
248 char entertainment = entertainment_arg[0];
249
250 switch (entertainment) {
251 case 'm':
252 return ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "musiconhold");
253 case 'r':
254 return ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "ringing");
255 case 's':
256 return ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "silence");
257 case 'h':
258 return ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "hold");
259 case 'n':
260 return ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "none");
261 default:
262 ast_log(LOG_ERROR, "Invalid argument for BridgeWait entertainment '%s'\n", entertainment_arg);
263 return -1;
264 }
265}
#define ast_log
Definition: astobj2.c:42
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.
Definition: bridge_roles.c:375
#define LOG_ERROR

References ast_channel_set_bridge_role_option(), ast_log, and LOG_ERROR.

Referenced by process_options().

◆ apply_option_moh()

static int apply_option_moh ( struct ast_channel chan,
const char *  class_arg 
)
static

Definition at line 241 of file app_bridgewait.c.

242{
243 return ast_channel_set_bridge_role_option(chan, "holding_participant", "moh_class", class_arg);
244}

References ast_channel_set_bridge_role_option().

Referenced by process_options().

◆ apply_option_timeout()

static int apply_option_timeout ( struct ast_bridge_features features,
char *  duration_arg 
)
static

Definition at line 217 of file app_bridgewait.c.

218{
219 unsigned int duration;
220
221 if (ast_strlen_zero(duration_arg)) {
222 ast_log(LOG_ERROR, "Timeout option 'S': No value provided.\n");
223 return -1;
224 }
225 if (sscanf(duration_arg, "%u", &duration) != 1 || duration == 0) {
226 ast_log(LOG_ERROR, "Timeout option 'S': Invalid value provided '%s'.\n",
227 duration_arg);
228 return -1;
229 }
230
231 duration *= 1000;
232 if (ast_bridge_interval_hook(features, 0, duration, bridgewait_timeout_callback,
234 ast_log(LOG_ERROR, "Timeout option 'S': Could not create timer.\n");
235 return -1;
236 }
237
238 return 0;
239}
static int bridgewait_timeout_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
int ast_bridge_interval_hook(struct ast_bridge_features *features, enum ast_bridge_hook_timer_option flags, unsigned int interval, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Attach an interval hook to a bridge features structure.
Definition: bridge.c:3319
@ AST_BRIDGE_HOOK_REMOVE_ON_PULL
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65

References AST_BRIDGE_HOOK_REMOVE_ON_PULL, ast_bridge_interval_hook(), ast_log, ast_strlen_zero(), bridgewait_timeout_callback(), LOG_ERROR, and NULL.

Referenced by process_options().

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 517 of file app_bridgewait.c.

◆ bridgewait_exec()

static int bridgewait_exec ( struct ast_channel chan,
const char *  data 
)
static

Definition at line 421 of file app_bridgewait.c.

422{
423 char *bridge_name = DEFAULT_BRIDGE_NAME;
424 struct ast_bridge_features chan_features;
425 struct ast_flags flags = { 0 };
426 char *parse;
428 char *opts[OPT_ARG_ARRAY_SIZE] = { NULL, };
429 struct wait_bridge_wrapper *bridge_wrapper;
430 int res;
431
434 AST_APP_ARG(role);
436 AST_APP_ARG(other); /* Any remaining unused arguments */
437 );
438
439 parse = ast_strdupa(data);
441
442 if (!ast_strlen_zero(args.name)) {
443 bridge_name = args.name;
444 }
445
446 if (!ast_strlen_zero(args.role)) {
447 role = validate_role(args.role);
448 if (role == ROLE_INVALID) {
449 ast_log(LOG_ERROR, "Requested waiting bridge role '%s' is invalid.\n", args.role);
450 return -1;
451 }
452 }
453
454 if (ast_bridge_features_init(&chan_features)) {
455 ast_bridge_features_cleanup(&chan_features);
456 ast_log(LOG_ERROR, "'%s' failed to enter the waiting bridge - could not set up channel features\n",
457 ast_channel_name(chan));
458 return -1;
459 }
460
461 if (args.options) {
462 ast_app_parse_options(bridgewait_opts, &flags, opts, args.options);
463 }
464
465 /* Answer the channel if needed */
467 ast_answer(chan);
468 }
469
470 if (process_options(chan, &flags, opts, &chan_features, role)) {
471 ast_bridge_features_cleanup(&chan_features);
472 return -1;
473 }
474
475 bridge_wrapper = get_wait_bridge_wrapper(bridge_name);
476 if (!bridge_wrapper) {
477 ast_log(LOG_WARNING, "Failed to find or create waiting bridge '%s' for '%s'.\n", bridge_name, ast_channel_name(chan));
478 ast_bridge_features_cleanup(&chan_features);
479 return -1;
480 }
481
482 ast_verb(3, "%s is entering waiting bridge %s:%s\n", ast_channel_name(chan), bridge_name, bridge_wrapper->bridge->uniqueid);
483 res = ast_bridge_join(bridge_wrapper->bridge, chan, NULL, &chan_features, NULL, 0);
484 wait_wrapper_removal(bridge_wrapper);
485 ast_bridge_features_cleanup(&chan_features);
486
487 if (res) {
488 /* For the lifetime of the bridge wrapper the bridge itself will be valid, if an error occurs it is because
489 * of extreme situations.
490 */
491 ast_log(LOG_WARNING, "Failed to join waiting bridge '%s' for '%s'.\n", bridge_name, ast_channel_name(chan));
492 }
493
494 return (res || ast_check_hangup_locked(chan)) ? -1 : 0;
495}
static enum wait_bridge_roles validate_role(const char *role)
#define DEFAULT_BRIDGE_NAME
static int process_options(struct ast_channel *chan, struct ast_flags *flags, char **opts, struct ast_bridge_features *features, enum wait_bridge_roles role)
wait_bridge_roles
static const struct ast_app_option bridgewait_opts[128]
static struct wait_bridge_wrapper * get_wait_bridge_wrapper(const char *bridge_name)
static void wait_wrapper_removal(struct wait_bridge_wrapper *wrapper)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
int ast_bridge_join(struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, struct ast_bridge_tech_optimizations *tech_args, enum ast_bridge_join_flags flags)
Join a channel to a bridge (blocking)
Definition: bridge.c:1621
int ast_bridge_features_init(struct ast_bridge_features *features)
Initialize bridge features structure.
Definition: bridge.c:3620
void ast_bridge_features_cleanup(struct ast_bridge_features *features)
Clean up the contents of a bridge features structure.
Definition: bridge.c:3653
const char * ast_channel_name(const struct ast_channel *chan)
int ast_check_hangup_locked(struct ast_channel *chan)
Definition: channel.c:459
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2805
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_STATE_UP
Definition: channelstate.h:42
static const char name[]
Definition: format_mp3.c:68
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
int ast_app_parse_options(const struct ast_app_option *options, struct ast_flags *flags, char **args, char *optstr)
Parses a string containing application options and sets flags/arguments.
Definition: main/app.c:3056
#define ast_verb(level,...)
#define LOG_WARNING
Structure that contains features information.
const ast_string_field uniqueid
Definition: bridge.h:401
Structure used to handle boolean flags.
Definition: utils.h:199
unsigned int flags
Definition: utils.h:200
struct ast_bridge * bridge
const char * args
static struct test_options options
#define ast_test_flag(p, flag)
Definition: utils.h:63

References args, ast_answer(), AST_APP_ARG, ast_app_parse_options(), ast_bridge_features_cleanup(), ast_bridge_features_init(), ast_bridge_join(), ast_channel_name(), ast_check_hangup_locked(), AST_DECLARE_APP_ARGS, ast_log, AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_strdupa, ast_strlen_zero(), ast_test_flag, ast_verb, wait_bridge_wrapper::bridge, bridgewait_opts, DEFAULT_BRIDGE_NAME, ast_flags::flags, get_wait_bridge_wrapper(), LOG_ERROR, LOG_WARNING, MUXFLAG_NOANSWER, name, NULL, OPT_ARG_ARRAY_SIZE, options, process_options(), ROLE_INVALID, ROLE_PARTICIPANT, ast_bridge::uniqueid, validate_role(), and wait_wrapper_removal().

Referenced by load_module().

◆ bridgewait_timeout_callback()

static int bridgewait_timeout_callback ( struct ast_bridge_channel bridge_channel,
void *  hook_pvt 
)
static

Definition at line 209 of file app_bridgewait.c.

210{
211 ast_verb(3, "Channel %s timed out.\n", ast_channel_name(bridge_channel->chan));
214 return -1;
215}
@ BRIDGE_CHANNEL_STATE_END
void ast_bridge_channel_leave_bridge(struct ast_bridge_channel *bridge_channel, enum bridge_channel_state new_state, int cause)
Set bridge channel state to leave bridge (if not leaving already).
#define AST_CAUSE_NORMAL_CLEARING
Definition: causes.h:106
struct ast_channel * chan

References ast_bridge_channel_leave_bridge(), AST_CAUSE_NORMAL_CLEARING, ast_channel_name(), ast_verb, BRIDGE_CHANNEL_STATE_END, and ast_bridge_channel::chan.

Referenced by apply_option_timeout().

◆ get_wait_bridge_wrapper()

static struct wait_bridge_wrapper * get_wait_bridge_wrapper ( const char *  bridge_name)
static

Definition at line 346 of file app_bridgewait.c.

347{
348 struct wait_bridge_wrapper * wrapper;
349 struct ast_bridge *bridge = NULL;
350
352
353 if ((wrapper = wait_bridge_wrapper_find_by_name(bridge_name))) {
354 return wrapper;
355 }
356
357 /*
358 * Holding bridges can allow local channel move/swap
359 * optimization to the bridge. However, we cannot allow it for
360 * this holding bridge because the call will lose the channel
361 * roles and dialplan location as a result.
362 */
367
368 if (!bridge) {
369 return NULL;
370 }
371
372 /* The bridge reference is unconditionally passed. */
373 return wait_bridge_wrapper_alloc(bridge_name, bridge);
374}
static struct wait_bridge_wrapper * wait_bridge_wrapper_find_by_name(const char *bridge_name)
static struct ao2_container * wait_bridge_wrappers
static struct wait_bridge_wrapper * wait_bridge_wrapper_alloc(const char *bridge_name, struct ast_bridge *bridge)
#define APP_NAME
ast_mutex_t lock
Definition: app_sla.c:331
struct ast_bridge * ast_bridge_base_new(uint32_t capabilities, unsigned int flags, const char *creator, const char *name, const char *id)
Create a new base class bridge.
Definition: bridge.c:934
@ AST_BRIDGE_CAPABILITY_HOLDING
Definition: bridge.h:86
@ AST_BRIDGE_FLAG_SWAP_INHIBIT_TO
@ AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM
@ AST_BRIDGE_FLAG_TRANSFER_PROHIBITED
@ AST_BRIDGE_FLAG_MERGE_INHIBIT_TO
@ AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM
#define SCOPED_AO2LOCK(varname, obj)
scoped lock specialization for ao2 mutexes.
Definition: lock.h:604
Structure that contains information about a bridge.
Definition: bridge.h:349

References APP_NAME, ast_bridge_base_new(), AST_BRIDGE_CAPABILITY_HOLDING, AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM, AST_BRIDGE_FLAG_MERGE_INHIBIT_TO, AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM, AST_BRIDGE_FLAG_SWAP_INHIBIT_TO, AST_BRIDGE_FLAG_TRANSFER_PROHIBITED, lock, NULL, SCOPED_AO2LOCK, wait_bridge_wrapper_alloc(), wait_bridge_wrapper_find_by_name(), and wait_bridge_wrappers.

Referenced by bridgewait_exec().

◆ load_module()

static int load_module ( void  )
static

Definition at line 504 of file app_bridgewait.c.

505{
509
511 return -1;
512 }
513
515}
static int wait_bridge_hash_fn(const void *obj, const int flags)
static int bridgewait_exec(struct ast_channel *chan, const char *data)
static int wait_bridge_sort_fn(const void *obj_left, const void *obj_right, const int flags)
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition: astobj2.h:1303
@ AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT
Reject objects with duplicate keys in container.
Definition: astobj2.h:1188
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
Definition: module.h:626

References AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, APP_NAME, ast_register_application_xml, bridgewait_exec(), NULL, wait_bridge_hash_fn(), wait_bridge_sort_fn(), and wait_bridge_wrappers.

◆ process_options()

static int process_options ( struct ast_channel chan,
struct ast_flags flags,
char **  opts,
struct ast_bridge_features features,
enum wait_bridge_roles  role 
)
static

Definition at line 273 of file app_bridgewait.c.

274{
275 if (ast_test_flag(flags, MUXFLAG_TIMEOUT)) {
276 if (apply_option_timeout(features, opts[OPT_ARG_TIMEOUT])) {
277 return -1;
278 }
279 }
280
281 switch (role) {
282 case ROLE_PARTICIPANT:
283 if (ast_channel_add_bridge_role(chan, "holding_participant")) {
284 return -1;
285 }
286
287 if (ast_test_flag(flags, MUXFLAG_MOHCLASS)) {
288 if (apply_option_moh(chan, opts[OPT_ARG_MOHCLASS])) {
289 return -1;
290 }
291 }
292
295 return -1;
296 }
297 }
298
299 break;
300 case ROLE_ANNOUNCER:
301 if (ast_channel_add_bridge_role(chan, "announcer")) {
302 return -1;
303 }
304 break;
305 case ROLE_INVALID:
306 ast_assert(0);
307 return -1;
308 }
309
310 return 0;
311}
static int apply_option_timeout(struct ast_bridge_features *features, char *duration_arg)
static int apply_option_moh(struct ast_channel *chan, const char *class_arg)
static int apply_option_entertainment(struct ast_channel *chan, const char *entertainment_arg)
int ast_channel_add_bridge_role(struct ast_channel *chan, const char *role_name)
Adds a bridge role to a channel.
Definition: bridge_roles.c:313
#define ast_assert(a)
Definition: utils.h:739

References apply_option_entertainment(), apply_option_moh(), apply_option_timeout(), ast_assert, ast_channel_add_bridge_role(), ast_test_flag, MUXFLAG_ENTERTAINMENT, MUXFLAG_MOHCLASS, MUXFLAG_TIMEOUT, OPT_ARG_ENTERTAINMENT, OPT_ARG_MOHCLASS, OPT_ARG_TIMEOUT, ROLE_ANNOUNCER, ROLE_INVALID, and ROLE_PARTICIPANT.

Referenced by bridgewait_exec().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 497 of file app_bridgewait.c.

498{
500
502}
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx_app.c:392

References ao2_cleanup, APP_NAME, ast_unregister_application(), and wait_bridge_wrappers.

◆ validate_role()

static enum wait_bridge_roles validate_role ( const char *  role)
static

Definition at line 399 of file app_bridgewait.c.

400{
401 if (!strcmp(role, "participant")) {
402 return ROLE_PARTICIPANT;
403 } else if (!strcmp(role, "announcer")) {
404 return ROLE_ANNOUNCER;
405 } else {
406 return ROLE_INVALID;
407 }
408}

References ROLE_ANNOUNCER, ROLE_INVALID, and ROLE_PARTICIPANT.

Referenced by bridgewait_exec().

◆ wait_bridge_hash_fn()

static int wait_bridge_hash_fn ( const void *  obj,
const int  flags 
)
static

Definition at line 143 of file app_bridgewait.c.

144{
145 const struct wait_bridge_wrapper *entry;
146 const char *key;
147
148 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
149 case OBJ_KEY:
150 key = obj;
151 return ast_str_hash(key);
152 case OBJ_POINTER:
153 entry = obj;
154 return ast_str_hash(entry->name);
155 default:
156 /* Hash can only work on something with a full key. */
157 ast_assert(0);
158 return 0;
159 }
160}
#define OBJ_KEY
Definition: astobj2.h:1151
#define OBJ_POINTER
Definition: astobj2.h:1150
#define OBJ_PARTIAL_KEY
Definition: astobj2.h:1152
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:1259
Definition: search.h:40

References ast_assert, ast_str_hash(), OBJ_KEY, OBJ_PARTIAL_KEY, and OBJ_POINTER.

Referenced by load_module().

◆ wait_bridge_sort_fn()

static int wait_bridge_sort_fn ( const void *  obj_left,
const void *  obj_right,
const int  flags 
)
static

Definition at line 162 of file app_bridgewait.c.

163{
164 const struct wait_bridge_wrapper *left = obj_left;
165 const struct wait_bridge_wrapper *right = obj_right;
166 const char *right_key = obj_right;
167 int cmp;
168
169 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
170 case OBJ_POINTER:
171 right_key = right->name;
172 /* Fall through */
173 case OBJ_KEY:
174 cmp = strcmp(left->name, right_key);
175 break;
176 case OBJ_PARTIAL_KEY:
177 cmp = strncmp(left->name, right_key, strlen(right_key));
178 break;
179 default:
180 /* Sort can only work on something with a full or partial key. */
181 ast_assert(0);
182 cmp = 0;
183 break;
184 }
185 return cmp;
186}

References ast_assert, wait_bridge_wrapper::name, OBJ_KEY, OBJ_PARTIAL_KEY, and OBJ_POINTER.

Referenced by load_module().

◆ wait_bridge_wrapper_alloc()

static struct wait_bridge_wrapper * wait_bridge_wrapper_alloc ( const char *  bridge_name,
struct ast_bridge bridge 
)
static

Definition at line 324 of file app_bridgewait.c.

325{
326 struct wait_bridge_wrapper *bridge_wrapper;
327
328 bridge_wrapper = ao2_alloc_options(sizeof(*bridge_wrapper) + strlen(bridge_name) + 1,
330 if (!bridge_wrapper) {
332 return NULL;
333 }
334
335 strcpy(bridge_wrapper->name, bridge_name);
336 bridge_wrapper->bridge = bridge;
337
338 if (!ao2_link(wait_bridge_wrappers, bridge_wrapper)) {
339 ao2_cleanup(bridge_wrapper);
340 return NULL;
341 }
342
343 return bridge_wrapper;
344}
static void wait_bridge_wrapper_destructor(void *obj)
#define ao2_link(container, obj)
Add an object to a container.
Definition: astobj2.h:1532
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:404
int ast_bridge_destroy(struct ast_bridge *bridge, int cause)
Destroy a bridge.
Definition: bridge.c:944

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_cleanup, ao2_link, ast_bridge_destroy(), wait_bridge_wrapper::bridge, wait_bridge_wrapper::name, NULL, wait_bridge_wrapper_destructor(), and wait_bridge_wrappers.

Referenced by get_wait_bridge_wrapper().

◆ wait_bridge_wrapper_destructor()

static void wait_bridge_wrapper_destructor ( void *  obj)
static

Definition at line 129 of file app_bridgewait.c.

130{
131 struct wait_bridge_wrapper *wrapper = obj;
132
133 if (wrapper->bridge) {
134 ast_bridge_destroy(wrapper->bridge, 0);
135 }
136}

References ast_bridge_destroy(), and wait_bridge_wrapper::bridge.

Referenced by wait_bridge_wrapper_alloc().

◆ wait_bridge_wrapper_find_by_name()

static struct wait_bridge_wrapper * wait_bridge_wrapper_find_by_name ( const char *  bridge_name)
static

Definition at line 138 of file app_bridgewait.c.

139{
140 return ao2_find(wait_bridge_wrappers, bridge_name, OBJ_KEY);
141}
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736

References ao2_find, OBJ_KEY, and wait_bridge_wrappers.

Referenced by get_wait_bridge_wrapper().

◆ wait_wrapper_removal()

static void wait_wrapper_removal ( struct wait_bridge_wrapper wrapper)
static

Definition at line 383 of file app_bridgewait.c.

384{
385 if (!wrapper) {
386 return;
387 }
388
390 if (ao2_ref(wrapper, 0) == 2) {
391 /* Either we have the only real reference or else wrapper isn't in the container anyway. */
393 }
395
396 ao2_cleanup(wrapper);
397}
#define ao2_unlink(container, obj)
Remove an object from a container.
Definition: astobj2.h:1578
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459

References ao2_cleanup, ao2_lock, ao2_ref, ao2_unlink, ao2_unlock, and wait_bridge_wrappers.

Referenced by bridgewait_exec().

Variable Documentation

◆ __mod_info

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

Definition at line 517 of file app_bridgewait.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 517 of file app_bridgewait.c.

◆ bridgewait_opts

const struct ast_app_option bridgewait_opts[128] = { [ 'e' ] = { .flag = MUXFLAG_ENTERTAINMENT , .arg_index = OPT_ARG_ENTERTAINMENT + 1 }, [ 'm' ] = { .flag = MUXFLAG_MOHCLASS , .arg_index = OPT_ARG_MOHCLASS + 1 }, [ 'S' ] = { .flag = MUXFLAG_TIMEOUT , .arg_index = OPT_ARG_TIMEOUT + 1 }, [ 'n' ] = { .flag = MUXFLAG_NOANSWER }, }
static

Definition at line 207 of file app_bridgewait.c.

Referenced by bridgewait_exec().

◆ wait_bridge_wrappers

struct ao2_container* wait_bridge_wrappers
static