[libpri-commits] trunk - r271 in /trunk: libpri.h pri.c pri_internal.h pri_q931.h q931.c

libpri-commits at lists.digium.com libpri-commits at lists.digium.com
Thu Dec 1 11:59:57 CST 2005


Author: mattf
Date: Thu Dec  1 11:59:56 2005
New Revision: 271

URL: http://svn.digium.com/view/libpri?rev=271&view=rev
Log:
Add in keypad facility transmission support

Modified:
    trunk/libpri.h
    trunk/pri.c
    trunk/pri_internal.h
    trunk/pri_q931.h
    trunk/q931.c

Modified: trunk/libpri.h
URL: http://svn.digium.com/view/libpri/trunk/libpri.h?rev=271&r1=270&r2=271&view=diff
==============================================================================
--- trunk/libpri.h (original)
+++ trunk/libpri.h Thu Dec  1 11:59:56 2005
@@ -462,6 +462,10 @@
 /* Send a digit in overlap mode */
 extern int pri_information(struct pri *pri, q931_call *call, char digit);
 
+#define PRI_KEYPAD_FACILITY
+/* Send a keypad facility string of digits */
+extern int pri_keypad_facility(struct pri *pri, q931_call *call, char *digits);
+
 /* Answer the incomplete(call without called number) call on the given channel.
    Set non-isdn to non-zero if you are not connecting to ISDN equipment */
 extern int pri_need_more_info(struct pri *pri, q931_call *call, int channel, int nonisdn);

Modified: trunk/pri.c
URL: http://svn.digium.com/view/libpri/trunk/pri.c?rev=271&r1=270&r2=271&view=diff
==============================================================================
--- trunk/pri.c (original)
+++ trunk/pri.c Thu Dec  1 11:59:56 2005
@@ -471,6 +471,14 @@
 	return q931_information(pri, call, digit);
 }
 
+int pri_keypad_facility(struct pri *pri, q931_call *call, char *digits)
+{
+	if (!pri || !call || !digits || !digits[0])
+		return -1;
+
+	return q931_keypad_facility(pri, call, digits);
+}
+
 int pri_notify(struct pri *pri, q931_call *call, int channel, int info)
 {
 	if (!pri || !call)

Modified: trunk/pri_internal.h
URL: http://svn.digium.com/view/libpri/trunk/pri_internal.h?rev=271&r1=270&r2=271&view=diff
==============================================================================
--- trunk/pri_internal.h (original)
+++ trunk/pri_internal.h Thu Dec  1 11:59:56 2005
@@ -206,7 +206,7 @@
 	char callernum[256];
 	char callername[256];
 
-	char digitbuf[64];		/* Buffer for digits that come in KEYPAD_FACILITY */
+	char keypad_digits[64];		/* Buffer for digits that come in KEYPAD_FACILITY */
 
 	int ani2;               /* ANI II */
 	

Modified: trunk/pri_q931.h
URL: http://svn.digium.com/view/libpri/trunk/pri_q931.h?rev=271&r1=270&r2=271&view=diff
==============================================================================
--- trunk/pri_q931.h (original)
+++ trunk/pri_q931.h Thu Dec  1 11:59:56 2005
@@ -257,6 +257,8 @@
 
 extern int q931_information(struct pri *pri, q931_call *call, char digit);
 
+extern int q931_keypad_facility(struct pri *pri, q931_call *call, char *digits);
+
 extern int q931_connect(struct pri *pri, q931_call *call, int channel, int nonisdn);
 
 extern int q931_release(struct pri *pri, q931_call *call, int cause);

Modified: trunk/q931.c
URL: http://svn.digium.com/view/libpri/trunk/q931.c?rev=271&r1=270&r2=271&view=diff
==============================================================================
--- trunk/q931.c (original)
+++ trunk/q931.c Thu Dec  1 11:59:56 2005
@@ -1371,7 +1371,8 @@
 	if (ie->len == 0 || ie->len > sizeof(tmp))
 		return;
 	
-	libpri_copy_string(tmp, (char *) ie->data, sizeof(tmp));
+	memcpy(tmp, ie->data, ie->len);
+	tmp[ie->len] = '\0';
 	pri_message(pri, "%c Keypad Facility (len=%2d) [ %s ]\n", prefix, ie->len, tmp );
 }
 
