Revision
14901
Author
anthm
Date
2009-09-17 11:21:54 -0500 (Thu, 17 Sep 2009)

Log Message

DP-6

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c (14900 => 14901)


--- freeswitch/trunk/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c	2009-09-17 13:48:38 UTC (rev 14900)
+++ freeswitch/trunk/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c	2009-09-17 16:21:54 UTC (rev 14901)
@@ -52,6 +52,7 @@
 	char *exten_name = (char *) switch_xml_attr(xexten, "name");
 	int proceed = 0;
 	char *expression_expanded = NULL, *field_expanded = NULL;
+	switch_regex_t *re = NULL;
 
 	if (!exten_name) {
 		exten_name = "_anon_";
@@ -62,8 +63,8 @@
 		char *do_break_a = NULL;
 		char *expression = NULL;
 		const char *field_data = NULL;
-		switch_regex_t *re = NULL;
 		int ovector[30];
+		switch_bool_t anti_action = SWITCH_TRUE;
 		break_t do_break_i = BREAK_ON_FALSE;
 		
 		const char *xyear = switch_xml_attr(xcond, "year");
@@ -91,39 +92,66 @@
 		switch_time_exp_lt(&tm, ts);
 		
 		if (time_match && xyear) {
-			time_match = switch_number_cmp(xyear, tm.tm_year + 1900);
+			int test = tm.tm_year + 1900;
+			time_match = switch_number_cmp(xyear, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: year[%d] =~ %s %s\n", test, xyear, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xyday) {
-			time_match = switch_number_cmp(xyday, tm.tm_yday + 1);
+			int test = tm.tm_yday + 1;
+			time_match = switch_number_cmp(xyday, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: day of year[%d] =~ %s %s\n", test, xyday, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xmon) {
-			time_match = switch_number_cmp(xmon, tm.tm_mon + 1);
+			int test = tm.tm_mon + 1;
+			time_match = switch_number_cmp(xmon, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: month[%d] =~ %s %s\n", test, xmon, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xmday) {
-			time_match = switch_number_cmp(xmday, tm.tm_mday);
+			int test = tm.tm_mday;
+			time_match = switch_number_cmp(xmday, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: day of month[%d] =~ %s %s\n", test, xmday, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xweek) {
-			time_match = switch_number_cmp(xweek, (int) (tm.tm_yday + 1 / 7));
+			int test = (int) (tm.tm_yday + 1 / 7);
+			time_match = switch_number_cmp(xweek, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: week of year[%d] =~ %s %s\n", test, xweek, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xwday) {
-			time_match = switch_number_cmp(xwday, tm.tm_wday + 1);
+			int test = tm.tm_wday + 1;
+			time_match = switch_number_cmp(xwday, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: day of week[%d] =~ %s %s\n", test, xwday, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xhour) {
-			time_match = switch_number_cmp(xhour, tm.tm_hour);
+			int test = tm.tm_hour;
+			time_match = switch_number_cmp(xhour, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: hour[%d] =~ %s %s\n", test, xhour, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xminute) {
-			time_match = switch_number_cmp(xminute, tm.tm_min);
+			int test = tm.tm_min;
+			time_match = switch_number_cmp(xminute, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: minute[%d] =~ %s %s\n", test, xminute, time_match ? "PASS" : "FAIL");
 		}
 
 		if (time_match && xminday) {
-			time_match = switch_number_cmp(xminday, (tm.tm_hour * 60) + (tm.tm_min + 1));
+			int test = (tm.tm_hour * 60) + (tm.tm_min + 1);
+			time_match = switch_number_cmp(xminday, test);
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+							  "Dialplan: minute of day[%d] =~ %s %s\n", test, xminday, time_match ? "PASS" : "FAIL");
 		}
 		
 		field = (char *) switch_xml_attr(xcond, "field");
@@ -154,15 +182,15 @@
 			}
 		}
 
-		if (time_match == 0) {
-			if (do_break_i == BREAK_ON_FALSE || do_break_i == BREAK_ALWAYS) {
-				break;
-			} else if (do_break_i == BREAK_NEVER) {
-				continue;
-			} else {
-				proceed = 0;
-				goto done;
-			}
+		if (time_match == 1) {
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+					"Dialplan: %s Date/Time Match (PASS) [%s] break=%s\n",
+					switch_channel_get_name(channel), exten_name, do_break_a ? do_break_a : "on-false");
+			anti_action = SWITCH_FALSE;
+		} else if (time_match == 0) {
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+					"Dialplan: %s Date/Time Match (FAIL) [%s] break=%s\n",
+					switch_channel_get_name(channel), exten_name, do_break_a ? do_break_a : "on-false");
 		}
 
 		if (field) {
@@ -184,86 +212,83 @@
 				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, 
 								  "Dialplan: %s Regex (PASS) [%s] %s(%s) =~ /%s/ break=%s\n", 
 								  switch_channel_get_name(channel), exten_name, field, field_data, expression, do_break_a ? do_break_a : "on-false");
+				anti_action = SWITCH_FALSE;
 			} else {
 				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, 
 								  "Dialplan: %s Regex (FAIL) [%s] %s(%s) =~ /%s/ break=%s\n", 
 								  switch_channel_get_name(channel), exten_name, field, field_data, expression, do_break_a ? do_break_a : "on-false");
-				for (xaction = switch_xml_child(xcond, "anti-action"); xaction; xaction = xaction->next) {
-					char *application = (char *) switch_xml_attr_soft(xaction, "application");
-					char *data = (char *) switch_xml_attr_soft(xaction, "data");
-					
-					switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, 
-									  "Dialplan: %s ANTI-Action %s(%s)\n", 
-									  switch_channel_get_name(channel), application, data);
-					
-					if (!*extension) {
-						if ((*extension = switch_caller_extension_new(session, exten_name, caller_profile->destination_number)) == 0) {
-							switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n");
-							proceed = 0;
-							goto done;
-						}
-					}
-
-					switch_caller_extension_add_application(session, *extension, application, data);
-					proceed = 1;
-				}
-
-				if (do_break_i == BREAK_ON_FALSE || do_break_i == BREAK_ALWAYS) {
-					break;
-				} else {
-					continue;
-				}
 			}
-			assert(re != NULL);
-		} else {
+		} else if (time_match == -1) {
 			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, 
 							  "Dialplan: %s Absolute Condition [%s]\n", 
 							  switch_channel_get_name(channel), exten_name);
+			anti_action = SWITCH_FALSE;
 		}
 
