[Freeswitch-svn] [commit] r4257 - in freeswitch/trunk/src: . include mod/languages/mod_spidermonkey

Freeswitch SVN anthm at freeswitch.org
Wed Feb 14 10:19:01 EST 2007


Author: anthm
Date: Wed Feb 14 10:19:01 2007
New Revision: 4257

Modified:
   freeswitch/trunk/src/include/switch_ivr.h
   freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
   freeswitch/trunk/src/switch_ivr.c

Log:
add new xml call detail function to the core and a way to use it from javascript

Modified: freeswitch/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_ivr.h	(original)
+++ freeswitch/trunk/src/include/switch_ivr.h	Wed Feb 14 10:19:01 2007
@@ -53,6 +53,15 @@
 
 
 /*!
+  \brief Generate an XML CDR report.
+  \param session the session to get the data from.
+  \param xml_cdr pointer to the xml_record
+  \return SWITCH_STATUS_SUCCESS if successful
+  \note on success the xml object must be freed
+*/
+SWITCH_DECLARE(switch_status_t) switch_ivr_generate_xml_cdr(switch_core_session_t *session, switch_xml_t *xml_cdr);
+
+/*!
   \brief Parse command from an event
   \param session the session to send the message to
   \param event the event to send

Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c	(original)
+++ freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c	Wed Feb 14 10:19:01 2007
@@ -1340,6 +1340,27 @@
 	return JS_TRUE;
 }
 
+
+static JSBool session_cdr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	struct js_session *jss = JS_GetPrivate(cx, obj);
+	switch_xml_t cdr;
+
+	/*Always a pessimist... sheesh!*/
+	*rval = BOOLEAN_TO_JSVAL( JS_FALSE );
+
+    if (switch_ivr_generate_xml_cdr(jss->session, &cdr) == SWITCH_STATUS_SUCCESS) {
+		char *xml_text;
+		if ((xml_text = switch_xml_toxml(cdr))) {
+			*rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, xml_text));
+		}
+		switch_safe_free(xml_text);
+		switch_xml_free(cdr);
+	}
+
+	return JS_TRUE;
+}
+
 static JSBool session_ready(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	struct js_session *jss = JS_GetPrivate(cx, obj);
@@ -1716,6 +1737,7 @@
 	{"getVariable", session_get_variable, 1}, 
 	{"getDigits", session_get_digits, 1},
 	{"answer", session_answer, 0}, 
+	{"generateXmlCdr", session_cdr, 0}, 
 	{"ready", session_ready, 0}, 
 	{"waitForAnswer", session_wait_for_answer, 0}, 
 	{"waitForMedia", session_wait_for_media, 0}, 

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Wed Feb 14 10:19:01 2007
@@ -4833,6 +4833,217 @@
 }
 
 
