Revision
17429
Author
brian
Date
2010-04-28 09:19:07 -0500 (Wed, 28 Apr 2010)

Log Message

Merge branch 'master' of git.freeswitch.org:freeswitch

Modified Paths

Diff

Modified: freeswitch/trunk/conf/autoload_configs/switch.conf.xml ( => )



Modified: freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c
===================================================================
--- freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c	2010-04-28 14:19:07 UTC (rev 17429)
@@ -25,6 +25,7 @@
  * 
  * Anthony Minessale II <anthmct@yahoo.com>
  * Moises Silva <moy@sangoma.com>
+ * David Yat Sin <dyatsin@sangoma.com>
  *
  *
  * mod_freetdm.c -- FreeTDM Endpoint Module
@@ -1950,6 +1951,14 @@
 					sigmsg->channel->span_id, sigmsg->channel->chan_id, (uuid) ? uuid : "N/A");
 			}
 		}
+		break;
+	case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
+		{
+			ftdm_signaling_status_t *sigstatus = (ftdm_signaling_status_t*)(sigmsg->raw_data);
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to :%s\n",
+					sigmsg->channel->span_id, sigmsg->channel->chan_id, ftdm_signaling_status2str(*sigstatus));
+		}
+		break;
 	default:
 		{
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unhandled msg type %d for channel %d:%d\n",
@@ -2983,15 +2992,19 @@
 
 void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream)
 {
+	ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
 	if (chan_id > span->chan_count) {
 		return;
 	}
-
+	
+	ftdm_channel_get_sig_status(span->channels[chan_id], &sigstatus);
 	stream->write_function(stream,
 						   "span_id: %u\n"
 						   "chan_id: %u\n"
 						   "physical_span_id: %u\n"
 						   "physical_chan_id: %u\n"
+						   "physical_status: %s\n"
+						   "signaling_status: %s\n"
 						   "type: %s\n"
 						   "state: %s\n"
 						   "last_state: %s\n"
@@ -3009,6 +3022,8 @@
 						   span->channels[chan_id]->chan_id,
 						   span->channels[chan_id]->physical_span_id,
 						   span->channels[chan_id]->physical_chan_id,
+					  	 (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP",
+					     ftdm_signaling_status2str(sigstatus),
 						   ftdm_chan_type2str(span->channels[chan_id]->type),
 						   ftdm_channel_state2str(span->channels[chan_id]->state),
 						   ftdm_channel_state2str(span->channels[chan_id]->last_state),
@@ -3027,16 +3042,19 @@
 
 void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream)
 {
+	ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
 	if (chan_id > span->chan_count) {
 		return;
 	}
-
+	ftdm_channel_get_sig_status(span->channels[chan_id], &sigstatus);
 	stream->write_function(stream,
 						   " <channel>\n"
 						   "  <span-id>%u</span-id>\n"
 						   "  <chan-id>%u</chan-id>>\n"
 						   "  <physical-span-id>%u</physical-span-id>\n"
 						   "  <physical-chan-id>%u</physical-chan-id>\n"
+						   "  <physical-status>%s</physical-status>\n"
+						   "  <signaling-status>%s</signaling-status>\n"
 						   "  <type>%s</type>\n"
 						   "  <state>%s</state>\n"
 						   "  <last-state>%s</last-state>\n"
@@ -3055,6 +3073,8 @@
 						   span->channels[chan_id]->chan_id,
 						   span->channels[chan_id]->physical_span_id,
 						   span->channels[chan_id]->physical_chan_id,
+						   (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP",
+					     ftdm_signaling_status2str(sigstatus),
 						   ftdm_chan_type2str(span->channels[chan_id]->type),
 						   ftdm_channel_state2str(span->channels[chan_id]->state),
 						   ftdm_channel_state2str(span->channels[chan_id]->last_state),
@@ -3168,7 +3188,7 @@
 					stream->write_function(stream,
 										   "+OK\n"
 										   "span: %u (%s)\n"
-										   "type: %s\n"
+										   "type: %s\n"		
 										   "signaling_status: %s\n"
 										   "chan_count: %u\n"
 										   "dialplan: %s\n"

Modified: freeswitch/trunk/libs/freetdm/src/ftdm_io.c (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/ftdm_io.c	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftdm_io.c	2010-04-28 14:19:07 UTC (rev 17429)
@@ -143,6 +143,8 @@
 FTDM_ENUM_NAMES(SIGNALING_STATUS_NAMES, SIGSTATUS_STRINGS)
 FTDM_STR2ENUM(ftdm_str2ftdm_signaling_status, ftdm_signaling_status2str, ftdm_signaling_status_t, SIGNALING_STATUS_NAMES, FTDM_SIG_STATE_INVALID)
 
+static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name);
+
 static const char *cut_path(const char *in)
 {
 	const char *p, *ret = in;
@@ -775,7 +777,7 @@
 			i++;
 		}
 
-		ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY);
+		ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY);		
 		*chan = new_chan;
 		return FTDM_SUCCESS;
 	}
@@ -1279,9 +1281,10 @@
 		if (!(check = group->channels[i])) {
 			status = FTDM_FAIL;
 			break;
-		}
+		} 
 
-		if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && 
+		if (ftdm_test_flag(check, FTDM_CHANNEL_READY) &&
+			ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) &&
 			!ftdm_test_flag(check, FTDM_CHANNEL_INUSE) && 
 			!ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) && 
 			!ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) &&
