Asterisk - The Open Source Telephony Project GIT-master-27fb039
Loading...
Searching...
No Matches
Functions | Variables
bridge_builtin_interval_features.c File Reference

Built in bridging interval features. More...

#include "asterisk.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/bridge.h"
#include "asterisk/file.h"
#include "asterisk/app.h"
#include "asterisk/astobj2.h"
#include "asterisk/test.h"
#include "asterisk/say.h"
#include "asterisk/stringfields.h"
#include "asterisk/musiconhold.h"
#include "asterisk/causes.h"
Include dependency graph for bridge_builtin_interval_features.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int bridge_builtin_set_limits (struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags)
 
static int bridge_features_connect_callback (struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 
static int bridge_features_duration_callback (struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 
static void bridge_features_limits_copy (struct ast_bridge_features_limits *dst, struct ast_bridge_features_limits *src)
 
static void bridge_features_limits_dtor (void *vdoomed)
 
static int bridge_features_warning_callback (struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 
static void limits_interval_playback (struct ast_bridge_channel *bridge_channel, struct ast_bridge_features_limits *limits, const char *file)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Built in bridging interval features" , .key = ASTERISK_GPL_KEY , .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
 

Detailed Description

Built in bridging interval features.

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

Definition in file bridge_builtin_interval_features.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 215 of file bridge_builtin_interval_features.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 215 of file bridge_builtin_interval_features.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 215 of file bridge_builtin_interval_features.c.

◆ bridge_builtin_set_limits()

static int bridge_builtin_set_limits ( struct ast_bridge_features features,
struct ast_bridge_features_limits limits,
enum ast_bridge_hook_remove_flags  remove_flags 
)
static

Definition at line 148 of file bridge_builtin_interval_features.c.

151{
152 RAII_VAR(struct ast_bridge_features_limits *, feature_limits, NULL, ao2_cleanup);
153
154 if (!limits->duration) {
155 return -1;
156 }
157
158 /* Create limits hook_pvt data. */
160 feature_limits = ao2_alloc_options(sizeof(*feature_limits),
162 if (!feature_limits) {
164 return -1;
165 }
166 if (ast_bridge_features_limits_construct(feature_limits)) {
167 return -1;
168 }
169 bridge_features_limits_copy(feature_limits, limits);
170 feature_limits->quitting_time = ast_tvadd(ast_tvnow(),
171 ast_samp2tv(feature_limits->duration, 1000));
172
173 /* Install limit hooks. */
174 ao2_ref(feature_limits, +1);
176 feature_limits->duration,
177 bridge_features_duration_callback, feature_limits, __ao2_cleanup, remove_flags)) {
178 ast_log(LOG_ERROR, "Failed to schedule the duration limiter to the bridge channel.\n");
179 ao2_ref(feature_limits, -1);
180 return -1;
181 }
182 if (!ast_strlen_zero(feature_limits->connect_sound)) {
183 ao2_ref(feature_limits, +1);
185 bridge_features_connect_callback, feature_limits, __ao2_cleanup, remove_flags)) {
186 ast_log(LOG_WARNING, "Failed to schedule connect sound to the bridge channel.\n");
187 ao2_ref(feature_limits, -1);
188 }
189 }
190 if (feature_limits->warning && feature_limits->warning < feature_limits->duration) {
191 ao2_ref(feature_limits, +1);
193 feature_limits->duration - feature_limits->warning,
194 bridge_features_warning_callback, feature_limits, __ao2_cleanup, remove_flags)) {
195 ast_log(LOG_WARNING, "Failed to schedule warning sound playback to the bridge channel.\n");
196 ao2_ref(feature_limits, -1);
197 }
198 }
199
200 return 0;
201}
#define ast_log
Definition astobj2.c:42
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
#define ao2_cleanup(obj)
Definition astobj2.h:1934
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition astobj2.h:404
void __ao2_cleanup(void *obj)
Definition astobj2.c:677
static void bridge_features_limits_copy(struct ast_bridge_features_limits *dst, struct ast_bridge_features_limits *src)
static int bridge_features_warning_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
static int bridge_features_duration_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
static int bridge_features_connect_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
static void bridge_features_limits_dtor(void *vdoomed)
int ast_bridge_features_limits_construct(struct ast_bridge_features_limits *limits)
Constructor function for ast_bridge_features_limits.
Definition bridge.c:3475
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:3398
@ AST_BRIDGE_HOOK_TIMER_OPTION_MEDIA
#define LOG_ERROR
#define LOG_WARNING
#define ast_module_unref(mod)
Release a reference to the module.
Definition module.h:483
#define ast_module_ref(mod)
Hold a reference to the module.
Definition module.h:457
#define NULL
Definition resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
Structure that contains configuration information for the limits feature.
struct ast_module * self
Definition module.h:356
struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate)
Returns a timeval corresponding to the duration of n samples at rate r. Useful to convert samples to ...
Definition time.h:282
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition extconf.c:2280
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition time.h:159
#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:981