+static int set_profile_data(switch_xml_t xml, switch_caller_profile_t *caller_profile, int off)
+{
+	switch_xml_t param;
+
+	if (!(param = switch_xml_add_child_d(xml, "username", off++))) {
+		return -1;
+	}
+	switch_xml_set_txt(param, caller_profile->username);
+
+	if (!(param = switch_xml_add_child_d(xml, "dialplan", off++))) {
+		return -1;
+	}
+	switch_xml_set_txt(param, caller_profile->dialplan);
+
+	if (!(param = switch_xml_add_child_d(xml, "caller_id_name", off++))) {
+		return -1;
+	}
+	switch_xml_set_txt(param, caller_profile->caller_id_name);
+
+    if (!(param = switch_xml_add_child_d(xml, "ani", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->ani);
+
+    if (!(param = switch_xml_add_child_d(xml, "aniii", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->aniii);
+
+    if (!(param = switch_xml_add_child_d(xml, "caller_id_number", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->caller_id_number);
+
+    if (!(param = switch_xml_add_child_d(xml, "network_addr", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->network_addr);
+
+    if (!(param = switch_xml_add_child_d(xml, "rdnis", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->rdnis);
+
+    if (!(param = switch_xml_add_child_d(xml, "destination_number", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->destination_number);
+
+    if (!(param = switch_xml_add_child_d(xml, "uuid", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->uuid);
+
+    if (!(param = switch_xml_add_child_d(xml, "source", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->source);
+
+    if (!(param = switch_xml_add_child_d(xml, "context", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->context);
+
+    if (!(param = switch_xml_add_child_d(xml, "chan_name", off++))) {
+        return -1;
+    }
+    switch_xml_set_txt(param, caller_profile->chan_name);
+
+	return 0;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_generate_xml_cdr(switch_core_session_t *session, switch_xml_t *xml_cdr)
+{
+	switch_channel_t *channel;
+	switch_caller_profile_t *caller_profile;
+	switch_hash_index_t *hi;
+	void *vval;
+	const void *vvar;
+	switch_xml_t variable,
+		variables,
+		cdr,
+		x_caller_profile,
+		x_caller_extension,
+		x_times,
+		x_application,
+		x_callflow;
+	char tmp[512];
+	int cdr_off = 0, v_off = 0;
+
+	channel = switch_core_session_get_channel(session);
+    assert(channel != NULL);
+
+	if (!(cdr = switch_xml_new("cdr"))) {
+        return SWITCH_STATUS_SUCCESS;
+    }
+
+	if (!(variables = switch_xml_add_child_d(cdr, "variables", cdr_off++))) {
+		goto error;
+	}
+	
+	for (hi = switch_channel_variable_first(channel, switch_core_session_get_pool(session)); hi; hi = switch_hash_next(hi)) {
+		switch_hash_this(hi, &vvar, NULL, &vval);
+		if (vvar && vval) {
+			if ((variable = switch_xml_add_child_d(variables, (char *) vvar, v_off++))) {
+				char *data;
+				char *value = (char *) vval;
+				switch_size_t dlen = strlen(value) * 3;
+
+				if ((data = switch_core_session_alloc(session, dlen))) {
+					switch_url_encode(value, data, dlen);					
+					switch_xml_set_txt_d(variable, data);
+				}
+			}
+		}
+	}
+
+	caller_profile = switch_channel_get_caller_profile(channel);
+	
+	while (caller_profile) {
+		int cf_off = 0;
+		
+		if (!(x_callflow = switch_xml_add_child_d(cdr, "callflow", cdr_off++))) {
+			goto error;
+		}
+		
+		if (caller_profile->caller_extension) {
+			switch_caller_application_t *ap;
+			
+			if (!(x_caller_extension = switch_xml_add_child_d(x_callflow, "extension", cf_off++))) {
+				goto error;
+			}
+			switch_xml_set_attr_d(x_caller_extension, "name", caller_profile->caller_extension->extension_name);
+			switch_xml_set_attr_d(x_caller_extension, "number", caller_profile->caller_extension->extension_number);
+			if (caller_profile->caller_extension->current_application) {
+				switch_xml_set_attr_d(x_caller_extension, "current_app", caller_profile->caller_extension->current_application->application_name);
+			}
+
+			for(ap = caller_profile->caller_extension->applications; ap; ap = ap->next) {
+				if (!(x_application = switch_xml_add_child_d(x_callflow, "application", cf_off++))) {
+					goto error;
+				}
+				switch_xml_set_attr_d(x_application, "app_name", ap->application_name);
+				switch_xml_set_attr_d(x_application, "app_data", ap->application_data);
+			}
+		}
+		
+		if (!(x_caller_profile = switch_xml_add_child_d(x_callflow, "caller_profile", cf_off++))) {
+			goto error;
+		}
+		set_profile_data(x_caller_profile, caller_profile, 0);
+
+		if (caller_profile->originator_caller_profile) {
+			if (!(x_caller_profile = switch_xml_add_child_d(x_callflow, "originator_caller_profile", cf_off++))) {
+				goto error;
+			}
+			set_profile_data(x_caller_profile, caller_profile->originator_caller_profile, 0);
+		}
+
+		if (caller_profile->originatee_caller_profile) {
+			if (!(x_caller_profile = switch_xml_add_child_d(x_callflow, "originatee_caller_profile", cf_off++))) {
+				goto error;
+			}
+			set_profile_data(x_caller_profile, caller_profile->originatee_caller_profile, 0);
+		}
+
+
+		if (caller_profile->times) {
+			if (!(x_times = switch_xml_add_child_d(x_callflow, "created_time", cf_off++))) {
+				goto error;
+			}
+			snprintf(tmp, sizeof(tmp), "%"APR_TIME_T_FMT, caller_profile->times->created);
+			switch_xml_set_txt_d(x_times, tmp);
+
+			if (!(x_times = switch_xml_add_child_d(x_callflow, "answered_time", cf_off++))) {
+				goto error;
+			}
+			snprintf(tmp, sizeof(tmp), "%"APR_TIME_T_FMT, caller_profile->times->answered);
+			switch_xml_set_txt_d(x_times, tmp);
+
+			if (!(x_times = switch_xml_add_child_d(x_callflow, "hangup_time", cf_off++))) {
+				goto error;
+			}
+			snprintf(tmp, sizeof(tmp), "%"APR_TIME_T_FMT, caller_profile->times->hungup);
+			switch_xml_set_txt_d(x_times, tmp);
+
+			if (!(x_times = switch_xml_add_child_d(x_callflow, "transfer_time", cf_off++))) {
+				goto error;
+			}
+			snprintf(tmp, sizeof(tmp), "%"APR_TIME_T_FMT, caller_profile->times->transferred);
+			switch_xml_set_txt_d(x_times, tmp);
+		}
+
+		caller_profile = caller_profile->next;
+	}
+
+	*xml_cdr = cdr;
+	
+	return SWITCH_STATUS_SUCCESS;	
+
+ error:
+
+	if (cdr) {
+		switch_xml_free(cdr);
+	}
+	
+	return SWITCH_STATUS_FALSE;
+}
+
+
+
 /* For Emacs:
  * Local Variables:
  * mode:c



More information about the Freeswitch-svn mailing list