Pass through flash hook
authorMark Spencer <markster@digium.com>
Wed, 3 Nov 2004 22:37:55 +0000 (22:37 +0000)
committerMark Spencer <markster@digium.com>
Wed, 3 Nov 2004 22:37:55 +0000 (22:37 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4158 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_dial.c
channel.c
channels/chan_zap.c
res/res_features.c

index 7491d4f..e71a616 100755 (executable)
@@ -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) {
index a4a8578..5db5ac1 100755 (executable)
--- 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;
 
index 5708c0e..7a42f43 100755 (executable)
@@ -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;
index f79d2b4..98fb5fb 100755 (executable)
@@ -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 */