@@ -1401,7 +1404,8 @@
 			break;
 		}
 			
-		if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && 
+		if (ftdm_test_flag(check, FTDM_CHANNEL_READY) &&
+			ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) &&
 			!ftdm_test_flag(check, FTDM_CHANNEL_INUSE) && 
 			!ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) && 
 			!ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) && 
@@ -2851,26 +2855,79 @@
 	return rval;
 }
 
-static void ftdm_set_channels_gains(ftdm_span_t *span, int currindex, float rxgain, float txgain)
+static ftdm_status_t ftdm_set_channels_gains(ftdm_span_t *span, int currindex, float rxgain, float txgain)
 {
 	unsigned chan_index = 0;
 
 	if (!span->chan_count) {
-		return;
+		ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set gains because span has no channels\n");
+		return FTDM_FAIL;
 	}
 
 	for (chan_index = currindex+1; chan_index <= span->chan_count; chan_index++) {
 		if (!FTDM_IS_VOICE_CHANNEL(span->channels[chan_index])) {
 			continue;
 		}
-		ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_RX_GAIN, &rxgain);
-		ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_TX_GAIN, &txgain);
+		if (ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_RX_GAIN, &rxgain) != FTDM_SUCCESS) {
+			return FTDM_FAIL;
+		}
+		if (ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_TX_GAIN, &txgain) != FTDM_SUCCESS) {
+			return FTDM_FAIL;
+		}
 	}
+	return FTDM_SUCCESS;
 }
 
