Merged revisions 313368-313369 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Mon, 11 Apr 2011 23:20:39 +0000 (23:20 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 11 Apr 2011 23:20:39 +0000 (23:20 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r313368 | rmudgett | 2011-04-11 18:03:02 -0500 (Mon, 11 Apr 2011) | 2 lines

  Backport a restructuring change from trunk to make the next change stand out.
........
  r313369 | rmudgett | 2011-04-11 18:08:02 -0500 (Mon, 11 Apr 2011) | 13 lines

  Frames from the inbound channel should go to all outbound channels in app_dial.c.

  In app_dial.c:wait_for_answer() frames from the inbound channel should be
  sent to all outbound channels instead of only if there is just one
  outbound channel.

  Control frames like AST_CONTROL_CONNECTED_LINE need to be passed to all of
  the the outbound channels.  This can happen if a blond transfer is done by
  a remote switch on the inbound channel.

  JIRA AST-443
  JIRA SWP-2730
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@313383 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_dial.c

index 314b8e4..a66225a 100644 (file)
@@ -1418,12 +1418,17 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
                                }
                        }
 
-                       if (single) {
+                       /* Send the frame from the in channel to all outgoing channels. */
+                       for (o = outgoing; o; o = o->next) {
+                               if (!o->chan || !ast_test_flag64(o, DIAL_STILLGOING)) {
+                                       /* This outgoing channel has died so don't send the frame to it. */
+                                       continue;
+                               }
                                switch (f->frametype) {
                                case AST_FRAME_HTML:
                                        /* Forward HTML stuff */
-                                       if (!ast_test_flag64(outgoing, DIAL_NOFORWARDHTML)
-                                               && ast_channel_sendhtml(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen) == -1) {
+                                       if (!ast_test_flag64(o, DIAL_NOFORWARDHTML)
+                                               && ast_channel_sendhtml(o->chan, f->subclass.integer, f->data.ptr, f->datalen) == -1) {
                                                ast_log(LOG_WARNING, "Unable to send URL\n");
                                        }
                                        break;
@@ -1432,7 +1437,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
                                case AST_FRAME_TEXT:
                                case AST_FRAME_DTMF_BEGIN:
                                case AST_FRAME_DTMF_END:
-                                       if (ast_write(outgoing->chan, f)) {
+                                       if (ast_write(o->chan, f)) {
                                                ast_log(LOG_WARNING, "Unable to forward frametype: %d\n",
                                                        f->frametype);
                                        }
@@ -1443,17 +1448,18 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
                                        case AST_CONTROL_UNHOLD:
                                        case AST_CONTROL_VIDUPDATE:
                                        case AST_CONTROL_SRCUPDATE:
-                                               ast_verb(3, "%s requested special control %d, passing it to %s\n", in->name, f->subclass.integer, outgoing->chan->name);
-                                               ast_indicate_data(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen);
+                                               ast_verb(3, "%s requested special control %d, passing it to %s\n",
+                                                       in->name, f->subclass.integer, o->chan->name);
+                                               ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
                                                break;
                                        case AST_CONTROL_CONNECTED_LINE:
-                                               if (ast_channel_connected_line_macro(in, outgoing->chan, f, 0, 1)) {
-                                                       ast_indicate_data(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen);
+                                               if (ast_channel_connected_line_macro(in, o->chan, f, 0, 1)) {
+                                                       ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
                                                }
                                                break;
                                        case AST_CONTROL_REDIRECTING:
-                                               if (ast_channel_redirecting_macro(in, outgoing->chan, f, 0, 1)) {
-                                                       ast_indicate_data(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen);
+                                               if (ast_channel_redirecting_macro(in, o->chan, f, 0, 1)) {
+                                                       ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
                                                }
                                                break;
                                        default: