]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 374803 via svnmerge from
authorAutomerge script <automerge@asterisk.org>
Wed, 10 Oct 2012 21:25:47 +0000 (21:25 +0000)
committerAutomerge script <automerge@asterisk.org>
Wed, 10 Oct 2012 21:25:47 +0000 (21:25 +0000)
file:///srv/subversion/repos/asterisk/branches/10

................
  r374803 | rmudgett | 2012-10-10 15:55:44 -0500 (Wed, 10 Oct 2012) | 30 lines

  app_queue: Made pass connected line updates from the caller to ringing queue members.

  Party A calls Party B
  Party B puts Party A on hold.
  Party B calls a queue.
  Ringing queue member D sees Party B identification.
  Party B transfers Party A to the queue.
  Queue member D does not get a connected line update for Party A.
  Queue member D answers the call and still sees Party B information.

  However, if Party A later transfers the call to Party C then queue member
  D gets a connected line update for Party C.

  * Made pass connected line updates from the caller to queue members while
  the queue members are ringing.

  (closes issue AST-1017)
  Reported by: Thomas Arimont

  (closes issue ABE-2886)
  Reported by: Thomas Arimont
  Tested by: rmudgett

  ........

  Merged revisions 374801 from https://origsvn.digium.com/svn/asterisk/be/branches/C.3-bier
  ........

  Merged revisions 374802 from http://svn.asterisk.org/svn/asterisk/branches/1.8
................

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10-digiumphones@374831 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c

index a18bdc7f316a19502321154fc4009282dadcb77f..694a88fcc0f12fbff7020f185e470759b655081c 100644 (file)
@@ -3968,13 +3968,6 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
                                return NULL;
                        }
 
-                       /*!
-                        * \todo
-                        * XXX Queue like Dial really should send any connected line
-                        * updates (AST_CONTROL_CONNECTED_LINE) from the caller to each
-                        * ringing queue member.
-                        */
-
                        if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
                                ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer);
                                *to = 0;
@@ -3988,6 +3981,38 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
                                ast_frfree(f);
                                return NULL;
                        }
+
+                       /* Send the frame from the in channel to all outgoing channels. */
+                       for (o = start; o; o = o->call_next) {
+                               if (!o->stillgoing || !o->chan) {
+                                       /* This outgoing channel has died so don't send the frame to it. */
+                                       continue;
+                               }
+                               switch (f->frametype) {
+                               case AST_FRAME_CONTROL:
+                                       switch (f->subclass.integer) {
+                                       case AST_CONTROL_CONNECTED_LINE:
+                                               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, o->chan, f, 0, 1)) {
+                                                       ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
+                                               }
+                                               break;
+                                       default:
+                                               /* We are not going to do anything with this frame. */
+                                               goto skip_frame;
+                                       }
+                                       break;
+                               default:
+                                       /* We are not going to do anything with this frame. */
+                                       goto skip_frame;
+                               }
+                       }
+skip_frame:;
+
                        ast_frfree(f);
                }
                if (!*to) {