+static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex) {
+	unsigned chan_index = 0;
 
+	if (!span->chan_count) {
+		ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set alarms because span has no channels\n");
+		return FTDM_FAIL;
+	}
 
-static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex);
+	if (!span->fio->get_alarms) {
+		ftdm_log(FTDM_LOG_WARNING, "%d: Span does not support alarms\n", span->span_id);
+		return FTDM_SUCCESS;
+	}
+
+	for (chan_index = currindex+1; chan_index <= span->chan_count; chan_index++) {
+		/* fio->get_alarms will update ftdm_chan->alarm_flags */
+		if (span->fio->get_alarms(span->channels[chan_index]) != FTDM_SUCCESS) {
+			ftdm_log(FTDM_LOG_ERROR, "%d:%d: Failed to get alarms\n", span->channels[chan_index]->physical_span_id, span->channels[chan_index]->physical_chan_id);
+			return FTDM_FAIL;
+		}
+	}
+	return FTDM_SUCCESS;
+}
+
+
+FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char* str, ftdm_channel_config_t *chan_config, unsigned *configured)
+{
+	int currindex = span->chan_count;
+	*configured = 0;
+	*configured = span->fio->configure_span(span, str, chan_config->type, chan_config->name, chan_config->number);
+	if (!*configured) {
+		ftdm_log(FTDM_LOG_ERROR, "%d:Failed to configure span", span->span_id);
+		return FTDM_FAIL;
+	}
+
+	if (ftdm_group_add_channels(span, currindex, chan_config->group_name) != FTDM_SUCCESS) {
+		ftdm_log(FTDM_LOG_ERROR, "%d:Failed to add channels to group %s\n", span->span_id, chan_config->group_name);
+		return FTDM_FAIL;
+	}
+	if (ftdm_set_channels_alarms(span, currindex) != FTDM_SUCCESS) {
+		ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set channel alarms\n", span->span_id);
+		return FTDM_FAIL;
+	}
+	if (ftdm_set_channels_gains(span, currindex, chan_config->rxgain, chan_config->txgain) != FTDM_SUCCESS) {
+		ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set channel gains\n", span->span_id);
+		return FTDM_FAIL;
+	}
+	return FTDM_SUCCESS;
+}
+
+
 static ftdm_status_t load_config(void)
 {
 	char cfg_name[] = "freetdm.conf";
@@ -2878,18 +2935,16 @@
 	char *var, *val;
 	int catno = -1;
 	int intparam = 0;
-	int currindex = 0;
 	ftdm_span_t *span = NULL;
 	unsigned configured = 0, d = 0;
-	char name[80] = "";
-	char number[25] = "";
-	char group_name[80] = "default";
 	ftdm_io_interface_t *fio = NULL;
 	ftdm_analog_start_type_t tmp;
-	float rxgain = 0.0;
-	float txgain = 0.0;
 	ftdm_size_t len = 0;
+	ftdm_channel_config_t chan_config;
 
+	memset(&chan_config, 0, sizeof(chan_config));
+	sprintf(chan_config.group_name,"default");
+
 	if (!ftdm_config_open_file(&cfg, cfg_name)) {
 		return FTDM_FAIL;
 	}
@@ -2967,15 +3022,15 @@
 				ftdm_log(FTDM_LOG_DEBUG, "setting trunk type to '%s'\n", ftdm_trunk_type2str(span->trunk_type)); 
 			} else if (!strcasecmp(var, "name")) {
 				if (!strcasecmp(val, "undef")) {
-					*name = '\0';
+					chan_config.name[0] = '\0';
 				} else {
-					ftdm_copy_string(name, val, sizeof(name));
+					ftdm_copy_string(chan_config.name, val, FTDM_MAX_NAME_STR_SZ);
 				}
 			} else if (!strcasecmp(var, "number")) {
 				if (!strcasecmp(val, "undef")) {
-					*number = '\0';
+					chan_config.number[0] = '\0';
 				} else {
-					ftdm_copy_string(number, val, sizeof(number));
+					ftdm_copy_string(chan_config.number, val, FTDM_MAX_NUMBER_STR_SZ);
 				}
 			} else if (!strcasecmp(var, "analog-start-type")) {
 				if (span->trunk_type == FTDM_TRUNK_FXS || span->trunk_type == FTDM_TRUNK_FXO || span->trunk_type == FTDM_TRUNK_EM) {
@@ -2993,10 +3048,11 @@
 							ftdm_analog_start_type2str(span->start_type));
 				}
 				if (span->trunk_type == FTDM_TRUNK_FXO) {
-					currindex = span->chan_count;
-					configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXO, name, number);
-					ftdm_set_channels_gains(span, currindex, rxgain, txgain);
-					ftdm_group_add_channels(group_name, span, currindex);
+     			unsigned chans_configured = 0;
+					chan_config.type = FTDM_CHAN_TYPE_FXO;
+					if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+						configured += chans_configured;
+					}
 				} else {
 					ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n");
 				}
@@ -3007,10 +3063,11 @@
 							ftdm_analog_start_type2str(span->start_type));
 				}
 				if (span->trunk_type == FTDM_TRUNK_FXS) {
-					currindex = span->chan_count;
-					configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXS, name, number);
-					ftdm_set_channels_gains(span, currindex, rxgain, txgain);
-					ftdm_group_add_channels(group_name, span, currindex);
+					unsigned chans_configured = 0;
+					chan_config.type = FTDM_CHAN_TYPE_FXS;
+					if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+						configured += chans_configured;
+					}
 				} else {
 					ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n");
 				}