@@ -1382,16 +1383,35 @@
 	if (ie->len == 0)
 		return -1;
 
-	if (ie->len > (sizeof(call->digitbuf) - 1))
-		mylen = (sizeof(call->digitbuf) - 1);
+	if (ie->len > (sizeof(call->keypad_digits) - 1))
+		mylen = (sizeof(call->keypad_digits) - 1);
 	else
 		mylen = ie->len;
 
-	memcpy(call->digitbuf, ie->data, mylen);
-
-	call->digitbuf[mylen] = 0;
+	memcpy(call->keypad_digits, ie->data, mylen);
+	call->keypad_digits[mylen] = 0;
 
 	return 0;
+}
+
+static FUNC_SEND(transmit_keypad_facility)
+{
+	int sublen;
+
+	sublen = strlen(call->keypad_digits);
+
+	if (sublen > 32) {
+		sublen = 32;
+		call->keypad_digits[32] = '\0';
+	}
+
+	if (sublen) {
+		libpri_copy_string(ie->data, (char *) call->keypad_digits, sizeof(call->keypad_digits));
+		/* Make sure we clear the field */
+		call->keypad_digits[0] = '\0';
+		return sublen + 2;
+	} else
+		return 0;
 }
 
 static FUNC_DUMP(dump_display)
@@ -1947,7 +1967,7 @@
 	{ 1, Q931_IE_NOTIFY_IND, "Notification Indicator", dump_notify, receive_notify, transmit_notify },
 	{ 1, Q931_DISPLAY, "Display", dump_display, receive_display, transmit_display },
 	{ 1, Q931_IE_TIME_DATE, "Date/Time", dump_time_date },
-	{ 1, Q931_IE_KEYPAD_FACILITY, "Keypad Facility", dump_keypad_facility, receive_keypad_facility },
+	{ 1, Q931_IE_KEYPAD_FACILITY, "Keypad Facility", dump_keypad_facility, receive_keypad_facility, transmit_keypad_facility },
 	{ 0, Q931_IE_SIGNAL, "Signal", dump_signal },
 	{ 1, Q931_IE_SWITCHHOOK, "Switch-hook" },
 	{ 1, Q931_IE_USER_USER, "User-User", dump_user_user, receive_user_user, transmit_user_user },
@@ -2430,13 +2450,21 @@
 	return send_message(pri, cur, Q931_STATUS, status_ies);
 }
 
-static int information_ies[] = { Q931_CALLED_PARTY_NUMBER, -1 };
+static int information_ies[] = { Q931_IE_KEYPAD_FACILITY, Q931_CALLED_PARTY_NUMBER, -1 };
 
 int q931_information(struct pri *pri, q931_call *c, char digit)
 {
-	c->callednum[0]=digit;
-	c->callednum[1]='\0';
+	c->callednum[0] = digit;
+	c->callednum[1] = '\0';
 	return send_message(pri, c, Q931_INFORMATION, information_ies);
+}
+
+static int keypad_facility_ies[] = { Q931_IE_KEYPAD_FACILITY, -1 };
+
+int q931_keypad_facility(struct pri *pri, q931_call *call, char *digits)
+{
+	libpri_copy_string(call->keypad_digits, digits, sizeof(call->keypad_digits));
+	return send_message(pri, call, Q931_INFORMATION, keypad_facility_ies);
 }
 
 static int restart_ack_ies[] = { Q931_CHANNEL_IDENT, Q931_RESTART_INDICATOR, -1 };
@@ -3502,7 +3530,9 @@
 			pri->ev.e = PRI_EVENT_KEYPAD_DIGIT;
 			pri->ev.digit.call = c;
 			pri->ev.digit.channel = c->channelno | (c->ds1no << 8);
-			libpri_copy_string(pri->ev.digit.digits, c->digitbuf, sizeof(pri->ev.digit.digits));
+			libpri_copy_string(pri->ev.digit.digits, c->keypad_digits, sizeof(pri->ev.digit.digits));
+			/* Make sure we clear it out before we return */
+			c->keypad_digits[0] = '\0';
 			return Q931_RES_HAVEEVENT;
 		}
 		pri->ev.e = PRI_EVENT_INFO_RECEIVED;



More information about the libpri-commits mailing list