References __ao2_cleanup(), AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_cleanup, ao2_ref, ast_bridge_features_limits_construct(), AST_BRIDGE_HOOK_TIMER_OPTION_MEDIA, ast_bridge_interval_hook(), ast_log, ast_module_ref, ast_module_unref, ast_samp2tv(), ast_strlen_zero(), ast_tvadd(), ast_tvnow(), bridge_features_connect_callback(), bridge_features_duration_callback(), bridge_features_limits_copy(), bridge_features_limits_dtor(), bridge_features_warning_callback(), LOG_ERROR, LOG_WARNING, NULL, RAII_VAR, and ast_module_info::self.

Referenced by load_module().

◆ bridge_features_connect_callback()

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

Definition at line 115 of file bridge_builtin_interval_features.c.

116{
117 struct ast_bridge_features_limits *limits = hook_pvt;
118
119 limits_interval_playback(bridge_channel, limits, limits->connect_sound);
120 return -1;
121}
static void limits_interval_playback(struct ast_bridge_channel *bridge_channel, struct ast_bridge_features_limits *limits, const char *file)

References limits_interval_playback().

Referenced by bridge_builtin_set_limits().

◆ bridge_features_duration_callback()

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

Definition at line 51 of file bridge_builtin_interval_features.c.

52{
53 struct ast_bridge_features_limits *limits = hook_pvt;
54
55 if (!ast_strlen_zero(limits->duration_sound)) {
56 ast_stream_and_wait(bridge_channel->chan, limits->duration_sound, AST_DIGIT_NONE);
57 }
58
61
62 ast_test_suite_event_notify("BRIDGE_TIMELIMIT", "Channel1: %s",
63 ast_channel_name(bridge_channel->chan));
64 return -1;
65}
@ 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
const char * ast_channel_name(const struct ast_channel *chan)
int ast_stream_and_wait(struct ast_channel *chan, const char *file, const char *digits)
stream file until digit If the file name is non-empty, try to play it.
Definition file.c:1912
#define AST_DIGIT_NONE
Definition file.h:47
struct ast_channel * chan
#define ast_test_suite_event_notify(s, f,...)
Definition test.h:189

References ast_bridge_channel_leave_bridge(), AST_CAUSE_NORMAL_CLEARING, ast_channel_name(), AST_DIGIT_NONE, ast_stream_and_wait(), ast_strlen_zero(), ast_test_suite_event_notify, BRIDGE_CHANNEL_STATE_END, and ast_bridge_channel::chan.

Referenced by bridge_builtin_set_limits().

◆ bridge_features_limits_copy()

static void bridge_features_limits_copy ( struct ast_bridge_features_limits dst,
struct ast_bridge_features_limits src 
)
static

Definition at line 131 of file bridge_builtin_interval_features.c.

132{
133 ast_string_fields_copy(dst, src);
134 dst->quitting_time = src->quitting_time;
135 dst->duration = src->duration;
136 dst->warning = src->warning;
137 dst->frequency = src->frequency;
138}
#define ast_string_fields_copy(copy, orig)
Copy all string fields from one instance to another of the same structure.

References ast_string_fields_copy, ast_bridge_features_limits::duration, ast_bridge_features_limits::frequency, ast_bridge_features_limits::quitting_time, and ast_bridge_features_limits::warning.

Referenced by bridge_builtin_set_limits().

◆ bridge_features_limits_dtor()

static void bridge_features_limits_dtor ( void *  vdoomed)
static

Definition at line 140 of file bridge_builtin_interval_features.c.

141{
142 struct ast_bridge_features_limits *doomed = vdoomed;
143
146}
void ast_bridge_features_limits_destroy(struct ast_bridge_features_limits *limits)
Destructor function for ast_bridge_features_limits.
Definition bridge.c:3486

References ast_bridge_features_limits_destroy(), ast_module_unref, and ast_module_info::self.

Referenced by bridge_builtin_set_limits().

◆ bridge_features_warning_callback()

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

Definition at line 123 of file bridge_builtin_interval_features.c.

