[Freeswitch-svn] [commit] r8084 - in freeswitch/trunk: scripts/socket scripts/socket/FreeSWITCH src/mod/applications/mod_enum

Freeswitch SVN anthm at freeswitch.org
Thu Apr 10 16:26:15 EDT 2008


Author: anthm
Date: Thu Apr 10 16:26:15 2008
New Revision: 8084

Modified:
   freeswitch/trunk/scripts/socket/FreeSWITCH/Client.pm
   freeswitch/trunk/scripts/socket/sock.pl
   freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c

Log:
fix MODAPP-85

Modified: freeswitch/trunk/scripts/socket/FreeSWITCH/Client.pm
==============================================================================
--- freeswitch/trunk/scripts/socket/FreeSWITCH/Client.pm	(original)
+++ freeswitch/trunk/scripts/socket/FreeSWITCH/Client.pm	Thu Apr 10 16:26:15 2008
@@ -10,6 +10,7 @@
   my $proto = shift;
   my $args = shift;
   my $class = ref($proto) || $proto;
+
   $self->{_host} = $args->{-host} || "localhost";
   $self->{_port} = $args->{-port} || 8021;
   $self->{_password} = $args->{-password} || undef; 
@@ -17,10 +18,14 @@
 
   $self->{events} = [];
   my $me = bless $self,$class;
