[Freeswitch-svn] [commit] r5560 - freeswitch/trunk/src/mod/xml_int/mod_xml_cdr

Freeswitch SVN mikej at freeswitch.org
Fri Aug 3 11:41:40 EDT 2007


Author: mikej
Date: Fri Aug  3 11:41:39 2007
New Revision: 5560

Modified:
   freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c

Log:
fix for MODAPP-11

Modified: freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
==============================================================================
--- freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c	(original)
+++ freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c	Fri Aug  3 11:41:39 2007
@@ -40,11 +40,22 @@
 	char *errLogDir;
 	uint32_t delay;
 	uint32_t retries;
+	uint32_t shutdown;
 } globals;
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_cdr_shutdown);
 SWITCH_MODULE_DEFINITION(mod_xml_cdr, mod_xml_cdr_load, NULL, NULL);
 
+/* this function would have access to the HTML returned by the webserver, we dont need it 
+ * and the default curl activity is to print to stdout, something not as desirable
+ * so we have a dummy function here
+ */
+static void httpCallBack()
+{
+	return;
+}
+
 static switch_status_t my_on_hangup(switch_core_session_t *session)
 {
 	switch_xml_t cdr;
@@ -57,6 +68,7 @@
 	char *curl_xml_text;
 	char *logdir;
 	switch_channel_t *channel = switch_core_session_get_channel(session);
+	int i;
 
 	if (switch_ivr_generate_xml_cdr(session, &cdr) == SWITCH_STATUS_SUCCESS) {
 
@@ -110,6 +122,7 @@
 			curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, curl_xml_text);
 			curl_easy_setopt(curl_handle, CURLOPT_URL, globals.url);
 			curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "freeswitch-xml/1.0");
+			curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, httpCallBack);
 
 			/* these were used for testing, optionally they may be enabled if someone desires
 			curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 120); // tcp timeout
@@ -120,7 +133,6 @@
 				curl_easy_perform(curl_handle);
 				curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE,&httpRes);
 				if(httpRes==200) {
-					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG XXX success posting\n");
 					curl_easy_cleanup(curl_handle);
 					free(curl_xml_text);
 					free(xml_text);
@@ -129,33 +141,40 @@
 					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Got error [%ld] posting to web server\n",httpRes);
 				}
 
-				/* bug?  feature?  we sleep even on the last failure before writing the file */
-				switch_sleep(globals.delay * 1000);
+				/* make sure we dont sleep on the last try */
+				for(i=0;i<globals.delay && (curTry != (globals.retries));i++) {
+					switch_sleep(1000);
+					if(globals.shutdown) {
+						/* we are shutting down so dont try to webpost any more */
+						i=globals.delay;
+						curTry=globals.retries;
+					}
+				}
+						
 			}
 			free(curl_xml_text);
 			curl_easy_cleanup(curl_handle);
-		}
 
-		/* if we are here the web post failed for some reason */
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to post to web server, writing to file\n");
+			/* if we are here the web post failed for some reason */
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to post to web server, writing to file\n");
 
-		if ((path = switch_mprintf("%s/%s.cdr.xml", globals.errLogDir, switch_core_session_get_uuid(session)))) {
-			if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
-				write(fd, xml_text, (unsigned) strlen(xml_text));
-				close(fd);
-				fd = -1;
-			} else {
-				char ebuf[512] = { 0 };
+			if ((path = switch_mprintf("%s/%s.cdr.xml", globals.errLogDir, switch_core_session_get_uuid(session)))) {
+				if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
+					write(fd, xml_text, (unsigned) strlen(xml_text));
+					close(fd);
+					fd = -1;
+				} else {
+					char ebuf[512] = { 0 };
 #ifdef WIN32
-				strerror_s(ebuf, sizeof(ebuf), errno);
+					strerror_s(ebuf, sizeof(ebuf), errno);
 #else
-				strerror_r(errno, ebuf, sizeof(ebuf));
+					strerror_r(errno, ebuf, sizeof(ebuf));
 #endif
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error![%s]\n", ebuf);
+					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error![%s]\n", ebuf);
+				}
+				free(path);
 			}
-			free(path);
 		}
-
 		free(xml_text);
 		switch_xml_free(cdr);
 	} else {
@@ -165,11 +184,30 @@
 	return SWITCH_STATUS_SUCCESS;
 }
 
-static switch_status_t do_config(void)
+
+static switch_state_handler_table_t state_handlers = {
+	/*.on_init */ NULL,
+	/*.on_ring */ NULL,
+	/*.on_execute */ NULL,
+	/*.on_hangup */ my_on_hangup,
+	/*.on_loopback */ NULL,
+	/*.on_transmit */ NULL
+};
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load)
 {
 	char *cf = "xml_cdr.conf";
 	switch_xml_t cfg, xml, settings, param;
 
+
+	/* test global state handlers */
+	switch_core_add_state_handler(&state_handlers);
+
+	*module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+	memset(&globals,0,sizeof(globals));
+
+	/* parse the config */
 	if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
 		return SWITCH_STATUS_TERM;
@@ -218,31 +256,20 @@
 		}
 	}
 
+
+	/* indicate that the module should continue to be loaded */
 	return SWITCH_STATUS_SUCCESS;
 }
 
-static switch_state_handler_table_t state_handlers = {
-	/*.on_init */ NULL,
-	/*.on_ring */ NULL,
-	/*.on_execute */ NULL,
-	/*.on_hangup */ my_on_hangup,
-	/*.on_loopback */ NULL,
-	/*.on_transmit */ NULL
-};
 
-SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load)
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_cdr_shutdown)
 {
-	/* test global state handlers */
-	switch_core_add_state_handler(&state_handlers);
-
-	*module_interface = switch_loadable_module_create_module_interface(pool, modname);
+	
+	globals.shutdown=1;
+    return SWITCH_STATUS_SUCCESS;
+}
 
-	memset(&globals,0,sizeof(globals));
-	do_config();
 
-	/* indicate that the module should continue to be loaded */
-	return SWITCH_STATUS_SUCCESS;
-}
 
 /* For Emacs:
  * Local Variables:



More information about the Freeswitch-svn mailing list