@@ -3021,56 +3078,62 @@
 							ftdm_analog_start_type2str(span->start_type));
 				}
 				if (span->trunk_type == FTDM_TRUNK_EM) {
-					currindex = span->chan_count;
-					configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_EM, name, number);
-					ftdm_set_channels_gains(span, currindex, rxgain, txgain);
-					ftdm_group_add_channels(group_name, span, currindex);
+					unsigned chans_configured = 0;
+					chan_config.type = FTDM_CHAN_TYPE_EM;
+					if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+						configured += chans_configured;
+					}
 				} else {
 					ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n");
 				}
 			} else if (!strcasecmp(var, "b-channel")) {
-				currindex = span->chan_count;
-				configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_B, name, number);
-				ftdm_set_channels_gains(span, currindex, rxgain, txgain);
-				ftdm_group_add_channels(group_name, span, currindex);
+				unsigned chans_configured = 0;
+				chan_config.type = FTDM_CHAN_TYPE_B;
+				if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+					configured += chans_configured;
+				}
 			} else if (!strcasecmp(var, "d-channel")) {
 				if (d) {
 					ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n");
 				} else {
-					ftdm_chan_type_t qtype;
+					unsigned chans_configured = 0;
 					if (!strncasecmp(val, "lapd:", 5)) {
-						qtype = FTDM_CHAN_TYPE_DQ931;
+						chan_config.type = FTDM_CHAN_TYPE_DQ931;
 						val += 5;
 					} else {
-						qtype = FTDM_CHAN_TYPE_DQ921;
+						chan_config.type = FTDM_CHAN_TYPE_DQ921;
 					}
-					configured += fio->configure_span(span, val, qtype, name, number);
+					if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+						configured += chans_configured;
+					}
 					d++;
 				}
 			} else if (!strcasecmp(var, "cas-channel")) {
-				currindex = span->chan_count;
-				configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number);	
-				ftdm_set_channels_gains(span, currindex, rxgain, txgain);
-				ftdm_group_add_channels(group_name, span, currindex);
+				unsigned chans_configured = 0;
+				chan_config.type = FTDM_CHAN_TYPE_CAS;
+				
+				if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) {
+					configured += chans_configured;
+				}
 			} else if (!strcasecmp(var, "dtmf_hangup")) {
 				span->dtmf_hangup = ftdm_strdup(val);
 				span->dtmf_hangup_len = strlen(val);
 			} else if (!strcasecmp(var, "txgain")) {
-				if (sscanf(val, "%f", &txgain) != 1) {
+				if (sscanf(val, "%f", &(chan_config.txgain)) != 1) {
 					ftdm_log(FTDM_LOG_ERROR, "invalid txgain: '%s'\n", val);
 				}
 			} else if (!strcasecmp(var, "rxgain")) {
-				if (sscanf(val, "%f", &rxgain) != 1) {
+				if (sscanf(val, "%f", &(chan_config.rxgain)) != 1) {
 					ftdm_log(FTDM_LOG_ERROR, "invalid rxgain: '%s'\n", val);
 				}
 			} else if (!strcasecmp(var, "group")) {
 				len = strlen(val);
-				if (len >= sizeof(group_name)) {
-					len = sizeof(group_name) - 1;
+				if (len >= FTDM_MAX_NAME_STR_SZ) {
+					len = FTDM_MAX_NAME_STR_SZ - 1;
 					ftdm_log(FTDM_LOG_WARNING, "Truncating group name %s to %zd length\n", val, len);
 				}
-				memcpy(group_name, val, len);
-				group_name[len] = '\0';
+				memcpy(chan_config.group_name, val, len);
+				chan_config.group_name[len] = '\0';
 			} else {
 				ftdm_log(FTDM_LOG_ERROR, "unknown span variable '%s'\n", var);
 			}
@@ -3527,7 +3590,7 @@
 	return FTDM_FAIL;
 }
 
-static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex)
+static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name)
 {
 	unsigned chan_index = 0;
 
@@ -3639,19 +3702,24 @@
 FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t *sigmsg)
 {
 	ftdm_status_t status = FTDM_FAIL;
+	if (sigmsg->channel) {
+		ftdm_mutex_lock(sigmsg->channel->mutex);
+	}
 
+	if (sigmsg->event_id == FTDM_SIGEVENT_SIGSTATUS_CHANGED) {
+		if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) {
+			ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
+		} else {
+			ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
+		}
+	}
 	if (span->signal_cb) {
-		if (sigmsg->channel) {
-			ftdm_mutex_lock(sigmsg->channel->mutex);
-		}
-
 		status = span->signal_cb(sigmsg);
+	}
 
