[Freeswitch-svn] [commit] r12447 - in freeswitch/trunk/src: . include

FreeSWITCH SVN mrene at freeswitch.org
Wed Mar 4 21:32:50 PST 2009


Author: mrene
Date: Wed Mar  4 23:32:50 2009
New Revision: 12447

Log:
update

Modified:
   freeswitch/trunk/src/include/switch_xml_config.h
   freeswitch/trunk/src/switch_xml_config.c

Modified: freeswitch/trunk/src/include/switch_xml_config.h
==============================================================================
--- freeswitch/trunk/src/include/switch_xml_config.h	(original)
+++ freeswitch/trunk/src/include/switch_xml_config.h	Wed Mar  4 23:32:50 2009
@@ -60,7 +60,7 @@
 struct switch_xml_config_item;
 typedef struct switch_xml_config_item switch_xml_config_item_t;
 
-typedef switch_status_t (*switch_xml_config_callback_t)(switch_xml_config_item_t *data);
+typedef switch_status_t (*switch_xml_config_callback_t)(switch_xml_config_item_t *data, switch_bool_t changed);
 
 /*!
  * \brief A configuration instruction read by switch_xml_config_parse 
@@ -72,7 +72,8 @@
 	void *ptr;						/*< Ptr to the var to be changed */
 	void *defaultvalue; 			/*< Default value */
 	void *data; 					/*< Custom data (depending on the type) */
-	switch_xml_config_callback_t function;	/*< Callback (for type CUSTOM) */
+	switch_xml_config_callback_t function;	/*< Callback to be called after the var is parsed */
+	void *functiondata;				/*< Custom data passed to the callback */
 } ;
 
 