-		for (xaction = switch_xml_child(xcond, "action"); xaction; xaction = xaction->next) {
-			char *application = (char *) switch_xml_attr_soft(xaction, "application");
-			char *data = NULL;
-			char *substituted = NULL;
-			uint32_t len = 0;
-			char *app_data = NULL;
+		if (anti_action) {
+			for (xaction = switch_xml_child(xcond, "anti-action"); xaction; xaction = xaction->next) {
+				char *application = (char *) switch_xml_attr_soft(xaction, "application");
+				char *data = (char *) switch_xml_attr_soft(xaction, "data");
 
-			if (!switch_strlen_zero(xaction->txt)) {
-				data = xaction->txt;
-			} else {
-				data = (char *) switch_xml_attr_soft(xaction, "data");
-			}
+				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG,
+						"Dialplan: %s ANTI-Action %s(%s)\n",
+						switch_channel_get_name(channel), application, data);
 
-			if (field && strchr(expression, '(')) {
-				len = (uint32_t) (strlen(data) + strlen(field_data) + 10) * proceed;
-				if (!(substituted = malloc(len))) {
-					switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n");
-					proceed = 0;
-					goto done;
+				if (!*extension) {
+					if ((*extension = switch_caller_extension_new(session, exten_name, caller_profile->destination_number)) == 0) {
+						switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n");
+						proceed = 0;
+						goto done;
+					}
 				}
-				memset(substituted, 0, len);
-				switch_perform_substitution(re, proceed, data, field_data, substituted, len, ovector);
-				app_data = substituted;
-			} else {
-				app_data = data;
+
+				switch_caller_extension_add_application(session, *extension, application, data);
+				proceed = 1;
 			}
+		} else {
+			for (xaction = switch_xml_child(xcond, "action"); xaction; xaction = xaction->next) {
+				char *application = (char *) switch_xml_attr_soft(xaction, "application");
+				char *data = NULL;
+				char *substituted = NULL;
+				uint32_t len = 0;
+				char *app_data = NULL;
 
-			if (!*extension) {
-				if ((*extension = switch_caller_extension_new(session, exten_name, caller_profile->destination_number)) == 0) {
-					switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n");
-					proceed = 0;
-					goto done;
+				if (!switch_strlen_zero(xaction->txt)) {
+					data = xaction->txt;
+				} else {
+					data = (char *) switch_xml_attr_soft(xaction, "data");
 				}
-			}
 
-			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, 
-							  "Dialplan: %s Action %s(%s)\n", 
-							  switch_channel_get_name(channel), application, app_data);
+				if (field && strchr(expression, '(')) {
+					len = (uint32_t) (strlen(data) + strlen(field_data) + 10) * proceed;
+					if (!(substituted = malloc(len))) {
+						switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n");
+						proceed = 0;
+						goto done;
+					}
+					memset(substituted, 0, len);
+					switch_perform_substitution(re, proceed, data, field_data, substituted, len, ovector);
+					app_data = substituted;
+				} else {
+					app_data = data;
+				}
 
-			switch_caller_extension_add_application(session, *extension, application, app_data);
-			switch_safe_free(substituted);
+				if (!*extension) {
+					if ((*extension = switch_caller_extension_new(session, exten_name, caller_profile->destination_number)) == 0) {
+						switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n");
+						proceed = 0;
+						goto done;
+					}
+				}
+
+				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, 
+						"Dialplan: %s Action %s(%s)\n", 
+						switch_channel_get_name(channel), application, app_data);
+
+				switch_caller_extension_add_application(session, *extension, application, app_data);
+				switch_safe_free(substituted);
+			}
 		}
-
 		switch_regex_safe_free(re);
 
 		if (do_break_i == BREAK_ON_TRUE || do_break_i == BREAK_ALWAYS) {
@@ -272,6 +297,7 @@
 	}
 
   done:
+	switch_regex_safe_free(re);
 	switch_safe_free(field_expanded);
 	switch_safe_free(expression_expanded);
 	return proceed;