From f0578a801182fb78f41cae27cd52bacd941fdda3 Mon Sep 17 00:00:00 2001
From: David Yat Sin <dyatsin@sangoma.com>
Date: Tue, 12 Jul 2011 17:26:44 -0400
Subject: [PATCH] chlog: freetdm: ISDN - Fix for Caller ID name on DMS-100

---
 .../ftmod_sangoma_isdn/ftmod_sangoma_isdn.h   |  3 +-
 .../ftmod_sangoma_isdn_stack_hndl.c           |  5 +-
 .../ftmod_sangoma_isdn_support.c              | 49 ++++++++++++++++++-
 .../ftmod_sangoma_isdn_trace.c                | 20 ++++++--
 .../ftmod_sangoma_isdn_trace.h                | 14 +++++-
 5 files changed, 79 insertions(+), 12 deletions(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
index 08adc6ef6b..5cb8fbe0c0 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
@@ -452,8 +452,7 @@ ftdm_status_t get_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
 ftdm_status_t get_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
 ftdm_status_t get_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb);
 ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb);
-ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display);
-ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr);
+ftdm_status_t get_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt);
 ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad);
 ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd);
 ftdm_status_t get_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
index 44538bba61..4caad20ee1 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
@@ -135,11 +135,8 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
 			get_calling_subaddr(ftdmchan, &conEvnt->cgPtySad);
 			get_prog_ind_ie(ftdmchan, &conEvnt->progInd);
 			get_facility_ie(ftdmchan, &conEvnt->facilityStr);			
+			get_calling_name(ftdmchan, conEvnt);
 			
-			if (get_calling_name_from_display(ftdmchan, &conEvnt->display) != FTDM_SUCCESS) {
-				get_calling_name_from_usr_usr(ftdmchan, &conEvnt->usrUsr);
-			}
-
 			ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Incoming call: Called No:[%s] Calling No:[%s]\n", ftdmchan->caller_data.dnis.digits, ftdmchan->caller_data.cid_num.digits);
 
 			if (conEvnt->bearCap[0].eh.pres) {
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
index b0c3efe271..a2bca1f8fa 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
@@ -45,6 +45,9 @@ SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str
 
 static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val);
 static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val);
+ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr);
+ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display);
+ftdm_status_t get_calling_name_from_ntDisplay(ftdm_channel_t *ftdmchan, NtDisplay *display);
 
 extern ftdm_sngisdn_data_t	g_sngisdn_data;
 
@@ -355,6 +358,20 @@ ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *d
 	return FTDM_SUCCESS;
 }
 
+ftdm_status_t get_calling_name_from_ntDisplay(ftdm_channel_t *ftdmchan, NtDisplay *display)
+{
+	ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
+	if (display->eh.pres != PRSNT_NODEF) {
+		return FTDM_FAIL;
+	}
+	if (display->dispInfo.pres != PRSNT_NODEF) {
+		return FTDM_FAIL;
+	}
+	
+	ftdm_copy_string(caller_data->cid_name, (const char*)display->dispInfo.val, display->dispInfo.len+1);
+	return FTDM_SUCCESS;
+}
+
 ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr)
 {
 	ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
@@ -374,6 +391,24 @@ ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *us
 	return FTDM_SUCCESS;
 }
 
+ftdm_status_t get_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt)
+{
+	ftdm_status_t status = FTDM_FAIL;
+	sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
+	
+	if (signal_data->switchtype == SNGISDN_SWITCH_DMS100) {
+		status = get_calling_name_from_ntDisplay(ftdmchan, &conEvnt->ntDisplay[0]);
+	} else {
+		status = get_calling_name_from_display(ftdmchan, &conEvnt->display);
+
+	}
+	if (status != FTDM_SUCCESS) {
+		status = get_calling_name_from_usr_usr(ftdmchan, &conEvnt->usrUsr);
+	}
+	return status;
+}
+
+
 ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad)
 {
 	char subaddress[100];
@@ -694,12 +729,22 @@ ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt)
 			/* follow through */
 		case SNGISDN_SWITCH_5ESS:
 		case SNGISDN_SWITCH_4ESS:
-		case SNGISDN_SWITCH_DMS100:
-			conEvnt->display.eh.pres = PRSNT_NODEF;
 			conEvnt->display.dispInfo.pres = PRSNT_NODEF;
 			conEvnt->display.dispInfo.len = len;
 			memcpy(conEvnt->display.dispInfo.val, caller_data->cid_name, len);
 			break;
+		case SNGISDN_SWITCH_DMS100:
+			conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+			conEvnt->ntDisplay[0].dispTypeNt.pres = PRSNT_NODEF;
+			conEvnt->ntDisplay[0].dispTypeNt.val = 0x01; /* Calling Party Name */
+			conEvnt->ntDisplay[0].assocInfo.pres = PRSNT_NODEF;
+			conEvnt->ntDisplay[0].assocInfo.val  = 0x03; /* Included */
+			conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+			conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+			conEvnt->ntDisplay[0].dispInfo.pres = PRSNT_NODEF;
+			conEvnt->ntDisplay[0].dispInfo.len = len;
+			memcpy(conEvnt->ntDisplay[0].dispInfo.val, caller_data->cid_name, len);
+			break;
 		case SNGISDN_SWITCH_QSIG:
 			/* It seems like QSIG does not support Caller ID Name */
 			break;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
index f44f1032a3..e127e7fc1e 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
@@ -584,11 +584,18 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
 			break;
 		case PROT_Q931_IE_DISPLAY:
 			{
-				uint8_t displayStrOct=2, j;
+				uint8_t j, displayType, assocInfo;
 				char displayStr[82];
+				uint8_t displayNtEnabled = 0;
+				uint8_t displayStrOct = 2;
+				
 				memset(displayStr, 0, sizeof(displayStr));
 				
 				if(get_bits(OCTET(3),8,8)) {
+					displayType = get_bits(OCTET(3),1,4);
+					assocInfo = get_bits(OCTET(3),5,7);
+
+					displayNtEnabled = 1;
 					displayStrOct++;
 				}
 				j = 0;	
@@ -599,8 +606,15 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
 					displayStr[j++]=ia5[get_bits(OCTET(displayStrOct),1,4)][get_bits(OCTET(displayStrOct),5,8)];
 				}
 				displayStr[j]='\0';
-				*str_len+= sprintf(&str[*str_len], "%s(l:%d)\n",
-														displayStr, len);
+				if (displayNtEnabled) {
+					*str_len+= sprintf(&str[*str_len], "%s(l:%d) type:%s(%d) info:%s(%d)\n",
+												displayStr, len,
+												get_code_2_str(displayType, dcodQ931DisplayTypeTable), displayType,
+												get_code_2_str(assocInfo, dcodQ931AssocInfoTable), assocInfo);
+				} else {
+					*str_len+= sprintf(&str[*str_len], "%s(l:%d)\n",
+															displayStr, len);
+				}
 			}
 			break;
 		case PROT_Q931_IE_RESTART_IND:
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h
index ca6683d4e3..37b799d007 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h
@@ -578,5 +578,17 @@ struct code2str dcodQ931TypeOfSubaddressTable[] = {
 	{ -1,   "Invalid"},
 };
 
-#endif /* __FTMOD_SANGOMA_ISDN_TRACE_H__ */
+struct code2str dcodQ931DisplayTypeTable[] = {
+	{ 0x00, "Calling Party Name"},
+	{ 0x01, "Connected Party Name"},
+	{ 0x05, "Original Called Party Name"},
+	{ -1,   "Invalid"},
+};
 
+struct code2str dcodQ931AssocInfoTable[] = {
+	{ 0x00, "Requested"},
+	{ 0x03, "Included"},
+	{ -1,   "Invalid"},
+};
+
+#endif /* __FTMOD_SANGOMA_ISDN_TRACE_H__ */