-		if (sigmsg->channel) {
-			ftdm_mutex_unlock(sigmsg->channel->mutex);
-		}
+	if (sigmsg->channel) {
+		ftdm_mutex_unlock(sigmsg->channel->mutex);
 	}
-
 	return status;
 }
 

Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c	2010-04-28 14:19:07 UTC (rev 17429)
@@ -85,6 +85,32 @@
 }
 
 /**
+ * \brief Returns the signalling status on a channel
+ * \param ftdmchan Channel to get status on
+ * \param status	Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(analog_get_channel_sig_status)
+{
+	*status = FTDM_SIG_STATE_UP;
+	return FTDM_SUCCESS;
+}
+
+/**
+ * \brief Returns the signalling status on a span
+ * \param span Span to get status on
+ * \param status	Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_SPAN_GET_SIG_STATUS_FUNCTION(analog_get_span_sig_status)
+{
+	*status = FTDM_SIG_STATE_UP;
+	return FTDM_SUCCESS;
+}
+
+/**
  * \brief Starts an analog span thread (monitor)
  * \param span Span to monitor
  * \return Success or failure
@@ -181,6 +207,9 @@
 	span->signal_type = FTDM_SIGTYPE_ANALOG;
 	span->signal_data = analog_data;
 	span->outgoing_call = span->trunk_type == FTDM_TRUNK_FXS ? analog_fxs_outgoing_call : analog_fxo_outgoing_call;
+	span->get_channel_sig_status = analog_get_channel_sig_status;
+	span->get_span_sig_status = analog_get_span_sig_status;
+
 	ftdm_span_load_tones(span, tonemap);
 
 	return FTDM_SUCCESS;

Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_analog_em/ftmod_analog_em.c (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_analog_em/ftmod_analog_em.c	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_analog_em/ftmod_analog_em.c	2010-04-28 14:19:07 UTC (rev 17429)
@@ -83,6 +83,32 @@
 }
 
 /**
+ * \brief Returns the signalling status on a channel
+ * \param ftdmchan Channel to get status on
+ * \param status	Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(analog_em_get_channel_sig_status)
+{
+	*status = FTDM_SIG_STATE_UP;
+	return FTDM_SUCCESS;
+}
+
+/**
+ * \brief Returns the signalling status on a span
+ * \param span Span to get status on
+ * \param status	Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_SPAN_GET_SIG_STATUS_FUNCTION(analog_em_get_span_sig_status)
+{
+	*status = FTDM_SIG_STATE_UP;
+	return FTDM_SUCCESS;
+}
+
+/**
  * \brief Initialises an EM span from configuration variables
  * \param span Span to configure
  * \param sig_cb Callback function for event signals
@@ -149,6 +175,8 @@
 	span->signal_type = FTDM_SIGTYPE_ANALOG;
 	span->signal_data = analog_data;
 	span->outgoing_call = analog_em_outgoing_call;
+	span->get_channel_sig_status = analog_em_get_channel_sig_status;
+	span->get_span_sig_status = analog_em_get_span_sig_status;
 	ftdm_span_load_tones(span, tonemap);
 
 	return FTDM_SUCCESS;

Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c	2010-04-28 14:19:07 UTC (rev 17429)
@@ -44,6 +44,43 @@
 }
 
 /**
+ * \brief Returns the signalling status on a channel
+ * \param ftdmchan Channel to get status on
+ * \param status	Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(isdn_get_channel_sig_status)
+{
+	*status = FTDM_SIG_STATE_DOWN;
+
+	ftdm_libpri_data_t *isdn_data = ftdmchan->span->signal_data;
+	if (ftdm_test_flag(&(isdn_data->spri), LPWRAP_PRI_READY)) {
+		*status = FTDM_SIG_STATE_UP;
+	}
+	return FTDM_SUCCESS;
+}
+
+/**
+ * \brief Returns the signalling status on a span
+ * \param span Span to get status on
+ * \param status	Pointer to set signalling status
+ * \return Success or failure
+ */
+
+static FIO_SPAN_GET_SIG_STATUS_FUNCTION(isdn_get_span_sig_status)
+{
+	*status = FTDM_SIG_STATE_DOWN;
+
+	ftdm_libpri_data_t *isdn_data = span->signal_data;
+	if (ftdm_test_flag(&(isdn_data->spri), LPWRAP_PRI_READY)) {
+		*status = FTDM_SIG_STATE_UP;
+	}
+	return FTDM_SUCCESS;
+}
+
+
+/**
  * \brief Starts a libpri channel (outgoing call)
  * \param ftdmchan Channel to initiate call on
  * \return Success or failure
@@ -937,13 +974,27 @@
  */
 static int on_dchan_up(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
 {
-	
 	if (!ftdm_test_flag(spri, LPWRAP_PRI_READY)) {
+		ftdm_signaling_status_t status = FTDM_SIG_STATE_UP;
+		ftdm_channel_t *ftdmchan = NULL;
+		ftdm_sigmsg_t sig;
+		int i;
 		ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan UP!\n", spri->span->span_id);
 		ftdm_set_flag(spri, LPWRAP_PRI_READY);
 		ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART);
+
+		ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status));
+		for(i=1; i <= spri->span->chan_count; i++) {
+			ftdmchan = spri->span->channels[i];
+			memset(&sig, 0, sizeof(sig));
+			sig.chan_id = ftdmchan->chan_id;
+			sig.span_id = ftdmchan->span_id;
+			sig.channel = ftdmchan;
+			sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
+			sig.raw_data = &status;
+			ftdm_span_send_signal(spri->span, &sig);
+		}
 	}
