mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-03 20:38:59 +00:00 
			
		
		
		
	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: https://origsvn.digium.com/svn/asterisk/branches/1.4@155553 65c4cc65-6c06-0410-ace0-fbb531ad65f3
			
			
This commit is contained in:
		@@ -832,6 +832,27 @@ static void set_dial_features(struct ast_flags *opts, struct ast_dial_features *
 | 
			
		||||
		ast_set_flag(&(features->features_caller), AST_FEATURE_PARKCALL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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_flags *peerflags, int *continue_exec)
 | 
			
		||||
{
 | 
			
		||||
	int res = -1;
 | 
			
		||||
@@ -1735,27 +1756,6 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
 | 
			
		||||
		if (!res) {
 | 
			
		||||
			struct ast_bridge_config config;
 | 
			
		||||
 | 
			
		||||
			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);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			memset(&config,0,sizeof(struct ast_bridge_config));
 | 
			
		||||
			if (play_to_caller)
 | 
			
		||||
				ast_set_flag(&(config.features_caller), AST_FEATURE_PLAY_WARNING);
 | 
			
		||||
@@ -1787,6 +1787,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
 | 
			
		||||
			config.end_sound = end_sound;
 | 
			
		||||
			config.start_sound = start_sound;
 | 
			
		||||
			config.end_bridge_callback = end_bridge_callback;
 | 
			
		||||
			config.end_bridge_callback_data = chan;
 | 
			
		||||
			if (moh) {
 | 
			
		||||
				moh = 0;
 | 
			
		||||
				ast_moh_stop(chan);
 | 
			
		||||
 
 | 
			
		||||
@@ -914,6 +914,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;
 | 
			
		||||
@@ -1025,27 +1046,6 @@ static int app_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
				ast_stream_and_wait(chan, targs.sorryprompt, chan->language, "");
 | 
			
		||||
			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. */
 | 
			
		||||
@@ -1056,6 +1056,7 @@ static int app_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
			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 */
 | 
			
		||||
 
 | 
			
		||||
@@ -540,7 +540,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -1714,7 +1714,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
 | 
			
		||||
	}
 | 
			
		||||
  before_you_go:
 | 
			
		||||
	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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user