From 1b1917f4b3e3dca56aceffe4b955a6a7bb5ee18b Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Thu, 14 Aug 2003 19:18:18 +0000
Subject: [PATCH] Preserve queued frames

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1328 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channel.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/channel.c b/channel.c
index 3fe2a02d77..5cc58d0f9a 100755
--- 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;
 
 
-- 
GitLab