-
 	return 0;
 }
 
@@ -955,13 +1006,28 @@
  * \return 0
  */
 static int on_dchan_down(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
-{
-
+{	
 	if (ftdm_test_flag(spri, LPWRAP_PRI_READY)) {
+		ftdm_signaling_status_t status = FTDM_SIG_STATE_DOWN;
+		ftdm_channel_t *ftdmchan = NULL;
+		ftdm_sigmsg_t sig;
+		int i;
 		ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan DOWN!\n", spri->span->span_id);
 		ftdm_clear_flag(spri, LPWRAP_PRI_READY);
 		ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART);
-		
+
+
+		ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status));
+		for(i=1; i <= spri->span->chan_count; i++) {
+			ftdmchan = spri->span->channels[i];
+			memset(&sig, 0, sizeof(sig));
+			sig.chan_id = ftdmchan->chan_id;
+			sig.span_id = ftdmchan->span_id;
+			sig.channel = ftdmchan;
+			sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
+			sig.raw_data = &status;
+			ftdm_span_send_signal(spri->span, &sig);
+		}
 	}
 
 	return 0;
@@ -1329,6 +1395,9 @@
 	span->signal_type = FTDM_SIGTYPE_ISDN;
 	span->outgoing_call = isdn_outgoing_call;
 
+	span->get_channel_sig_status = isdn_get_channel_sig_status;
+	span->get_span_sig_status = isdn_get_span_sig_status;
+	
 	if ((isdn_data->opts & FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL)) {
 		span->channel_request = isdn_channel_request;
 		ftdm_set_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID);

Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c	2010-04-28 14:19:07 UTC (rev 17429)
@@ -182,7 +182,7 @@
 		size_t buflen = sizeof(buf), len = 0;
 		pri_set_debug(spri->pri, debug);
 		ret = 0;