Modified: freeswitch/trunk/src/switch_xml_config.c
==============================================================================
--- freeswitch/trunk/src/switch_xml_config.c	(original)
+++ freeswitch/trunk/src/switch_xml_config.c	Wed Mar  4 23:32:50 2009
@@ -52,6 +52,8 @@
 	
 	for (item = instructions; item->key; item++) {
 		const char *value = switch_event_get_header(event, item->key);
+		switch_bool_t changed = SWITCH_FALSE;
+		switch_xml_config_callback_t callback = (switch_xml_config_callback_t)item->function;
 		
 		if (reload && !item->reloadable) {
 			continue;
@@ -61,45 +63,53 @@
 			case SWITCH_CONFIG_INT:
 				{
 					int *dest = (int*)item->ptr;
+					int intval;
 					if (value) {
 						if (switch_is_number(value)) {
-							*dest = atoi(value);
+							intval = atoi(value);
 						} else {
-							switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid value [%s] for parameter [%s]\n", 
-								value, item->key);
-							*dest = (int)(intptr_t)item->defaultvalue;
+							intval = (int)(intptr_t)item->defaultvalue;
+							switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid value [%s] for parameter [%s] setting default [%d]\n", 
+								value, item->key, intval);
 						}
 					} else {
-						*dest = (int)(intptr_t)item->defaultvalue;
+						intval = (int)(intptr_t)item->defaultvalue;
+					}
+					
+					if (*dest != intval) {
+						*dest = intval;
+						changed = SWITCH_TRUE;
 					}
 				}
 				break;
 			case SWITCH_CONFIG_STRING:
 				{
 					switch_xml_config_string_options_t *string_options = (switch_xml_config_string_options_t*)item->data;
+					const char *newstring = NULL;
 					if (string_options->length > 0) {
 						/* We have a preallocated buffer */
 						char *dest = (char*)item->ptr;
 						if (value) {
-							switch_copy_string(dest, value, string_options->length);
-						} else if (item->defaultvalue){
-							switch_copy_string(dest, item->defaultvalue, string_options->length);
+							newstring = value;
+						} else if (item->defaultvalue) {
+							newstring = item->defaultvalue;
+						}
+						
+						if (newstring && strncasecmp(dest, newstring, string_options->length)) {
+							switch_copy_string(dest, newstring, string_options->length);
 						}
 					} else {
 						char **dest = (char**)item->ptr;
-						if (string_options->pool) {
-							if (value) {
-								*dest = switch_core_strdup(string_options->pool, value);
-							} else if (item->defaultvalue) {
-								*dest = switch_core_strdup(string_options->pool, (char*)item->defaultvalue);
-							}
-						} else {
-							switch_safe_free(*dest); /* Free the destination if its not NULL */
-							if (value) {
-								*dest = strdup(value);
-							} else if(item->defaultvalue) {
-								*dest = strdup((char*)item->defaultvalue);
+						const char *newstring = value ? value : (char*)item->defaultvalue;
+						
+						if (newstring && strcasecmp(*dest, newstring)) {
+							if (string_options->pool) {
+								*dest = switch_core_strdup(string_options->pool, newstring);
+							} else {
+								switch_safe_free(*dest);
+								*dest = strdup(newstring);
 							}
+							changed = SWITCH_TRUE;								
 						}
 					}
 				}
@@ -107,38 +117,41 @@
 			case SWITCH_CONFIG_YESNO:
 				{
 					switch_bool_t *dest = (switch_bool_t*)item->ptr;
-					if (value) {
-						*dest = !!switch_true(value);
-					} else {
-						*dest = (switch_bool_t)(intptr_t)item->defaultvalue;
+					switch_bool_t newval = value ?  !!switch_true(value) : (switch_bool_t)(intptr_t)item->defaultvalue;
+					
+					if (*dest != newval) {
+						*dest = newval;
+						changed = SWITCH_TRUE;
 					}
 				}
 				break;
 			case SWITCH_CONFIG_CUSTOM: 
-				{	
-					switch_xml_config_callback_t callback = (switch_xml_config_callback_t)item->function;
-					callback(item);
-				}
 				break;
 			case SWITCH_CONFIG_ENUM:
 				{
 					switch_xml_config_enum_item_t *enum_options = (switch_xml_config_enum_item_t*)item->data;
 					int *dest = (int*)item->ptr;
+					int newval;
 					
 					if (value) {
 						for (;enum_options->key; enum_options++) {
 							if (!strcasecmp(value, enum_options->key)) {
-								*dest = enum_options->value;
+								newval = enum_options->value;
 								break;
 							}
 						}
-					
-						if (!enum_options->key) { /* if (!found) */
-							switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid value [%s] for parameter [%s]\n", 
-								value, item->key);
-						}
 					} else {
-						*dest = (int)(intptr_t)item->defaultvalue;
+						newval = (int)(intptr_t)item->defaultvalue; 
+					}
+					
+					if (!enum_options->key) { /* if (!found) */
+						newval = (int)(intptr_t)item->defaultvalue;
+						switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid value [%s] for parameter [%s]\n",  value, item->key);
+					}
+					
+					if (*dest != newval) {
+						changed = SWITCH_TRUE;
+						*dest = newval;
 					}
 				}
 				break;
@@ -146,14 +159,18 @@
 				{
 					int32_t *dest = (int32_t*)item->ptr;
 					int index = (int)(intptr_t)item->data;
+					int8_t currentval = !!(*dest & index);
+					int8_t newval = 0;
+					
 					if (value) {
-						if (switch_true(value)) {
-							*dest |= (1 << index);
-						} else {
-							*dest &= ~(1 << index);
-						}
+						newval = switch_true(value);
 					} else {
-						if ((switch_bool_t)(intptr_t)item->defaultvalue) {
+						newval = (switch_bool_t)(intptr_t)item->defaultvalue;
+					}
+					
+					if (newval != currentval) {
+						changed = SWITCH_TRUE;
+						if (newval) {
 							*dest |= (1 << index);
 						} else {
 							*dest &= ~(1 << index);
@@ -165,15 +182,21 @@
 				{
 					int8_t *dest = (int8_t*)item->ptr;
 					int index = (int)(intptr_t)item->data;
-					if (value) {
-						dest[index] = !!switch_true(value);						
-					} else {
-						dest[index] = (int8_t)((intptr_t)item->defaultvalue);
+					int newval = value ? !!switch_true(value) : (int8_t)((intptr_t)item->defaultvalue);
+					if (dest[index] != newval) {
+						changed = SWITCH_TRUE;
+						dest[index] = newval;
 					}
 				}
 				break;
 			case SWITCH_CONFIG_LAST:
 				break;
+			default:
+				break;
+		}
+		
+		if (callback) {
+			callback(item, changed);
 		}
 	}
 	



More information about the Freeswitch-svn mailing list