summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2004-11-03 22:37:55 +0000
committerMark Spencer <markster@digium.com>2004-11-03 22:37:55 +0000
commit94994626b68c2bcd301981c3a380af114c5fa0c1 (patch)
tree9dea579a946ea9f57ed1c8505e630b133da0015c
parent57184669175a44551fc322fd5e9425bb271b6291 (diff)
Pass through flash hook
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4158 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rwxr-xr-xapps/app_dial.c3
-rwxr-xr-xchannel.c1
-rwxr-xr-xchannels/chan_zap.c35
-rwxr-xr-xres/res_features.c8
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) {
diff --git a/channel.c b/channel.c
index a4a857829..5db5ac1dd 100755
--- a/channel.c
+++ b/channel.c
@@ -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 */