From b81f233e68e71d4601b932eb8b51b32b4312f231 Mon Sep 17 00:00:00 2001
From: Matthew Fredrickson <creslin@digium.com>
Date: Fri, 1 Apr 2005 17:00:50 +0000
Subject: [PATCH] Merging in xylome's beaerer capabilty patch (bug 3547)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5342 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/Makefile               |  2 +-
 apps/app_dial.c             |  8 +++---
 channel.c                   | 20 +++++++++++++++
 channels/chan_zap.c         | 49 +++++++++----------------------------
 include/asterisk/channel.h  | 15 +++++++++++-
 include/asterisk/transcap.h | 33 +++++++++++++++++++++++++
 6 files changed, 84 insertions(+), 43 deletions(-)
 create mode 100755 include/asterisk/transcap.h

diff --git a/apps/Makefile b/apps/Makefile
index 0feec316d5..2f6a875dcb 100755
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -31,7 +31,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_mp3.so\
      app_talkdetect.so app_alarmreceiver.so app_userevent.so app_verbose.so \
      app_test.so app_forkcdr.so app_math.so app_realtime.so \
      app_dumpchan.so app_waitforsilence.so app_while.so app_setrdnis.so \
-     app_md5.so app_readfile.so app_chanspy.so
+     app_md5.so app_readfile.so app_chanspy.so app_settransfercapability.so
 
 ifneq (${OSARCH},Darwin)
 ifneq (${OSARCH},SunOS)
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 9ee512ca55..9f7dedbdda 100755
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -77,8 +77,8 @@ static char *descrip =
 "      'r' -- indicate ringing to the calling party, pass no audio until answered.\n"
 "      'm[(class)]' -- provide hold music to the calling party until answered (optionally\n"
 "                      with the specified class.\n"
-"      'M(x[^arg]) -- Executes the macro (x with ^ delim arg list) upon connect of the call.\n"
-"                     Also, the macro can set the MACRO_RESULT variable to do the following:\n"
+"      'M(x[^arg])' -- Executes the macro (x with ^ delim arg list) upon connect of the call.\n"
+"                      Also, the macro can set the MACRO_RESULT variable to do the following:\n"
 "                     -- ABORT - Hangup both legs of the call.\n"
 "                     -- CONGESTION - Behave as if line congestion was encountered.\n"
 "                     -- BUSY - Behave as if a busy signal was encountered. (n+101)\n"
@@ -1039,8 +1039,8 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
 		tmp->chan->cid.cid_tns = chan->cid.cid_tns;
 		/* Presense of ADSI CPE on outgoing channel follows ours */
 		tmp->chan->adsicpe = chan->adsicpe;
-		/* pass the digital flag */
-		ast_copy_flags(tmp->chan, chan, AST_FLAG_DIGITAL);
+		/* Pass the transfer capability */
+		tmp->chan->transfercapability = chan->transfercapability;
 
 		/* If we have an outbound group, set this peer channel to it */
 		if (outbound_group)
diff --git a/channel.c b/channel.c
index e621aec5e1..460d1b7814 100755
--- a/channel.c
+++ b/channel.c
@@ -39,6 +39,7 @@
 #include <asterisk/utils.h>
 #include <asterisk/lock.h>
 #include <asterisk/app.h>
+#include <asterisk/transcap.h>
 #ifdef ZAPTEL_OPTIMIZATIONS
 #include <sys/ioctl.h>
 #ifdef __linux__
@@ -243,6 +244,25 @@ char *ast_state2str(int state)
 	}
 }
 
+char *ast_transfercapability2str(int transfercapability)
+{
+	switch(transfercapability) {
+	case AST_TRANS_CAP_SPEECH:
+		return "SPEECH";
+	case AST_TRANS_CAP_DIGITAL:
+		return "DIGITAL";
+	case AST_TRANS_CAP_RESTRICTED_DIGITAL:
+		return "RESTRICTED_DIGITAL";
+	case AST_TRANS_CAP_3_1K_AUDIO:
+		return "3K1AUDIO";
+	case AST_TRANS_CAP_DIGITAL_W_TONES:
+		return "DIGITAL_W_TONES";
+	case AST_TRANS_CAP_VIDEO:
+		return "VIDEO";
+	default:
+		return "UNKNOWN";
+	}
+}
 
 int ast_best_codec(int fmts)
 {
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index c68f0ff488..8eb891141b 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -38,6 +38,7 @@
 #include <asterisk/causes.h>
 #include <asterisk/term.h>
 #include <asterisk/utils.h>
+#include <asterisk/transcap.h>
 #include <sys/signal.h>
 #include <errno.h>
 #include <stdlib.h>
@@ -1866,13 +1867,15 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
 				ast_log(LOG_DEBUG, "I'm being setup with no bearer right now...\n");
 			pri_set_crv(p->pri->pri, p->call, p->channel, 0);
 		}
-		p->digital = ast_test_flag(ast,AST_FLAG_DIGITAL);
+		p->digital = IS_DIGITAL(ast->transfercapability);
 		pri_sr_set_channel(sr, p->bearer ? PVT_TO_CHANNEL(p->bearer) : PVT_TO_CHANNEL(p), 
 								p->pri->nodetype == PRI_NETWORK ? 0 : 1, 1);
-		pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : PRI_TRANS_CAP_SPEECH, 
+		pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : ast->transfercapability, 
 					(p->digital ? -1 : 
 						((p->law == ZT_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW)));
