aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorseanbright <seanbright@f38db490-d61c-443f-a65b-d21fe96a405b>2008-11-09 01:34:59 +0000
committerseanbright <seanbright@f38db490-d61c-443f-a65b-d21fe96a405b>2008-11-09 01:34:59 +0000
commit457786b0a72867e9153db746b73626f1affb3872 (patch)
treec4ec458bd6ccc96d0a4f31ae33890b45626608ce
parent43715a8e2b7cc0021a4764e979cb1403e770e36e (diff)
Merged revisions 155554 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r155554 | seanbright | 2008-11-08 20:27:00 -0500 (Sat, 08 Nov 2008) | 14 lines Merged revisions 155553 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r155553 | seanbright | 2008-11-08 20:08:07 -0500 (Sat, 08 Nov 2008) | 6 lines Use static functions here instead of nested ones. This requires a small change to the ast_bridge_config struct as well. To understand the reason for this change, see the following post: http://gcc.gnu.org/ml/gcc-help/2008-11/msg00049.html ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@155555 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_dial.c43
-rw-r--r--apps/app_followme.c43
-rw-r--r--apps/app_queue.c17
-rw-r--r--include/asterisk/channel.h3
-rw-r--r--main/features.c2
5 files changed, 57 insertions, 51 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 25776c0f4..63bc5f32c 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1215,6 +1215,27 @@ static void set_dial_features(struct ast_flags64 *opts, struct ast_dial_features
ast_app_options2str64(dial_exec_options, &perm_opts, features->options, sizeof(features->options));
}
+static void end_bridge_callback(void *data)
+{
+ char buf[80];
+ time_t end;
+ struct ast_channel *chan = data;
+
+ time(&end);
+
+ ast_channel_lock(chan);
+ if (chan->cdr->answer.tv_sec) {
+ snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec);
+ pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf);
+ }
+
+ if (chan->cdr->start.tv_sec) {
+ snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec);
+ pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf);
+ }
+ ast_channel_unlock(chan);
+}
+
static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags64 *peerflags, int *continue_exec)
{
int res = -1; /* default: error */
@@ -1844,27 +1865,6 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
if (res) { /* some error */
res = -1;
} else {
- auto void end_bridge_callback(void);
- void end_bridge_callback (void)
- {
- char buf[80];
- time_t end;
-
- time(&end);
-
- ast_channel_lock(chan);
- if (chan->cdr->answer.tv_sec) {
- snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec);
- pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf);
- }
-
- if (chan->cdr->start.tv_sec) {
- snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec);
- pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf);
- }
- ast_channel_unlock(chan);
- }
-
if (ast_test_flag64(peerflags, OPT_CALLEE_TRANSFER))
ast_set_flag(&(config.features_callee), AST_FEATURE_REDIRECT);
if (ast_test_flag64(peerflags, OPT_CALLER_TRANSFER))
@@ -1889,6 +1889,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
ast_set_flag(&(config.features_caller), AST_FEATURE_NO_H_EXTEN);
config.end_bridge_callback = end_bridge_callback;
+ config.end_bridge_callback_data = chan;
if (moh) {
moh = 0;
diff --git a/apps/app_followme.c b/apps/app_followme.c
index bbc4e3e0c..a4d20f857 100644
--- a/apps/app_followme.c
+++ b/apps/app_followme.c
@@ -875,6 +875,27 @@ static void findmeexec(struct fm_args *tpargs)
}
+static void end_bridge_callback(void *data)
+{
+ char buf[80];
+ time_t end;
+ struct ast_channel *chan = data;
+
+ time(&end);
+
+ ast_channel_lock(chan);
+ if (chan->cdr->answer.tv_sec) {
+ snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec);
+ pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf);
+ }
+
+ if (chan->cdr->start.tv_sec) {
+ snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec);
+ pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf);
+ }
+ ast_channel_unlock(chan);
+}
+
static int app_exec(struct ast_channel *chan, void *data)
{
struct fm_args targs;
@@ -986,27 +1007,6 @@ static int app_exec(struct ast_channel *chan, void *data)
ast_stream_and_wait(chan, targs.sorryprompt, "");
res = 0;
} else {
- auto void end_bridge_callback(void);
- void end_bridge_callback (void)
- {
- char buf[80];
- time_t end;
-
- time(&end);
-
- ast_channel_lock(chan);
- if (chan->cdr->answer.tv_sec) {
- snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec);
- pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf);
- }
-
- if (chan->cdr->start.tv_sec) {
- snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec);
- pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf);
- }
- ast_channel_unlock(chan);
- }
-
caller = chan;
outbound = targs.outbound;
/* Bridge the two channels. */
@@ -1016,6 +1016,7 @@ static int app_exec(struct ast_channel *chan, void *data)
ast_set_flag(&(config.features_callee), AST_FEATURE_AUTOMON);
ast_set_flag(&(config.features_caller), AST_FEATURE_AUTOMON);
config.end_bridge_callback = end_bridge_callback;
+ config.end_bridge_callback_data = chan;
ast_moh_stop(caller);
/* Be sure no generators are left on it */
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 7f7f0db4a..2f87a0f51 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -3144,6 +3144,15 @@ static void setup_transfer_datastore(struct queue_ent *qe, struct member *member
ast_channel_unlock(qe->chan);
}
+static void end_bridge_callback(void *data)
+{
+ struct queue_ent *qe = data;
+
+ ao2_lock(qe->parent);
+ set_queue_variables(qe);
+ ao2_unlock(qe->parent);
+}
+
/*! \brief A large function which calls members, updates statistics, and bridges the caller and a member
*
* Here is the process of this function
@@ -3211,13 +3220,6 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
int callcompletedinsl;
struct ao2_iterator memi;
struct ast_datastore *datastore;
- auto void end_bridge_callback(void);
- void end_bridge_callback(void)
- {
- ao2_lock(qe->parent);
- set_queue_variables(qe);
- ao2_unlock(qe->parent);
- }
ast_channel_lock(qe->chan);
datastore = ast_channel_datastore_find(qe->chan, &dialed_interface_info, NULL);
@@ -3289,6 +3291,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
}
bridge_config.end_bridge_callback = end_bridge_callback;
+ bridge_config.end_bridge_callback_data = qe;
/* Hold the lock while we setup the outgoing calls */
if (use_weight)
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 8d92d872d..2352ec116 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -620,7 +620,8 @@ struct ast_bridge_config {
const char *start_sound;
int firstpass;
unsigned int flags;
- void (* end_bridge_callback)(void); /*!< A callback that is called after a bridge attempt */
+ void (* end_bridge_callback)(void *); /*!< A callback that is called after a bridge attempt */
+ void *end_bridge_callback_data; /*!< Data passed to the callback */
};
struct chanmon;
diff --git a/main/features.c b/main/features.c
index d7b1bf640..4eb059711 100644
--- a/main/features.c
+++ b/main/features.c
@@ -2172,7 +2172,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
new_peer_cdr = pick_unlocked_cdr(peer->cdr); /* the proper chan cdr, if there are forked cdrs */
if (res != AST_PBX_KEEPALIVE && config->end_bridge_callback) {
- config->end_bridge_callback();
+ config->end_bridge_callback(config->end_bridge_callback_data);
}
autoloopflag = ast_test_flag(chan, AST_FLAG_IN_AUTOLOOP);