Preserve queued frames
authorMark Spencer <markster@digium.com>
Thu, 14 Aug 2003 19:18:18 +0000 (19:18 +0000)
committerMark Spencer <markster@digium.com>
Thu, 14 Aug 2003 19:18:18 +0000 (19:18 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1328 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channel.c

index 3fe2a02..5cc58d0 100755 (executable)
--- a/channel.c
+++ b/channel.c
@@ -1834,10 +1834,11 @@ void ast_change_name(struct ast_channel *chan, char *newname)
 
 static int ast_do_masquerade(struct ast_channel *original)
 {
-       int x;
+       int x,i;
        int res=0;
        char *tmp;
        void *tmpv;
+       struct ast_frame *cur, *prev;
        struct ast_channel_pvt *p;
        struct ast_channel *clone = original->masq;
        int rformat = original->readformat;
@@ -1892,7 +1893,28 @@ static int ast_do_masquerade(struct ast_channel *original)
        p = original->pvt;
        original->pvt = clone->pvt;
        clone->pvt = p;
-       
+
+       /* Save any pending frames on both sides.  Start by counting
+        * how many we're going to need... */
+       prev = NULL;
+       cur = clone->pvt->readq;
+       x = 0;
+       while(cur) {
+               x++;
+               prev = cur;
+               cur = cur->next;
+       }
+       /* If we had any, prepend them to the ones already in the queue, and 
+        * load up the alertpipe */
+       if (prev) {
+               prev->next = original->pvt->readq;
+               original->pvt->readq = clone->pvt->readq;
+               clone->pvt->readq = NULL;
+               if (original->pvt->alertpipe[1] > -1) {
+                       for (i=0;i<x;i++)
+                               write(original->pvt->alertpipe[1], &x, sizeof(x));
+               }
+       }
        clone->_softhangup = AST_SOFTHANGUP_DEV;