- 		dp_strip = 0;
+		if (option_verbose > 2)
+			ast_verbose(VERBOSE_PREFIX_3 "Requested transfer capability: 0x%.2x - %s\n", ast->transfercapability, ast_transfercapability2str(ast->transfercapability));
+		dp_strip = 0;
  		pridialplan = p->pri->dialplan - 1;
  		if (pridialplan == -2) { /* compute dynamically */
  			if (strncmp(c + p->stripmsd, p->pri->internationalprefix, strlen(p->pri->internationalprefix)) == 0) {
@@ -4604,35 +4607,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
 	return res;
 }
 
-#ifdef ZAPATA_PRI
-static void set_calltype(struct ast_channel *chan, int ctype)
-{
-	char *s = "UNKNOWN";
-	switch(ctype) {
-	case PRI_TRANS_CAP_SPEECH:
-		s = "SPEECH";
-		break;
-	case PRI_TRANS_CAP_DIGITAL:
-		s = "DIGITAL";
-		break;
-	case PRI_TRANS_CAP_RESTRICTED_DIGITAL:
-		s = "RESTRICTED_DIGITAL";
-		break;
-	case PRI_TRANS_CAP_3_1K_AUDIO:
-		s = "31KAUDIO";
-		break;
-	case PRI_TRANS_CAP_7K_AUDIO:
-		s = "7KAUDIO";
-		break;
-	case PRI_TRANS_CAP_VIDEO:
-		s = "VIDEO";
-		break;
-	}
-	pbx_builtin_setvar_helper(chan, "CALLTYPE", s);
-}
-#endif
-
-static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int index, int law, int ctype)
+static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int index, int law, int transfercapability)
 {
 	struct ast_channel *tmp;
 	int deflaw;
@@ -4764,14 +4739,14 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
 		tmp->cid.cid_pres = i->callingpres;
 		tmp->cid.cid_ton = i->cid_ton;
 #ifdef ZAPATA_PRI
-		set_calltype(tmp, ctype);
+		tmp->transfercapability = transfercapability;
+		pbx_builtin_setvar_helper(tmp, "TRANSFERCAPABILITY", ast_transfercapability2str(transfercapability));
+		if (transfercapability & PRI_TRANS_CAP_DIGITAL) {
+			i->digital = 1;
+		}
 		/* Assume calls are not idle calls unless we're told differently */
 		i->isidlecall = 0;
 		i->alreadyhungup = 0;
-		if (ctype & PRI_TRANS_CAP_DIGITAL) {
-			i->digital = 1;
-			ast_set_flag(tmp, AST_FLAG_DIGITAL);
-		}
 #endif
 		/* clear the fake event in case we posted one before we had ast_chanenl */
 		i->fake_event = 0;
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 92c5000313..4d121bb69e 100755
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -315,6 +315,9 @@ struct ast_channel {
 	/*! channel flags of AST_FLAG_ type */
 	unsigned int flags;
 	
+	/* ISDN Transfer Capbility - AST_FLAG_DIGITAL is not enough */
+	unsigned short transfercapability;
+
 	struct ast_frame *readq;
 	int alertpipe[2];
 	/*! Write translation path */
@@ -338,7 +341,8 @@ struct ast_channel {
 /* Channels have this property if they can accept input with jitter; i.e. most VoIP channels */
 #define AST_CHAN_TP_WANTSJITTER	(1 << 0)	
 
-#define AST_FLAG_DIGITAL	(1 << 0)	/* if the call is a digital ISDN call */
+/* This flag has been deprecated by the transfercapbilty data member in struct ast_channel */
+/* #define AST_FLAG_DIGITAL	(1 << 0) */	/* if the call is a digital ISDN call */
 #define AST_FLAG_DEFER_DTMF	(1 << 1)	/* if dtmf should be deferred */
 #define AST_FLAG_WRITE_INT	(1 << 2)	/* if write should be interrupt generator */
 #define AST_FLAG_BLOCKING	(1 << 3)	/* if we are blocking */
@@ -811,6 +815,15 @@ int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clo
  */
 char *ast_state2str(int state);
 
+/*! Gives the string form of a given transfer capability */
+/*!
+ * \param transercapability transfercapabilty to get the name of
+ * Give a name to a transfercapbility
+ * See above
+ * Returns the text form of the binary transfer capbility
+ */
+char *ast_transfercapability2str(int transfercapability);
+
 /* Options: Some low-level drivers may implement "options" allowing fine tuning of the
    low level channel.  See frame.h for options.  Note that many channel drivers may support
    none or a subset of those features, and you should not count on this if you want your
diff --git a/include/asterisk/transcap.h b/include/asterisk/transcap.h
new file mode 100755
index 0000000000..1a77dd1ec8
--- /dev/null
+++ b/include/asterisk/transcap.h
@@ -0,0 +1,33 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * General Asterisk channel definitions.
+ * 
+ * Copyright (C) 1999 - 2005, Digium, Inc.
+ *
+ * Matthew Fredrickson <creslin@digium.com>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#ifndef _ASTERISK_TRANSCAP_H
+#define _ASTERISK_TRANSCAP_H
+
+/* These definitions are taken directly out of libpri.h and used here.
+ * DO NOT change them as it will cause unexpected behavior in channels
+ * that utilize these fields.
+ */
+
+#define AST_TRANS_CAP_SPEECH				0x0
+#define AST_TRANS_CAP_DIGITAL				0x08
+#define AST_TRANS_CAP_RESTRICTED_DIGITAL		0x09
+#define AST_TRANS_CAP_3_1K_AUDIO			0x10
+#define AST_TRANS_CAP_7K_AUDIO				0x11	/* Depriciated ITU Q.931 (05/1998)*/
+#define AST_TRANS_CAP_DIGITAL_W_TONES			0x11
+#define AST_TRANS_CAP_VIDEO				0x18
+
+#define IS_DIGITAL(cap)\
+	(cap) & AST_TRANS_CAP_DIGITAL ? 1 : 0
+
+#endif /* _ASTERISK_TRANSCAP_H */
-- 
GitLab