From 2e8b3d75d0ffe196d7ea8989c2411b8e57c34d28 Mon Sep 17 00:00:00 2001
From: David Yat Sin <dyatsin@sangoma.com>
Date: Tue, 26 Apr 2011 15:13:00 -0400
Subject: [PATCH] chlog: freetdm: SS7 - Fix for Screening Ind and Presentation
 Ind not being sent out

---
 libs/freetdm/mod_freetdm/mod_freetdm.c        | 12 ++---
 .../ftmod_sangoma_ss7_main.h                  |  8 +--
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c |  4 +-
 .../ftmod_sangoma_ss7_support.c               | 49 +++++++++++++------
 4 files changed, 45 insertions(+), 28 deletions(-)

diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index da5f2c86f9..7f69e11f6c 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -1324,12 +1324,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
 
 		sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Screen");
 		if (sipvar) {
-			caller_data.screen = (uint8_t)atoi(sipvar);
+			ftdm_usrmsg_add_var(&usrmsg, "ss7_screen_ind", sipvar);
 		}
 
 		sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Presentation");
 		if (sipvar) {
-			caller_data.pres = (uint8_t)atoi(sipvar);
+			ftdm_usrmsg_add_var(&usrmsg, "ss7_pres_ind", sipvar);
 		}
 
 
@@ -1348,19 +1348,19 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
 	}
 	
 	if ((var = channel_get_variable(session, var_event, "freetdm_bearer_layer1"))) {
-			caller_data.bearer_layer1 = (uint8_t)atoi(var);
+		caller_data.bearer_layer1 = (uint8_t)atoi(var);
 	}
 
 	if ((var = channel_get_variable(session, var_event, "freetdm_screening_ind"))) {
-			ftdm_set_screening_ind(var, &caller_data.screen);
+		ftdm_set_screening_ind(var, &caller_data.screen);
 	}
 
 	if ((var = channel_get_variable(session, var_event, "freetdm_presentation_ind"))) {
-			ftdm_set_presentation_ind(var, &caller_data.pres);
+		ftdm_set_presentation_ind(var, &caller_data.pres);
 	}
 
 	if ((var = channel_get_variable(session, var_event, "freetdm_outbound_ton"))) {
-			ftdm_set_ton(var, &caller_data.dnis.type);
+		ftdm_set_ton(var, &caller_data.dnis.type);
 	} else {
 		caller_data.dnis.type = outbound_profile->destination_number_ton;
 	}
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
index c698b4d261..f8a9cec9ff 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
@@ -785,10 +785,10 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa
 ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const char *data);
 
 /* in ftmod_sangoma_ss7_support.c */
-uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
-uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
-uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
-uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
+ftdm_status_t copy_cgPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum);
+ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum);
+ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum);
+ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum);
 ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
 ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
 
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
index 9fe279d7c5..149e022ff8 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
@@ -180,10 +180,10 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
 	} /* if ANSI */
 
 	/* copy down the called number information */
-	copy_cdPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cdPtyNum);
+	copy_cdPtyNum_to_sngss7 (ftdmchan, &iam.cdPtyNum);
 	
 	/* copy down the calling number information */	
-	copy_cgPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cgPtyNum);
+	copy_cgPtyNum_to_sngss7 (ftdmchan, &iam.cgPtyNum);
 
 	/* check if the user would like a custom NADI value for the calling Pty Num */
 	clg_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_clg_nadi");
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
index 9be1f8a8fb..17cae48681 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
@@ -91,15 +91,16 @@ FTDM_ENUM_NAMES(BLK_FLAGS_NAMES, BLK_FLAGS_STRING)
 FTDM_STR2ENUM(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_flag_t, BLK_FLAGS_NAMES, 31)
 
 /* FUNCTIONS ******************************************************************/
-uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
+ftdm_status_t copy_cgPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum)
 {
 
-	return 0;
+	return FTDM_SUCCESS;
 }
 
 /******************************************************************************/
-uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
+ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum)
 {
+	const char *val;	
 	int k;
 	int j;
 	int flag;
@@ -108,24 +109,38 @@ uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
 	uint8_t lower;
 	uint8_t upper;
 
-	/**************************************************************************/
+	ftdm_caller_data_t *ftdm = &ftdmchan->caller_data;
+
 	cgPtyNum->eh.pres		   = PRSNT_NODEF;
-	/**************************************************************************/
+	
 	cgPtyNum->natAddrInd.pres   = PRSNT_NODEF;
 	cgPtyNum->natAddrInd.val	= 0x03;
-	/**************************************************************************/
+
+	
 	cgPtyNum->scrnInd.pres	  = PRSNT_NODEF;
-	cgPtyNum->scrnInd.val	   = ftdm->screen;
-	/**************************************************************************/
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_screen_ind");
+	if (!ftdm_strlen_zero(val)) {
+		cgPtyNum->scrnInd.val	= atoi(val);
+	} else {
+		cgPtyNum->scrnInd.val	= ftdm->screen;
+	}
+	ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Screening Ind %d\n", cgPtyNum->scrnInd.val);
+	
 	cgPtyNum->presRest.pres	 = PRSNT_NODEF;
-	cgPtyNum->presRest.val	  = ftdm->pres;
-	/**************************************************************************/
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_pres_ind");
+	if (!ftdm_strlen_zero(val)) {
+		cgPtyNum->presRest.val	= atoi(val);
+	} else {
+		cgPtyNum->presRest.val	= ftdm->pres;
+	}
+	ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Presentation Ind %d\n", cgPtyNum->presRest.val);
+
 	cgPtyNum->numPlan.pres	  = PRSNT_NODEF;
 	cgPtyNum->numPlan.val	   = 0x01;
-	/**************************************************************************/
+
 	cgPtyNum->niInd.pres		= PRSNT_NODEF;
 	cgPtyNum->niInd.val		 = 0x00;
-	/**************************************************************************/
+
 	cgPtyNum->addrSig.pres	  = PRSNT_NODEF;
 	
 	/* atoi will search through memory starting from the pointer it is given until
@@ -207,18 +222,18 @@ uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
 	cgPtyNum->oddEven.pres	  = PRSNT_NODEF;
 	cgPtyNum->oddEven.val	   = odd;
 	/**************************************************************************/
-	return 0;
+	return FTDM_SUCCESS;
 }
 
 /******************************************************************************/
-uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
+ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum)
 {
 
-	return 0;
+	return FTDM_SUCCESS;
 }
 
 /******************************************************************************/
-uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
+ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum)
 {
 	int k;
 	int j;
@@ -228,6 +243,8 @@ uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
 	uint8_t lower;
 	uint8_t upper;
 
+	ftdm_caller_data_t *ftdm = &ftdmchan->caller_data;
+
 	/**************************************************************************/
 	cdPtyNum->eh.pres		   = PRSNT_NODEF;
 	/**************************************************************************/