diff options
author | Mark Spencer <markster@digium.com> | 2004-11-03 22:37:55 +0000 |
---|---|---|
committer | Mark Spencer <markster@digium.com> | 2004-11-03 22:37:55 +0000 |
commit | 94994626b68c2bcd301981c3a380af114c5fa0c1 (patch) | |
tree | 9dea579a946ea9f57ed1c8505e630b133da0015c | |
parent | 57184669175a44551fc322fd5e9425bb271b6291 (diff) |
Pass through flash hook
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4158 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rwxr-xr-x | apps/app_dial.c | 3 | ||||
-rwxr-xr-x | channel.c | 1 | ||||
-rwxr-xr-x | channels/chan_zap.c | 35 | ||||
-rwxr-xr-x | res/res_features.c | 8 |
4 files changed, 46 insertions, 1 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c index 7491d4f9b..e71a616b3 100755 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -362,7 +362,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu ast_indicate(in, AST_CONTROL_PROGRESS); break; case AST_CONTROL_OFFHOOK: - /* Ignore going off hook */ + case AST_CONTROL_FLASH: + /* Ignore going off hook and flash */ break; case -1: if (!outgoing->ringbackonly && !outgoing->musiconhold) { @@ -2561,6 +2561,7 @@ int ast_channel_bridge(struct ast_channel *c0, struct ast_channel *c1, struct as flags = (config->allowdisconnect_out||config->allowredirect_out ? AST_BRIDGE_DTMF_CHANNEL_0 : 0) + (config->allowdisconnect_in||config->allowredirect_in ? AST_BRIDGE_DTMF_CHANNEL_1 : 0); + *fo = NULL; firstpass = config->firstpass; config->firstpass = 0; diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 5708c0e99..7a42f4371 100755 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -421,6 +421,7 @@ struct zt_subchannel { int needcongestion; int needcallerid; int needanswer; + int needflash; int linear; int inthreeway; ZT_CONFINFO curconf; @@ -1982,6 +1983,7 @@ static int zt_hangup(struct ast_channel *ast) /* Real channel, do some fixup */ p->subs[index].owner = NULL; p->subs[index].needanswer = 0; + p->subs[index].needflash = 0; p->subs[index].needringing = 0; p->subs[index].needbusy = 0; p->subs[index].needcongestion = 0; @@ -2788,6 +2790,13 @@ static int zt_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, zt_enable_ec(p1); return 0; } + if (f->frametype == AST_FRAME_CONTROL) { + *fo = f; + *rc = who; + if (slave && master) + zt_unlink(slave, master, 1); + return 0; + } if (f->frametype == AST_FRAME_DTMF) { if (((who == c0) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) || ((who == c1) && (flags & AST_BRIDGE_DTMF_CHANNEL_1))) { @@ -3548,6 +3557,9 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast) ast_log(LOG_WARNING, "Unable to allocate three-way subchannel\n"); } else ast_log(LOG_DEBUG, "Flash when call not up or ringing\n"); + } else if (!p->threewaycalling) { + /* Just send a flash if no 3-way calling or callwait */ + p->subs[SUB_REAL].needflash = 1; } } else { /* Already have a 3 way call */ @@ -3908,6 +3920,15 @@ struct ast_frame *zt_read(struct ast_channel *ast) return &p->subs[index].f; } + if (p->subs[index].needflash) { + /* Send answer frame if requested */ + p->subs[index].needflash = 0; + p->subs[index].f.frametype = AST_FRAME_CONTROL; + p->subs[index].f.subclass = AST_CONTROL_FLASH; + ast_mutex_unlock(&p->lock); + return &p->subs[index].f; + } + if (ast->pvt->rawreadformat == AST_FORMAT_SLINEAR) { if (!p->subs[index].linear) { p->subs[index].linear = 1; @@ -4223,6 +4244,7 @@ static int zt_indicate(struct ast_channel *chan, int condition) struct zt_pvt *p = chan->pvt->pvt; int res=-1; int index; + int func = ZT_FLASH; ast_mutex_lock(&p->lock); index = zt_get_index(chan, p, 0); ast_log(LOG_DEBUG, "Requested indication %d on channel %s\n", condition, chan->name); @@ -4318,6 +4340,19 @@ static int zt_indicate(struct ast_channel *chan, int condition) res = zt_set_hook(p->subs[index].zfd, ZT_RINGOFF); res = 0; break; + case AST_CONTROL_FLASH: + /* flash hookswitch */ + if (ISTRUNK(p) && (p->sig != SIG_PRI)) { + /* Clear out the dial buffer */ + p->dop.dialstr[0] = '\0'; + if ((ioctl(p->subs[SUB_REAL].zfd,ZT_HOOK,&func) == -1) && (errno != EINPROGRESS)) { + ast_log(LOG_WARNING, "Unable to flash external trunk on channel %s: %s\n", + chan->name, strerror(errno)); + } else + res = 0; + } else + res = 0; + break; case -1: res = tone_zone_play_tone(p->subs[index].zfd, -1); break; diff --git a/res/res_features.c b/res/res_features.c index f79d2b4e2..98fb5fb19 100755 --- a/res/res_features.c +++ b/res/res_features.c @@ -358,6 +358,8 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast /* We ran out of time */ config->timelimit = 0; who = chan; + if (f) + ast_frfree(f); f = NULL; res = 0; } @@ -384,6 +386,12 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast else ast_indicate(chan, -1); } + if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_FLASH)) { + if (who == chan) + ast_indicate(peer, AST_CONTROL_FLASH); + else + ast_indicate(chan, AST_CONTROL_FLASH); + } if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_OPTION)) { aoh = f->data; /* Forward option Requests */ |