-		ftdm_set_flag(spri, LPWRAP_PRI_READY);
+		
 		ftdm_channel_write(spri->dchan, buf, buflen, &len);
 	} else {
 		fprintf(stderr, "Unable to create PRI\n");

Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c	2010-04-28 14:19:07 UTC (rev 17429)
@@ -2122,6 +2122,7 @@
 static ftdm_status_t ftdm_sangoma_boost_start(ftdm_span_t *span)
 {
 	int err;
+
 	ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
 	ftdm_set_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING);
 	err=ftdm_thread_create_detached(ftdm_sangoma_boost_run, span);
@@ -2140,23 +2141,23 @@
 
 static ftdm_status_t ftdm_sangoma_boost_stop(ftdm_span_t *span)
 {
+	int cnt = 10;
 	ftdm_status_t status = FTDM_SUCCESS;
 	ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
 	if (sangoma_boost_data->sigmod) {
+
+		/* FIXME: we should make sure the span thread is stopped (use pthread_kill or freetdm thread kill function) */
 		/* I think stopping the span before destroying the queue makes sense
 		   otherwise may be boost events would still arrive when the queue is already destroyed! */
 		status = sangoma_boost_data->sigmod->stop_span(span);
 
 		ftdm_queue_enqueue(sangoma_boost_data->boost_queue, NULL);
-	}
-
-	while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING)) {
-		ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n");
-		ftdm_sleep(100);
-	}
-
-	if (sangoma_boost_data->sigmod) {
+		while(ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING) && cnt-- > 0) {
+			ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n");
+			ftdm_sleep(500);
+		}
 		ftdm_queue_destroy(&sangoma_boost_data->boost_queue);
+		return status;
 	}
 	return status;
 }

Modified: freeswitch/trunk/libs/freetdm/src/include/freetdm.h (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/include/freetdm.h	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/include/freetdm.h	2010-04-28 14:19:07 UTC (rev 17429)
@@ -198,6 +198,9 @@
 #define FTDM_MAX_CHANNELS_GROUP 1024
 #define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE
 
+#define FTDM_MAX_NAME_STR_SZ 80
+#define FTDM_MAX_NUMBER_STR_SZ 20
+
 #define GOTO_STATUS(label,st) status = st; goto label ;
 
 #define ftdm_copy_string(x,y,z) strncpy(x, y, z - 1) 
@@ -611,7 +614,16 @@
 	float txgain;
 };
 
+struct ftdm_channel_config {	
+	char name[FTDM_MAX_NAME_STR_SZ];
+	char number[FTDM_MAX_NUMBER_STR_SZ];
+	char group_name[FTDM_MAX_NAME_STR_SZ];
+	ftdm_chan_type_t type;
+	float rxgain;
+	float txgain;
+};
 
+
 struct ftdm_sigmsg {
 	ftdm_signal_event_t event_id;
 	uint32_t chan_id;
@@ -831,6 +843,9 @@
 FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const char *param, const char *val);
 FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node);
 
+
+FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char *str, ftdm_channel_config_t *chan_config, unsigned *configured);
+
 FIO_CODEC_FUNCTION(fio_slin2ulaw);
 FIO_CODEC_FUNCTION(fio_ulaw2slin);
 FIO_CODEC_FUNCTION(fio_slin2alaw);

Modified: freeswitch/trunk/libs/freetdm/src/include/ftdm_types.h (17428 => 17429)


--- freeswitch/trunk/libs/freetdm/src/include/ftdm_types.h	2010-04-28 13:46:49 UTC (rev 17428)
+++ freeswitch/trunk/libs/freetdm/src/include/ftdm_types.h	2010-04-28 14:19:07 UTC (rev 17429)
@@ -416,6 +416,7 @@
 	FTDM_CHANNEL_USE_RX_GAIN = (1 << 25),
 	FTDM_CHANNEL_USE_TX_GAIN = (1 << 26),
 	FTDM_CHANNEL_IN_ALARM = (1 << 27),
+	FTDM_CHANNEL_SIG_UP = (1 << 28),
 } ftdm_channel_flag_t;
 #if defined(__cplusplus) && defined(WIN32) 
     // fix C2676 
@@ -467,6 +468,7 @@
 } ftdm_conf_parameter_t;
 
 typedef struct ftdm_channel ftdm_channel_t;
+typedef struct ftdm_channel_config ftdm_channel_config_t;
 typedef struct ftdm_event ftdm_event_t;
 typedef struct ftdm_sigmsg ftdm_sigmsg_t;
 typedef struct ftdm_span ftdm_span_t;

Modified: freeswitch/trunk/src/include/switch_types.h ( => )



Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
===================================================================

Modified: freeswitch/trunk/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c ( => )



Modified: freeswitch/trunk/src/switch_caller.c
===================================================================

Modified: freeswitch/trunk/src/switch_channel.c ( => )



Modified: freeswitch/trunk/src/switch_core.c
===================================================================