From 4f5975ae4c0db5e2498cdca63147c5cc08282dd5 Mon Sep 17 00:00:00 2001 From: Rupa Schomaker Date: Thu, 11 Feb 2010 23:31:03 +0000 Subject: [PATCH] MODAPP-339, plus fix heartbeat when doing b-leg billing git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16613 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- .../mod_nibblebill/mod_nibblebill.c | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/src/mod/applications/mod_nibblebill/mod_nibblebill.c b/src/mod/applications/mod_nibblebill/mod_nibblebill.c index 56d5ed2193..c5ca8bf038 100644 --- a/src/mod/applications/mod_nibblebill/mod_nibblebill.c +++ b/src/mod/applications/mod_nibblebill/mod_nibblebill.c @@ -27,6 +27,7 @@ * * Contributor(s): * Darren Schreiber + * Rupa Schomaker * * mod_nibblebill.c - Nibble Billing * Purpose is to allow real-time debiting of credit or cash from a database while calls are in progress. I had the following goals: @@ -800,6 +801,24 @@ SWITCH_STANDARD_API(nibblebill_api_function) static switch_status_t sched_billing(switch_core_session_t *session) { + switch_channel_t *channel = NULL; + + const char *billrate = NULL; + const char *billaccount = NULL; + + if (!(channel = switch_core_session_get_channel(session))) { + return SWITCH_STATUS_SUCCESS; + } + + /* Variables kept in FS but relevant only to this module */ + billrate = switch_channel_get_variable(channel, "nibble_rate"); + billaccount = switch_channel_get_variable(channel, "nibble_account"); + + /* Return if there's no billing information on this session */ + if (!billrate || !billaccount) { + return SWITCH_STATUS_SUCCESS; + } + if (globals.global_heartbeat > 0) { switch_core_session_enable_heartbeat(session, globals.global_heartbeat); } @@ -811,28 +830,44 @@ static switch_status_t sched_billing(switch_core_session_t *session) static switch_status_t process_hangup(switch_core_session_t *session) { + const char* billaccount; + switch_channel_t *channel = NULL; + + channel = switch_core_session_get_channel(session); + /* Resume any paused billings, just in case */ - // nibblebill_resume(session); + /* nibblebill_resume(session); */ /* Now go handle like normal billing */ do_billing(session); + billaccount = switch_channel_get_variable(channel, "nibble_account"); + if (billaccount) { + switch_channel_set_variable_printf(channel, "nibble_current_balance", "%f", get_balance(billaccount)); + } + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t process_and_sched(switch_core_session_t *session) { + process_hangup(session); + sched_billing(session); return SWITCH_STATUS_SUCCESS; } switch_state_handler_table_t nibble_state_handler = { /* on_init */ NULL, - /* on_routing */ process_hangup, - /* Need to add a check here for anything in their account before routing */ - /* on_execute */ sched_billing, - /* Turn on heartbeat for this session and do an initial account check */ - /* on_hangup */ process_hangup, - /* On hangup - most important place to go bill */ - /* on_exch_media */ sched_billing, + /* on_routing */ process_hangup, /* Need to add a check here for anything in their account before routing */ + /* on_execute */ sched_billing, /* Turn on heartbeat for this session and do an initial account check */ + /* on_hangup */ process_hangup, /* On hangup - most important place to go bill */ + /* on_exch_media */ process_and_sched, /* on_soft_exec */ NULL, - /* on_consume_med */ NULL, + /* on_consume_med */ process_and_sched, /* on_hibernate */ NULL, - /* on_reset */ NULL + /* on_reset */ NULL, + /* on_park */ NULL, + /* on_reporting */ process_hangup, /* force billing event on b-leg if we can */ + /* on_destroy */ NULL }; SWITCH_MODULE_LOAD_FUNCTION(mod_nibblebill_load)