[Freeswitch-trunk] [commit] r12403 - in freeswitch/trunk/src: . include mod/event_handlers/mod_cdr_csv mod/event_handlers/mod_radius_cdr mod/xml_int/mod_xml_cdr
FreeSWITCH SVN
anthm at freeswitch.org
Tue Mar 3 20:19:34 PST 2009
Author: anthm
Date: Tue Mar 3 22:19:33 2009
New Revision: 12403
Log:
add new state for CDR and leg_delay_start originate var and fix FSCORE-315
Modified:
freeswitch/trunk/src/include/switch_module_interfaces.h
freeswitch/trunk/src/include/switch_types.h
freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
freeswitch/trunk/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c
freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
freeswitch/trunk/src/switch_channel.c
freeswitch/trunk/src/switch_core_state_machine.c
freeswitch/trunk/src/switch_ivr_originate.c
Modified: freeswitch/trunk/src/include/switch_module_interfaces.h
==============================================================================
--- freeswitch/trunk/src/include/switch_module_interfaces.h (original)
+++ freeswitch/trunk/src/include/switch_module_interfaces.h Tue Mar 3 22:19:33 2009
@@ -55,7 +55,8 @@
SWITCH_SHN_ON_CONSUME_MEDIA,
SWITCH_SHN_ON_HIBERNATE,
SWITCH_SHN_ON_RESET,
- SWITCH_SHN_ON_PARK
+ SWITCH_SHN_ON_PARK,
+ SWITCH_SHN_ON_REPORTING
} switch_state_handler_name_t;
struct switch_state_handler_table {
@@ -79,6 +80,8 @@
switch_state_handler_t on_reset;
/*! executed when the state changes to park */
switch_state_handler_t on_park;
+ /*! executed when the state changes to reporting */
+ switch_state_handler_t on_reporting;
void *padding[10];
};
Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h (original)
+++ freeswitch/trunk/src/include/switch_types.h Tue Mar 3 22:19:33 2009
@@ -753,17 +753,18 @@
\enum switch_channel_state_t
\brief Channel States (these are the defaults, CS_SOFT_EXECUTE, CS_EXCHANGE_MEDIA, and CS_CONSUME_MEDIA are often overridden by specific apps)
<pre>
-CS_NEW - Channel is newly created
-CS_INIT - Channel has been initilized
-CS_ROUTING - Channel is looking for an extension to execute
-CS_SOFT_EXECUTE - Channel is ready to execute from 3rd party control
-CS_EXECUTE - Channel is executing it's dialplan
+CS_NEW - Channel is newly created.
+CS_INIT - Channel has been initilized.
+CS_ROUTING - Channel is looking for an extension to execute.
+CS_SOFT_EXECUTE - Channel is ready to execute from 3rd party control.
+CS_EXECUTE - Channel is executing it's dialplan.
CS_EXCHANGE_MEDIA - Channel is exchanging media with another channel.
CS_PARK - Channel is accepting media awaiting commands.
CS_CONSUME_MEDIA - Channel is consuming all media and dropping it.
-CS_HIBERNATE - Channel is in a sleep state
-CS_RESET - Channel is in a reset state
-CS_HANGUP - Channel is flagged for hangup and ready to end
+CS_HIBERNATE - Channel is in a sleep state.
+CS_RESET - Channel is in a reset state.
+CS_HANGUP - Channel is flagged for hangup and ready to end.
+CS_HANGUP - Channel is ready to collect call detail.
CS_DONE - Channel is ready to be destroyed and out of the state machine
</pre>
*/
@@ -779,6 +780,7 @@
CS_HIBERNATE,
CS_RESET,
CS_HANGUP,
+ CS_REPORTING,
CS_DONE,
CS_NONE
} switch_channel_state_t;
@@ -851,6 +853,7 @@
CF_VERBOSE_EVENTS,
CF_PAUSE_BUGS,
CF_DIVERT_EVENTS,
+ CF_BLOCK_STATE,
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
CF_FLAG_MAX
} switch_channel_flag_t;
Modified: freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
==============================================================================
--- freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c (original)
+++ freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c Tue Mar 3 22:19:33 2009
@@ -165,7 +165,7 @@
switch_mutex_unlock(fd->mutex);
}
-static switch_status_t my_on_hangup(switch_core_session_t *session)
+static switch_status_t my_on_reporting(switch_core_session_t *session)
{
switch_channel_t *channel = switch_core_session_get_channel(session);
switch_status_t status = SWITCH_STATUS_SUCCESS;
@@ -286,9 +286,14 @@
/*.on_init */ NULL,
/*.on_routing */ NULL,
/*.on_execute */ NULL,
- /*.on_hangup */ my_on_hangup,
+ /*.on_hangup */ NULL,
/*.on_exchange_media */ NULL,
- /*.on_soft_execute */ NULL
+ /*.on_soft_execute */ NULL,
+ /*.on_consume_media*/ NULL,
+ /*.on_hibernate*/ NULL,
+ /*.on_reset*/ NULL,
+ /*.on_park*/ NULL,
+ /*.on_reporting*/ my_on_reporting
};
Modified: freeswitch/trunk/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c
==============================================================================
--- freeswitch/trunk/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c (original)
+++ freeswitch/trunk/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c Tue Mar 3 22:19:33 2009
@@ -371,7 +371,7 @@
return (retval);
}
-static switch_status_t my_on_hangup(switch_core_session_t *session)
+static switch_status_t my_on_reporting(switch_core_session_t *session)
{
switch_xml_t cdr;
switch_channel_t *channel = switch_core_session_get_channel(session);
@@ -406,7 +406,7 @@
switch_thread_rwlock_rdlock(globals.rwlock);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Entering my_on_hangup\n");
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Entering my_on_reporting\n");
rad_config = my_radius_init();
@@ -705,9 +705,14 @@
/*.on_init */ NULL,
/*.on_routing */ my_on_routing,
/*.on_execute */ NULL,
- /*.on_hangup */ my_on_hangup,
+ /*.on_hangup */ NULL,
/*.on_exchange_media */ NULL,
- /*.on_soft_execute */ NULL
+ /*.on_soft_execute */ NULL,
+ /*.on_consume_media*/ NULL,
+ /*.on_hibernate*/ NULL,
+ /*.on_reset*/ NULL,
+ /*.on_park*/ NULL,
+ /*.on_reporting*/ my_on_reporting
};
SWITCH_MODULE_LOAD_FUNCTION(mod_radius_cdr_load)
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 Tue Mar 3 22:19:33 2009
@@ -66,7 +66,7 @@
return size * nitems;
}
-static switch_status_t my_on_hangup(switch_core_session_t *session)
+static switch_status_t my_on_reporting(switch_core_session_t *session)
{
switch_xml_t cdr;
char *xml_text = NULL;
@@ -264,9 +264,14 @@
/*.on_init */ NULL,
/*.on_routing */ NULL,
/*.on_execute */ NULL,
- /*.on_hangup */ my_on_hangup,
+ /*.on_hangup */ NULL,
/*.on_exchange_media */ NULL,
- /*.on_soft_execute */ NULL
+ /*.on_soft_execute */ NULL,
+ /*.on_consume_media*/ NULL,
+ /*.on_hibernate*/ NULL,
+ /*.on_reset*/ NULL,
+ /*.on_park*/ NULL,
+ /*.on_reporting*/ my_on_reporting
};
SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load)
Modified: freeswitch/trunk/src/switch_channel.c
==============================================================================
--- freeswitch/trunk/src/switch_channel.c (original)
+++ freeswitch/trunk/src/switch_channel.c Tue Mar 3 22:19:33 2009
@@ -767,7 +767,7 @@
return SWITCH_STATUS_FALSE;
}
- if (!switch_channel_ready(channel)) {
+ if (switch_channel_down(channel)) {
return SWITCH_STATUS_FALSE;
}
@@ -925,6 +925,7 @@
"CS_HIBERNATE",
"CS_RESET",
"CS_HANGUP",
+ "CS_REPORTING",
"CS_DONE",
NULL
};
@@ -1177,6 +1178,16 @@
case CS_HANGUP:
switch (state) {
+ case CS_REPORTING:
+ case CS_DONE:
+ ok++;
+ default:
+ break;
+ }
+ break;
+
+ case CS_REPORTING:
+ switch (state) {
case CS_DONE:
ok++;
default:
@@ -1573,6 +1584,9 @@
const char *file, const char *func, int line, switch_call_cause_t hangup_cause)
{
switch_assert(channel != NULL);
+
+ switch_channel_clear_flag(channel, CF_BLOCK_STATE);
+
switch_mutex_lock(channel->state_mutex);
if (channel->caller_profile && channel->caller_profile->times && !channel->caller_profile->times->hungup) {
@@ -1609,6 +1623,7 @@
}
switch_mutex_unlock(channel->state_mutex);
+
return channel->state;
}
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 Tue Mar 3 22:19:33 2009
@@ -47,6 +47,13 @@
switch_channel_get_name(session->channel), switch_channel_cause2str(switch_channel_get_cause(session->channel)));
}
+static void switch_core_standard_on_reporting(switch_core_session_t *session)
+{
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Standard REPORTING, cause: %s\n",
+ switch_channel_get_name(session->channel), switch_channel_cause2str(switch_channel_get_cause(session->channel)));
+}
+
static void switch_core_standard_on_reset(switch_core_session_t *session)
{
@@ -373,28 +380,29 @@
switch_mutex_lock(session->mutex);
while ((state = switch_channel_get_state(session->channel)) != CS_DONE) {
+
+ switch_channel_wait_for_flag(session->channel, CF_BLOCK_STATE, SWITCH_FALSE, 0, NULL);
+
midstate = state;
- if (state != switch_channel_get_running_state(session->channel) || state == CS_HANGUP) {
+ if (state != switch_channel_get_running_state(session->channel) || state >= CS_HANGUP) {
int index = 0;
int proceed = 1;
int global_proceed = 1;
int do_extra_handlers = 1;
-
+
switch_channel_set_running_state(session->channel, state);
switch_channel_clear_flag(session->channel, CF_TRANSFER);
switch_channel_clear_flag(session->channel, CF_REDIRECT);
switch (state) {
- case CS_NEW: /* Just created, Waiting for first instructions */
+ case CS_NEW: /* Just created, Waiting for first instructions */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) State NEW\n", switch_channel_get_name(session->channel));
break;
case CS_DONE:
goto done;
- case CS_HANGUP: /* Deactivate and end the thread */
+ case CS_REPORTING: /* Call Detail */
{
const char *var = switch_channel_get_variable(session->channel, SWITCH_PROCESS_CDR_VARIABLE);
- const char *hook_var;
- switch_core_session_t *use_session = NULL;
if (!switch_strlen_zero(var)) {
if (!strcasecmp(var, "a_only")) {
@@ -410,6 +418,16 @@
}
}
+ STATE_MACRO(reporting, "REPORTING");
+
+ switch_channel_set_state(session->channel, CS_DONE);
+ }
+ goto done;
+ case CS_HANGUP: /* Deactivate and end the thread */
+ {
+ const char *hook_var;
+ switch_core_session_t *use_session = NULL;
+
switch_core_media_bug_remove_all(session);
STATE_MACRO(hangup, "HANGUP");
@@ -448,7 +466,8 @@
switch_safe_free(stream.data);
}
}
- goto done;
+ switch_channel_set_state(session->channel, CS_REPORTING);
+ break;
case CS_INIT: /* Basic setup tasks */
STATE_MACRO(init, "INIT");
break;
Modified: freeswitch/trunk/src/switch_ivr_originate.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_originate.c (original)
+++ freeswitch/trunk/src/switch_ivr_originate.c Tue Mar 3 22:19:33 2009
@@ -86,6 +86,7 @@
uint8_t answered;
uint32_t per_channel_timelimit_sec;
uint32_t per_channel_progress_timelimit_sec;
+ uint32_t per_channel_delay_start;
} originate_status_t;
@@ -177,7 +178,7 @@
goto wbreak;
}
- if (!switch_channel_ready(channel)) {
+ if (switch_channel_up(channel)) {
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
goto wbreak;
}
@@ -228,6 +229,11 @@
time_t elapsed = switch_epoch_time_now(NULL) - start;
for (i = 0; i < max; i++) {
+ if (originate_status[i].peer_channel && originate_status[i].per_channel_delay_start && elapsed > originate_status[i].per_channel_delay_start) {
+ switch_channel_clear_flag(originate_status[i].peer_channel, CF_BLOCK_STATE);
+ originate_status[i].per_channel_delay_start = 0;
+ }
+
if (originate_status[i].peer_channel && switch_channel_up(originate_status[i].peer_channel)) {
if (originate_status[i].per_channel_progress_timelimit_sec && elapsed > originate_status[i].per_channel_progress_timelimit_sec &&
!(
@@ -1493,6 +1499,15 @@
originate_status[i].per_channel_progress_timelimit_sec = (uint32_t) val;
}
}
+
+ if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "leg_delay_start"))) {
+ int val = atoi(vvar);
+ if (val > 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Setting leg delay start to %d\n",
+ switch_channel_get_name(originate_status[0].peer_channel), val);
+ originate_status[i].per_channel_delay_start = (uint32_t) val;
+ }
+ }
}
if (!table) {
@@ -1511,11 +1526,9 @@
}
if (!switch_core_session_running(originate_status[i].peer_session)) {
- /*if (!(flags & SOF_NOBLOCK)) {
- switch_channel_set_state(originate_status[i].peer_channel, CS_ROUTING);
- }
- } else {
- */
+ if (originate_status[i].per_channel_delay_start) {
+ switch_channel_set_flag(originate_status[i].peer_channel, CF_BLOCK_STATE);
+ }
switch_core_session_thread_launch(originate_status[i].peer_session);
}
}
@@ -1842,6 +1855,8 @@
continue;
}
+ switch_channel_clear_flag(originate_status[i].peer_channel, CF_BLOCK_STATE);
+
if (switch_channel_test_flag(originate_status[i].peer_channel, CF_TRANSFER)
|| switch_channel_test_flag(originate_status[i].peer_channel, CF_REDIRECT)
|| switch_channel_test_flag(originate_status[i].peer_channel, CF_BRIDGED) ||
@@ -1867,7 +1882,7 @@
}
}
}
- if (switch_channel_ready(originate_status[i].peer_channel)) {
+ if (switch_channel_up(originate_status[i].peer_channel)) {
if (caller_channel && i == 0) {
holding = switch_channel_get_variable(caller_channel, SWITCH_HOLDING_UUID_VARIABLE);
holding = switch_core_session_strdup(oglobals.session, holding);
More information about the Freeswitch-trunk
mailing list