Index: include/asterisk/adsi.h
===================================================================
RCS file: /usr/cvsroot/asterisk/include/asterisk/adsi.h,v
retrieving revision 1.5
diff -u -r1.5 adsi.h
--- include/asterisk/adsi.h	30 Aug 2004 05:27:51 -0000	1.5
+++ include/asterisk/adsi.h	2 Jun 2005 06:13:30 -0000
@@ -164,7 +164,7 @@
 /* ADSI Layer 2 transmission functions */
 extern int adsi_transmit_messages(struct ast_channel *chan, unsigned char **msg, int *msglen, int *msgtype);
 extern int adsi_transmit_message(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype);
-
+extern int adsi_transmit_message_full(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype, int dowait);
 //! Read some encoded DTMF data.  
 /*!
  * Returns number of bytes received
Index: res/res_adsi.c
===================================================================
RCS file: /usr/cvsroot/asterisk/res/res_adsi.c,v
retrieving revision 1.9.2.1
diff -u -r1.9.2.1 res_adsi.c
--- res/res_adsi.c	31 Mar 2005 22:20:15 -0000	1.9.2.1
+++ res/res_adsi.c	2 Jun 2005 06:13:30 -0000
@@ -310,7 +310,7 @@
 	/* Setup the resident soft key stuff, a piece at a time */
 	/* Upload what scripts we can for voicemail ahead of time */
 	bytes += adsi_download_connect(buf + bytes, service, fdn, sec, version);
-	if (adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DOWNLOAD))
+	if (adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DOWNLOAD, 0))
 		return -1;
 	if (ast_readstring(chan, ack, 1, 10000, 10000, ""))
 		return -1;
@@ -328,12 +328,12 @@
         /* Setup the resident soft key stuff, a piece at a time */
         /* Upload what scripts we can for voicemail ahead of time */
         bytes += adsi_download_disconnect(buf + bytes);
-	if (adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DOWNLOAD))
+	if (adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DOWNLOAD, 0))
 		return -1;
 	return 0;
 }
 
-int adsi_transmit_message(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype)
+int adsi_transmit_message_full(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype, int dowait)
 {
 	unsigned char *msgs[5] = { NULL, NULL, NULL, NULL, NULL };
 	int msglens[5];
@@ -342,6 +342,7 @@
 	int res;
 	int x;
 	int writeformat, readformat;
+	int waitforswitch = 0;
 
 	writeformat = chan->writeformat;
 	readformat = chan->readformat;
@@ -349,11 +350,17 @@
 	newdatamode = chan->adsicpe & ADSI_FLAG_DATAMODE;
 
 	for (x=0;x<msglen;x+=(msg[x+1]+2)) {
-		if (msg[x] == ADSI_SWITCH_TO_DATA) 
+		if (msg[x] == ADSI_SWITCH_TO_DATA) {
+			ast_log(LOG_DEBUG, "Switch to data is sent!\n");
+			waitforswitch++;
 			newdatamode = ADSI_FLAG_DATAMODE;
+		}
 		
-		if (msg[x] == ADSI_SWITCH_TO_VOICE)
+		if (msg[x] == ADSI_SWITCH_TO_VOICE) {
+			ast_log(LOG_DEBUG, "Switch to voice is sent!\n");
+			waitforswitch++;
 			newdatamode = 0;
+		}
 	}
 	msgs[0] = msg;
 
@@ -381,6 +388,12 @@
 		return -1;
 	}
 	res = __adsi_transmit_messages(chan, msgs, msglens, msgtypes);
+
+	if (dowait) {
+		ast_log(LOG_DEBUG, "Wait for switch is '%d'\n", waitforswitch);
+		while(waitforswitch-- && ((res = ast_waitfordigit(chan, 1000)) > 0)) { res = 0; ast_log(LOG_DEBUG, "Waiting for 'B'...\n"); }
+	}
+	
 	if (!res)
 		chan->adsicpe = (chan->adsicpe & ~ADSI_FLAG_DATAMODE) | newdatamode;
 
@@ -394,6 +407,11 @@
 	return res;
 }
 
+int adsi_transmit_message(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype)
+{
+	return adsi_transmit_message_full(chan, msg, msglen, msgtype, 1);
+}
+
 static inline int ccopy(unsigned char *dst, unsigned char *src, int max)
 {
 	int x=0;
@@ -573,11 +591,11 @@
 	int bytes = 0;
 	int res;
 	bytes += adsi_data_mode(buf);
-	adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+	adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0);
 
 	bytes = 0;
 	bytes += adsi_query_cpeid(buf);
-	adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+	adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0);
 
 	/* Get response */
 	memset(buf, 0, sizeof(buf));
@@ -592,7 +610,7 @@
 	if (voice) {
 		bytes = 0;
 		bytes += adsi_voice_mode(buf, 0);
-		adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+		adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0);
 		/* Ignore the resulting DTMF B announcing it's in voice mode */
 		ast_waitfordigit(chan, 1000);
 	}
@@ -605,11 +623,11 @@
 	int bytes = 0;
 	int res;
 	bytes += adsi_data_mode(buf);
-	adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+	adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0);
 
 	bytes = 0;
 	bytes += adsi_query_cpeinfo(buf);
-	adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+	adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0);
 
 	/* Get width */
 	memset(buf, 0, sizeof(buf));
@@ -657,7 +675,7 @@
 	if (voice) {
 		bytes = 0;
 		bytes += adsi_voice_mode(buf, 0);
-		adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+		adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0);
 		/* Ignore the resulting DTMF B announcing it's in voice mode */
 		ast_waitfordigit(chan, 1000);
 	}
@@ -906,7 +924,7 @@
 		}
 		bytes += adsi_set_keys(dsp + bytes, keyd);
 	}
-	adsi_transmit_message(chan, dsp, bytes, ADSI_MSG_DISPLAY);
+	adsi_transmit_message_full(chan, dsp, bytes, ADSI_MSG_DISPLAY, 0);
 	return 0;
 
 }
@@ -923,7 +941,7 @@
 	if (voice) {
 		bytes += adsi_voice_mode(buf + bytes, 0);
 	}
-	res = adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+	res = adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0);
 	if (voice) {
 		/* Ignore the resulting DTMF B announcing it's in voice mode */
 		ast_waitfordigit(chan, 1000);
@@ -948,7 +966,7 @@
 		bytes += adsi_data_mode(dsp + bytes);
 
 	/* Prepare key setup messages */
-	if (adsi_transmit_message(chan, dsp, bytes, ADSI_MSG_DISPLAY))
+	if (adsi_transmit_message_full(chan, dsp, bytes, ADSI_MSG_DISPLAY, 0))
 		return -1;
 	if (app) {
 		res = ast_readstring(chan, resp, 1, 1200, 1200, "");
@@ -985,7 +1003,7 @@
 	bytes += adsi_voice_mode(dsp + bytes, 0);
 
 	/* Prepare key setup messages */
-	if (adsi_transmit_message(chan, dsp, bytes, ADSI_MSG_DISPLAY))
+	if (adsi_transmit_message_full(chan, dsp, bytes, ADSI_MSG_DISPLAY, 0))
 		return -1;
 	return 0;
 }