124{
125 struct ast_bridge_features_limits *limits = hook_pvt;
126
127 limits_interval_playback(bridge_channel, limits, limits->warning_sound);
128 return limits->frequency ?: -1;
129}

References limits_interval_playback().

Referenced by bridge_builtin_set_limits().

◆ limits_interval_playback()

static void limits_interval_playback ( struct ast_bridge_channel bridge_channel,
struct ast_bridge_features_limits limits,
const char *  file 
)
static

Definition at line 67 of file bridge_builtin_interval_features.c.

68{
69 if (!strcasecmp(file, "timeleft")) {
70 unsigned int remaining = ast_tvdiff_ms(limits->quitting_time, ast_tvnow()) / 1000;
71 unsigned int min;
72 unsigned int sec;
73
74 if (remaining <= 0) {
75 return;
76 }
77
78 if ((remaining / 60) > 1) {
79 min = remaining / 60;
80 sec = remaining % 60;
81 } else {
82 min = 0;
83 sec = remaining;
84 }
85
86 ast_stream_and_wait(bridge_channel->chan, "vm-youhave", AST_DIGIT_NONE);
87 if (min) {
88 ast_say_number(bridge_channel->chan, min, AST_DIGIT_NONE,
89 ast_channel_language(bridge_channel->chan), NULL);
90 ast_stream_and_wait(bridge_channel->chan, "queue-minutes", AST_DIGIT_NONE);
91 }
92 if (sec) {
93 ast_say_number(bridge_channel->chan, sec, AST_DIGIT_NONE,
94 ast_channel_language(bridge_channel->chan), NULL);
95 ast_stream_and_wait(bridge_channel->chan, "queue-seconds", AST_DIGIT_NONE);
96 }
97 } else {
98 ast_stream_and_wait(bridge_channel->chan, file, AST_DIGIT_NONE);
99 }
100
101 /*
102 * It may be necessary to resume music on hold after we finish
103 * playing the announcment.
104 */
105 if (ast_test_flag(ast_channel_flags(bridge_channel->chan), AST_FLAG_MOH)) {
106 const char *latest_musicclass;
107
108 ast_channel_lock(bridge_channel->chan);
109 latest_musicclass = ast_strdupa(ast_channel_latest_musicclass(bridge_channel->chan));
110 ast_channel_unlock(bridge_channel->chan);
111 ast_moh_start(bridge_channel->chan, latest_musicclass, NULL);
112 }
113}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
const char * ast_channel_latest_musicclass(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition channel.h:2982
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
const char * ast_channel_language(const struct ast_channel *chan)
@ AST_FLAG_MOH
Definition channel.h:1011
#define ast_channel_unlock(chan)
Definition channel.h:2983
#define min(a, b)
Definition f2c.h:197
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:7778
int ast_say_number(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options)
says a number
Definition channel.c:8279
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition time.h:107
#define ast_test_flag(p, flag)
Definition utils.h:64

References ast_channel_flags(), ast_channel_language(), ast_channel_latest_musicclass(), ast_channel_lock, ast_channel_unlock, AST_DIGIT_NONE, AST_FLAG_MOH, ast_moh_start(), ast_say_number(), ast_strdupa, ast_stream_and_wait(), ast_test_flag, ast_tvdiff_ms(), ast_tvnow(), ast_bridge_channel::chan, min, and NULL.

Referenced by bridge_features_connect_callback(), and bridge_features_warning_callback().

◆ load_module()

static int load_module ( void  )
static

Definition at line 209 of file bridge_builtin_interval_features.c.

210{
213}
static int bridge_builtin_set_limits(struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags)
int ast_bridge_interval_register(enum ast_bridge_builtin_interval interval, ast_bridge_builtin_set_limits_fn callback)
Register a handler for a built in interval feature.
Definition bridge.c:3186
@ AST_BRIDGE_BUILTIN_INTERVAL_LIMITS

References AST_BRIDGE_BUILTIN_INTERVAL_LIMITS, ast_bridge_interval_register(), and bridge_builtin_set_limits().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 203 of file bridge_builtin_interval_features.c.

204{
206 return 0;
207}
int ast_bridge_interval_unregister(enum ast_bridge_builtin_interval interval)
Unregisters a handler for a built in interval feature.
Definition bridge.c:3198

References AST_BRIDGE_BUILTIN_INTERVAL_LIMITS, and ast_bridge_interval_unregister().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Built in bridging interval features" , .key = ASTERISK_GPL_KEY , .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 215 of file bridge_builtin_interval_features.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 215 of file bridge_builtin_interval_features.c.