[Freeswitch-svn] [commit] r4994 - in freeswitch/trunk/src: . include include/private mod/languages/mod_spidermonkey
Freeswitch SVN
anthm at freeswitch.org
Fri Apr 20 21:03:59 EDT 2007
Author: anthm
Date: Fri Apr 20 21:03:58 2007
New Revision: 4994
Modified:
freeswitch/trunk/src/include/private/switch_core.h
freeswitch/trunk/src/include/switch_caller.h
freeswitch/trunk/src/include/switch_core.h
freeswitch/trunk/src/include/switch_types.h
freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
freeswitch/trunk/src/switch_core_session.c
freeswitch/trunk/src/switch_core_state_machine.c
freeswitch/trunk/src/switch_ivr.c
freeswitch/trunk/src/switch_ivr_menu.c
freeswitch/trunk/src/switch_ivr_originate.c
Log:
add app log
Modified: freeswitch/trunk/src/include/private/switch_core.h
==============================================================================
--- freeswitch/trunk/src/include/private/switch_core.h (original)
+++ freeswitch/trunk/src/include/private/switch_core.h Fri Apr 20 21:03:58 2007
@@ -126,6 +126,7 @@
switch_queue_t *private_event_queue;
switch_thread_rwlock_t *bug_rwlock;
switch_media_bug_t *bugs;
+ switch_app_log_t *app_log;
};
struct switch_media_bug {
Modified: freeswitch/trunk/src/include/switch_caller.h
==============================================================================
--- freeswitch/trunk/src/include/switch_caller.h (original)
+++ freeswitch/trunk/src/include/switch_caller.h Fri Apr 20 21:03:58 2007
@@ -117,6 +117,7 @@
switch_caller_application_t *last_application;
/*! Pointer to the entire stack of applications for this extension */
switch_caller_application_t *applications;
+ struct switch_caller_profile *children;
struct switch_caller_extension *next;
};
Modified: freeswitch/trunk/src/include/switch_core.h
==============================================================================
--- freeswitch/trunk/src/include/switch_core.h (original)
+++ freeswitch/trunk/src/include/switch_core.h Fri Apr 20 21:03:58 2007
@@ -43,7 +43,7 @@
SWITCH_BEGIN_EXTERN_C
#define SWITCH_MAX_CORE_THREAD_SESSION_OBJS 128
#define SWITCH_MAX_STREAMS 128
- struct switch_core_time_duration {
+struct switch_core_time_duration {
uint32_t mms;
uint32_t ms;
uint32_t sec;
@@ -53,6 +53,12 @@
uint32_t yr;
};
+struct switch_app_log {
+ char *app;
+ char *arg;
+ struct switch_app_log *next;
+};
+
/*! \brief A message object designed to allow unlike technologies to exchange data */
struct switch_core_session_message {
/*! uuid of the sender (for replies) */
@@ -565,6 +571,9 @@
*/
SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t **event);
+SWITCH_DECLARE(switch_app_log_t *) switch_core_session_get_app_log(switch_core_session_t *session);
+SWITCH_DECLARE(switch_status_t) switch_core_session_exec(switch_core_session_t *session,
+ const switch_application_interface_t *application_interface, char *arg);
SWITCH_DECLARE(switch_status_t) switch_core_session_execute_exten(switch_core_session_t *session, char *exten, char *dialplan, char *context);
/*!
Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h (original)
+++ freeswitch/trunk/src/include/switch_types.h Fri Apr 20 21:03:58 2007
@@ -954,6 +954,7 @@
typedef uint16_t switch_port_t;
typedef uint8_t switch_payload_t;
+typedef struct switch_app_log switch_app_log_t;
typedef struct switch_rtp switch_rtp_t;
typedef struct switch_core_session_message switch_core_session_message_t;
typedef struct switch_event_header switch_event_header_t;
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 Fri Apr 20 21:03:58 2007
@@ -1615,7 +1615,7 @@
if ((application_interface = switch_loadable_module_get_application_interface(app_name))) {
if (application_interface->application_function) {
saveDepth = JS_SuspendRequest(cx);
- application_interface->application_function(jss->session, app_arg);
+ switch_core_session_exec(jss->session, application_interface, app_arg);
JS_ResumeRequest(cx, saveDepth);
retval = JS_TRUE;
}
Modified: freeswitch/trunk/src/switch_core_session.c
==============================================================================
--- freeswitch/trunk/src/switch_core_session.c (original)
+++ freeswitch/trunk/src/switch_core_session.c Fri Apr 20 21:03:58 2007
@@ -873,19 +873,48 @@
}
+SWITCH_DECLARE(switch_app_log_t *) switch_core_session_get_app_log(switch_core_session_t *session)
+{
+ return session->app_log;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_core_session_exec(switch_core_session_t *session,
+ const switch_application_interface_t *application_interface, char *arg) {
+ switch_app_log_t *log, *lp;
+
+ log = switch_core_session_alloc(session, sizeof(*log));
+
+ assert(log != NULL);
+
+ log->app = switch_core_session_strdup(session, application_interface->interface_name);
+ log->arg = switch_core_session_strdup(session, arg);
+
+ for(lp = session->app_log; lp && lp->next; lp = lp->next);
+
+ if (lp) {
+ lp->next = log;
+ } else {
+ session->app_log = log;
+ }
+
+ application_interface->application_function(session, arg);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
SWITCH_DECLARE(switch_status_t) switch_core_session_execute_exten(switch_core_session_t *session, char *exten, char *dialplan, char *context)
{
char *dp[25];
char *dpstr;
int argc, x, count = 0;
char *expanded = NULL;
- switch_caller_profile_t *profile, *new_profile;
+ switch_caller_profile_t *profile, *new_profile, *pp;
switch_channel_t *channel;
switch_dialplan_interface_t *dialplan_interface = NULL;
switch_caller_extension_t *extension = NULL;
const switch_application_interface_t *application_interface;
switch_event_t *event;
-
+
channel = switch_core_session_get_channel(session);
if (!(profile = switch_channel_get_caller_profile(channel))) {
@@ -922,7 +951,7 @@
}
count++;
-
+
if ((extension = dialplan_interface->hunt_function(session, dparg, new_profile)) != 0) {
break;
}
@@ -932,6 +961,16 @@
return SWITCH_STATUS_FALSE;
}
+ new_profile->caller_extension = extension;
+
+ for(pp = profile->caller_extension->children; pp && pp->next; pp = pp->next);
+
+ if (pp) {
+ pp->next = new_profile;
+ } else {
+ profile->caller_extension->children = new_profile;
+ }
+
while (switch_channel_ready(channel) && extension->current_application) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Execute %s(%s)\n",
extension->current_application->application_name, switch_str_nil(extension->current_application->application_data));
@@ -975,7 +1014,7 @@
}
}
- application_interface->application_function(session, expanded);
+ switch_core_session_exec(session, application_interface, expanded);
if (expanded != extension->current_application->application_data) {
switch_safe_free(expanded);
Modified: freeswitch/trunk/src/switch_core_state_machine.c
==============================================================================
--- freeswitch/trunk/src/switch_core_state_machine.c (original)
+++ freeswitch/trunk/src/switch_core_state_machine.c Fri Apr 20 21:03:58 2007
@@ -165,8 +165,8 @@
switch_safe_free(arg);
}
}
-
- application_interface->application_function(session, expanded);
+ switch_core_session_exec(session, application_interface, expanded);
+ //application_interface->application_function(session, expanded);
if (expanded != extension->current_application->application_data) {
switch_safe_free(expanded);
Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c (original)
+++ freeswitch/trunk/src/switch_ivr.c Fri Apr 20 21:03:58 2007
@@ -303,7 +303,7 @@
int x;
switch_channel_set_flag(channel, CF_BROADCAST);
for (x = 0; x < loops || loops < 0; x++) {
- application_interface->application_function(session, app_arg);
+ switch_core_session_exec(session, application_interface, app_arg);
if (!switch_channel_test_flag(channel, CF_BROADCAST)) {
break;
}
@@ -1224,7 +1224,10 @@
switch_hash_index_t *hi;
void *vval;
const void *vvar;
- switch_xml_t variable, variables, cdr, x_caller_profile, x_caller_extension, x_times, time_tag, x_application, x_callflow;
+ switch_xml_t variable, variables, cdr, x_caller_profile, x_caller_extension, x_times, time_tag,
+ x_application, x_callflow, x_inner_extension, x_apps;
+ switch_app_log_t *app_log;
+
char tmp[512];
int cdr_off = 0, v_off = 0;
@@ -1239,6 +1242,24 @@
goto error;
}
+ if ((app_log = switch_core_session_get_app_log(session))) {
+ int app_off = 0;
+ switch_app_log_t *ap;
+
+ if (!(x_apps = switch_xml_add_child_d(cdr, "app_log", cdr_off++))) {
+ goto error;
+ }
+ for(ap = app_log; ap; ap = ap->next) {
+
+ if (!(x_application = switch_xml_add_child_d(x_apps, "application", app_off++))) {
+ goto error;
+ }
+
+ switch_xml_set_attr_d(x_application, "app_name", ap->app);
+ switch_xml_set_attr_d(x_application, "app_data", ap->arg);
+ }
+ }
+
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) {
@@ -1263,6 +1284,7 @@
if (!(x_callflow = switch_xml_add_child_d(cdr, "callflow", cdr_off++))) {
goto error;
}
+ switch_xml_set_attr_d(x_callflow, "dialplan", caller_profile->dialplan);
if (caller_profile->caller_extension) {
switch_caller_application_t *ap;
@@ -1287,8 +1309,47 @@
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 (caller_profile->caller_extension->children) {
+ switch_caller_profile_t *cp = NULL;
+ int i_off = 0;
+ for (cp = caller_profile->caller_extension->children; cp; cp = cp->next) {
+ switch_caller_application_t *ap;
+ int app_off = 0;
+
+ if (!cp->caller_extension) {
+ continue;
+ }
+ if (!(x_inner_extension = switch_xml_add_child_d(x_caller_extension, "sub_extensions", i_off++))) {
+ goto error;
+ }
+
+ if (!(x_caller_extension = switch_xml_add_child_d(x_inner_extension, "extension", cf_off++))) {
+ goto error;
+ }
+ switch_xml_set_attr_d(x_caller_extension, "name", cp->caller_extension->extension_name);
+ switch_xml_set_attr_d(x_caller_extension, "number", cp->caller_extension->extension_number);
+ switch_xml_set_attr_d(x_caller_extension, "dialplan", cp->dialplan);
+ if (cp->caller_extension->current_application) {
+ switch_xml_set_attr_d(x_caller_extension, "current_app", cp->caller_extension->current_application->application_name);
+ }
+
+ for (ap = cp->caller_extension->applications; ap; ap = ap->next) {
+ if (!(x_application = switch_xml_add_child_d(x_caller_extension, "application", app_off++))) {
+ goto error;
+ }
+ if (ap == cp->caller_extension->current_application) {
+ switch_xml_set_attr_d(x_application, "last_executed", "true");
+ }
+ 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;
}
@@ -1342,6 +1403,9 @@
caller_profile = caller_profile->next;
}
+
+
+
*xml_cdr = cdr;
return SWITCH_STATUS_SUCCESS;
Modified: freeswitch/trunk/src/switch_ivr_menu.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_menu.c (original)
+++ freeswitch/trunk/src/switch_ivr_menu.c Fri Apr 20 21:03:58 2007
@@ -397,7 +397,7 @@
if (app_name && app_arg) {
if ((application_interface = switch_loadable_module_get_application_interface(app_name))) {
if (application_interface->application_function) {
- application_interface->application_function(session, app_arg);
+ switch_core_session_exec(session, application_interface, app_arg);
}
}
}
Modified: freeswitch/trunk/src/switch_ivr_originate.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_originate.c (original)
+++ freeswitch/trunk/src/switch_ivr_originate.c Fri Apr 20 21:03:58 2007
@@ -107,7 +107,8 @@
goto wbreak;
}
- application_interface->application_function(collect->session, app_data);
+ switch_core_session_exec(collect->session, application_interface, app_data);
+
if (switch_channel_get_state(channel) < CS_HANGUP) {
switch_channel_set_flag(channel, CF_WINNER);
}
More information about the Freeswitch-svn
mailing list