+
+
+
   if (!$self->{_password}) {
     return $me;
   }
   if ($me->connect()) {
+  print Dumper $me;
     return $me;
   } else {
     return undef;

Modified: freeswitch/trunk/scripts/socket/sock.pl
==============================================================================
--- freeswitch/trunk/scripts/socket/sock.pl	(original)
+++ freeswitch/trunk/scripts/socket/sock.pl	Thu Apr 10 16:26:15 2008
@@ -36,6 +36,15 @@
   if ($r->{has_event}) {
     print Dumper $r->{event};
   }
+  if ($r->{event}->{'event-name'} !~ /dtmf/i) {
+    $o = $fs->call_command("park");
+
+    print "Got DTMF $r->{event}->{'dtmf-digit'}\n";
+    push @digits, $r->{event}->{'dtmf-digit'};
+    print "Dialed: " . join("", @digits) . "\n";
+    next;
+  }
+
   if ($r->{event}->{'event-name'} !~ /execute/i) {
     printf "uuid: $data->{'unique-id'}\n";
     $o = $fs->call_command("break");

Modified: freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c	Thu Apr 10 16:26:15 2008
@@ -40,11 +40,15 @@
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_enum_shutdown);
 SWITCH_MODULE_DEFINITION(mod_enum, mod_enum_load, mod_enum_shutdown, NULL);
 
+static switch_mutex_t *MUTEX = NULL;
+
+
 struct enum_record {
 	int order;
 	int preference;
 	char *service;
 	char *route;
+	int supported;
 	struct enum_record *next;
 };
 typedef struct enum_record enum_record_t;
@@ -72,9 +76,9 @@
 static struct {
 	char *root;
 	char *isn_root;
-	switch_hash_t *routes;
 	enum_route_t *route_order;
 	switch_memory_pool_t *pool;
+	int auto_reload;
 	int timeout;
 } globals;
 
@@ -85,26 +89,21 @@
 {
 	enum_route_t *route, *rp;
 
-	if (!(route = malloc(sizeof(*route)))) {
-		return;
-	}
+	route = switch_core_alloc(globals.pool, sizeof(*route));
 
-	memset(route, 0, sizeof(*route));
 
 	route->service = strdup(service);
 	route->regex = strdup(regex);
 	route->replace = strdup(replace);
 
+	switch_mutex_lock(MUTEX);
 	if (!globals.route_order) {
 		globals.route_order = route;
 	} else {
 		for (rp = globals.route_order; rp && rp->next; rp = rp->next);
 		rp->next = route;
 	}
-
-	if (!(rp = switch_core_hash_find(globals.routes, service))) {
-		switch_core_hash_insert(globals.routes, route->service, route);
-	}
+	switch_mutex_unlock(MUTEX);
 }
 
 
@@ -114,8 +113,6 @@
 	switch_xml_t cfg, xml = NULL, param, settings, route, routes;
 	switch_status_t status = SWITCH_STATUS_SUCCESS;
 
-	switch_core_hash_init(&globals.routes, globals.pool);
-
 	if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
 		status = SWITCH_STATUS_FALSE;
@@ -128,6 +125,8 @@
 			char *val = (char *) switch_xml_attr_soft(param, "value");
 			if (!strcasecmp(var, "default-root")) {
 				set_global_root(val);
+			} else if (!strcasecmp(var, "auto-reload")) {
+				globals.auto_reload = switch_true(val);
 			} else if (!strcasecmp(var, "query-timeout")) {
 				globals.timeout = atoi(val);
 			} else if (!strcasecmp(var, "default-isn-root")) {
@@ -210,20 +209,19 @@
 }
 
 
-static void add_result(enum_query_t * q, int order, int preference, char *service, char *route)
+static void add_result(enum_query_t * q, int order, int preference, char *service, char *route, int supported)
 {
 	enum_record_t *new_result, *rp, *prev = NULL;
 
-	if (!(new_result = malloc(sizeof(*new_result)))) {
-		return;
-	}
-
+	new_result = malloc(sizeof(*new_result));
+	switch_assert(new_result);
 	memset(new_result, 0, sizeof(*new_result));
 
 	new_result->order = order;
 	new_result->preference = preference;
 	new_result->service = strdup(service);
 	new_result->route = strdup(route);
+	new_result->supported = supported;
 
 	if (!q->results) {
 		q->results = new_result;
@@ -347,7 +345,7 @@
 			char rbuf[1024] = "";
 			char *uri;
 			enum_route_t *route;
-
+			int supported = 0;
 			switch_regex_safe_free(re);
 
 			if ((proceed = switch_regex_perform(q->number, regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
@@ -358,7 +356,11 @@
 					uri = replace;
 				}
 
-				if ((route = (enum_route_t *) switch_core_hash_find(globals.routes, service))) {
+				switch_mutex_lock(MUTEX);
+				for(route = globals.route_order; route; route = route->next) {
+					if (strcasecmp(service, route->service)) {
+						continue;
+					}
 					switch_regex_safe_free(re);
 					if ((proceed = switch_regex_perform(uri, route->regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
 						if (strchr(route->regex, '(')) {
@@ -367,11 +369,17 @@
 						} else {
 							uri = route->replace;
 						}
+						supported++;
+						add_result(q, order, preference, service, uri, supported);
 					}
 				}
-				
-				add_result(q, order, preference, service, uri);
-			}
+
+				if (!supported) {
+					add_result(q, order, preference, service, uri, 0);
+				}
+			} 
+			switch_mutex_unlock(MUTEX);
+			
 
 			switch_regex_safe_free(re);
 		}
@@ -563,7 +571,6 @@
 	switch_caller_extension_t *extension = NULL;
 	enum_record_t *results, *rp;
 	switch_channel_t *channel = switch_core_session_get_channel(session);
-	enum_route_t *rtp;
 	char *dp = (char *) arg;
 
 	if (!caller_profile) {
@@ -580,13 +587,15 @@
 		}
 		switch_channel_set_variable(channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE, "true");
 
-		for (rtp = globals.route_order; rtp; rtp = rtp->next) {
-			for (rp = results; rp; rp = rp->next) {
-				if (!strcasecmp(rtp->service, rp->service)) {
-					switch_caller_extension_add_application(session, extension, "bridge", rp->route);
-				}
+		
+		for (rp = results; rp; rp = rp->next) {
+			if (!rp->supported) {
+				continue;
 			}
+
+			switch_caller_extension_add_application(session, extension, "bridge", rp->route);			
 		}
+		
 
 		free_results(&results);
 	}
@@ -602,7 +611,6 @@
 	char *mydata = NULL;
 	char *dest = NULL, *root = NULL;
 	enum_record_t *results, *rp;
-	enum_route_t *rtp;
 	char rbuf[1024] = "";
 	char vbuf[1024] = "";
 	char *rbp = rbuf;
@@ -631,24 +639,24 @@
 				switch_channel_variable_last(channel);
 			}
 
-			for (rtp = globals.route_order; rtp; rtp = rtp->next) {
-				for (rp = results; rp; rp = rp->next) {
-					if (!strcasecmp(rtp->service, rp->service)) {
-						switch_snprintf(vbuf, sizeof(vbuf), "enum_route_%d", cnt++);
-						switch_channel_set_variable(channel, vbuf, rp->route);						
-						if (rp->preference == last_pref && rp->order == last_order) {
-							*last_delim = ',';
-						}
-						switch_snprintf(rbp, rbl, "%s|", rp->route);
-						last_delim = end_of_p(rbp);
-						last_order = rp->order;
-						last_pref = rp->preference;
-						l = strlen(rp->route) + 1;
-						rbp += l;
-						rbl -= l;
-					}
+			for (rp = results; rp; rp = rp->next) {
+				if (!rp->supported) {
+					continue;
 				}
+				switch_snprintf(vbuf, sizeof(vbuf), "enum_route_%d", cnt++);
+				switch_channel_set_variable(channel, vbuf, rp->route);						
+				if (rp->preference == last_pref && rp->order == last_order) {
+					*last_delim = ',';
+				}
+				switch_snprintf(rbp, rbl, "%s|", rp->route);
+				last_delim = end_of_p(rbp);
+				last_order = rp->order;
+				last_pref = rp->preference;
+				l = strlen(rp->route) + 1;
+				rbp += l;
+				rbl -= l;
 			}
+			
 			switch_snprintf(vbuf, sizeof(vbuf), "%d", cnt);
 			switch_channel_set_variable(channel, "enum_route_count", vbuf);
 			*(rbuf + strlen(rbuf) - 1) = '\0';
@@ -667,7 +675,6 @@
 	char *mydata = NULL;
 	char *dest = NULL, *root = NULL;
 	enum_record_t *results, *rp;
-	enum_route_t *rtp;
 	char rbuf[1024] = "";
 	char *rbp = rbuf;
 	switch_size_t l = 0, rbl = sizeof(rbuf);
@@ -688,21 +695,21 @@
 		dest = argv[0];
 		root = argv[1];
 		if (enum_lookup(root, dest, &results) == SWITCH_STATUS_SUCCESS) {
-			for (rtp = globals.route_order; rtp; rtp = rtp->next) {
-				for (rp = results; rp; rp = rp->next) {
-					if (!strcasecmp(rtp->service, rp->service)) {
-						if (rp->preference == last_pref && rp->order == last_order) {
-							*last_delim = ',';
-						}
-						switch_snprintf(rbp, rbl, "%s|", rp->route);
-						last_delim = end_of_p(rbp);
-						last_order = rp->order;
-						last_pref = rp->preference;
-						l = strlen(rp->route) + 1;
-						rbp += l;
-						rbl -= l;
-					}
+			for (rp = results; rp; rp = rp->next) {
+				if (!rp->supported) {
+					continue;
 				}
+				if (rp->preference == last_pref && rp->order == last_order) {
+					*last_delim = ',';
+				}
+				switch_snprintf(rbp, rbl, "%s|", rp->route);
+				last_delim = end_of_p(rbp);
+				last_order = rp->order;
+				last_pref = rp->preference;
+				l = strlen(rp->route) + 1;
+				rbp += l;
+				rbl -= l;
+			
 			}
 			*(rbuf + strlen(rbuf) - 1) = '\0';
 			stream->write_function(stream, "%s", rbuf);
@@ -721,6 +728,24 @@
 }
 
 
+static void do_load(void)
+{
+	switch_mutex_lock(MUTEX);
+	if (globals.pool) {
+		switch_core_destroy_memory_pool(&globals.pool);
+	}
+
+	memset(&globals, 0, sizeof(globals));
+	switch_core_new_memory_pool(&globals.pool);
+	globals.timeout = 10;
+    load_config();
+	switch_mutex_unlock(MUTEX);
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "ENUM Reloaded\n");
+
+}
+
+
+
 SWITCH_STANDARD_API(enum_function)
 {
 	int argc = 0;
@@ -728,7 +753,6 @@
 	enum_record_t *results, *rp;
 	char *mydata = NULL;
 	char *dest = NULL, *root = NULL;
-	enum_route_t *rtp;
 
 	if (session) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "This function cannot be called from the dialplan.\n");
@@ -736,13 +760,20 @@
 	}
 
 	if (!cmd || !(mydata = strdup(cmd))) {
-		stream->write_function(stream, "Usage: enum <number> [<root>]\n");
+		stream->write_function(stream, "Usage: enum [reload | <number> [<root>] ]\n");
 		return SWITCH_STATUS_SUCCESS;
 	}
 
 	if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
 		dest = argv[0];
 		root = argv[1];
+		
+		if (!strcasecmp(dest, "reload")) {
+			do_load();
+			stream->write_function(stream, "+OK ENUM Reloaded.\n");
+            return SWITCH_STATUS_SUCCESS;
+
+		}
 
 		if (!enum_lookup(root, dest, &results) == SWITCH_STATUS_SUCCESS) {
 			stream->write_function(stream, "No Match!\n");
@@ -762,11 +793,10 @@
 							   "\nSupported Routes:\n"
 							   "Order\tPref\tService   \tRoute\n" "==============================================================================\n");
 
-		for (rtp = globals.route_order; rtp; rtp = rtp->next) {
-			for (rp = results; rp; rp = rp->next) {
-				if (!strcasecmp(rtp->service, rp->service)) {
-					stream->write_function(stream, "%d\t%d\t%-10s\t%s\n", rp->order, rp->preference, rp->service, rp->route);
-				}
+
+		for (rp = results; rp; rp = rp->next) {
+			if (rp->supported) {
+				stream->write_function(stream, "%d\t%d\t%-10s\t%s\n", rp->order, rp->preference, rp->service, rp->route);
 			}
 		}
 
@@ -779,20 +809,34 @@
 }
 
 
+static void event_handler(switch_event_t *event)
+{
+	if (globals.auto_reload) {
+		do_load();
+	}
+}
+
 SWITCH_MODULE_LOAD_FUNCTION(mod_enum_load)
 {
 	switch_api_interface_t *api_interface;
 	switch_application_interface_t *app_interface;
 	switch_dialplan_interface_t *dp_interface;
 
+
+	switch_mutex_init(&MUTEX, SWITCH_MUTEX_NESTED, pool);
+
 	if (dns_init(0) < 0) {
 		return SWITCH_STATUS_FALSE;
 	}
 
 	memset(&globals, 0, sizeof(globals));
-	globals.pool = pool;
-	globals.timeout = 10;
-	load_config();
+	do_load();
+
+
+	if (switch_event_bind(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL) != SWITCH_STATUS_SUCCESS) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
+		return SWITCH_STATUS_TERM;
+	}
 
 	/* connect my internal structure to the blank pointer passed to me */
 	*module_interface = switch_loadable_module_create_module_interface(pool, modname);
@@ -801,13 +845,18 @@
 	SWITCH_ADD_APP(app_interface, "enum", "Perform an ENUM lookup", "Perform an ENUM lookup", enum_app_function, "<number> [<root>]", SAF_SUPPORT_NOMEDIA);
 	SWITCH_ADD_DIALPLAN(dp_interface, "enum", enum_dialplan_hunt);
 
+	
 	/* indicate that the module should continue to be loaded */
 	return SWITCH_STATUS_SUCCESS;
 }
 
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_enum_shutdown)
 {
-	switch_core_hash_destroy(&globals.routes);
+
+	if (globals.pool) {
+		switch_core_destroy_memory_pool(&globals.pool);
+	}
+
 	return SWITCH_STATUS_SUCCESS;
 }
 



More information about the Freeswitch-svn mailing list