[Freeswitch-svn] [commit] r3509 - freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr
Freeswitch SVN
mishehu at freeswitch.org
Fri Dec 1 13:46:42 EST 2006
Author: mishehu
Date: Fri Dec 1 13:46:41 2006
New Revision: 3509
Modified:
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/README
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.cpp
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.h
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp
Log:
Fixed mod_cdr for changes to switch_channel_t effected by anthm today. Also added in the ability to manually pause and unpause the popping of BaseCDR objects from the queue.
Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/README
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/README (original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/README Fri Dec 1 13:46:41 2006
@@ -85,9 +85,14 @@
Q: What would an example configuration look like?
A: Here is an excerpt from the freeswitch XML configuration file:
+Q: What about one-legged calls, such as calls to voicemail or playback?
+A: With the current changes in place (as of 2006-12-01), the value of originated will always be set to 0, but destuuid will always be blank. This will provide you with a method to bill for specific applications and/or calls if you so desire.
+
Q: What happened to the ani2 field?
A: Oops, you caught us. The real name for is it aniii. You will need to update any database schemas or external handlers for this change.
+Example configuration:
+
<configuration name="mod_cdr.conf" description="CDR Configuration">
<pddcdr>
<param name="path" value="/work/temp/pddcdr"/>
Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.cpp (original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.cpp Fri Dec 1 13:46:41 2006
@@ -76,13 +76,17 @@
memset(aniii,0,80);
memset(lastapp,0,80);
memset(lastdata,0,255);
-
+
+ switch_channel_timetable_t *timetable;
+
coresession = newchannel->session;
- callstartdate= newchannel->timetable->created;
- callanswerdate = newchannel->timetable->answered;
- callenddate = newchannel->timetable->hungup;
+ timetable = switch_channel_get_timetable(newchannel->channel->caller_profile);
+ callstartdate= timetable->created;
+ callanswerdate = timetable->answered;
+ callenddate = timetable->hungup;
- if (newchannel->callerprofile) {
+ if (newchannel->callerprofile)
+ {
if(newchannel->callerprofile->caller_id_name != 0)
{
strncpy(clid,newchannel->callerprofile->caller_id_name,strlen(newchannel->callerprofile->caller_id_name));
@@ -104,34 +108,39 @@
if(newchannel->callerprofile->network_addr != 0)
strncpy(network_addr,newchannel->callerprofile->network_addr,strlen(newchannel->callerprofile->network_addr));
}
-
- originated = newchannel->originate;
-
- if(newchannel->originateprofile && newchannel->originateprofile->uuid != 0)
- strncpy(destuuid,newchannel->originateprofile->uuid,strlen(newchannel->originateprofile->uuid));
-
- // We still need to check if this is originated or not
- if(originated == 0)
+
+ switch_caller_profile_t *originateprofile = switch_channel_get_originator_caller_profile(newchannel->channel->callerprofile);
+
+ // Were we the receiver of the call?
+ if(originateprofile)
{
- if (newchannel->callerprofile) {
- if(newchannel->callerprofile->destination_number != 0)
+ originated = 0;
+ if(newchannel->originateprofile->uuid != 0)
+ strncpy(destuuid,originateprofile->uuid,strlen(originateprofile->uuid));
+ if(newchannel->callerprofile)
+ {
+ if(newchannel->callerprofile->destination_number)
strncpy(src,newchannel->callerprofile->destination_number,strlen(newchannel->callerprofile->destination_number));
if(newchannel->callerprofile->caller_id_number != 0)
strncpy(dst,newchannel->callerprofile->caller_id_number,strlen(newchannel->callerprofile->caller_id_number));
}
- if(newchannel->originateprofile && newchannel->originateprofile->chan_name != 0)
- strncpy(dstchannel,newchannel->originateprofile->chan_name,strlen(newchannel->originateprofile->chan_name));
}
else
{
- if (newchannel->callerprofile) {
- if(newchannel->callerprofile->caller_id_number != 0)
- strncpy(src,newchannel->callerprofile->caller_id_number,strlen(newchannel->callerprofile->caller_id_number));
- if(newchannel->callerprofile->destination_number != 0)
- strncpy(dst,newchannel->callerprofile->destination_number,strlen(newchannel->callerprofile->destination_number));
+ originateprofile = switch_channel_get_originatee_profile(newchannel->channel->callerprofile);
+ // Or were we maybe we were the caller?
+ if(originateprofile)
+ {
+ originated = 1;
+ if (newchannel->callerprofile) {
+ if(newchannel->callerprofile->caller_id_number != 0)
+ strncpy(src,newchannel->callerprofile->caller_id_number,strlen(newchannel->callerprofile->caller_id_number));
+ if(newchannel->callerprofile->destination_number != 0)
+ strncpy(dst,newchannel->callerprofile->destination_number,strlen(newchannel->callerprofile->destination_number));
+ }
+ if(originateprofile->chan_name != 0)
+ strncpy(dstchannel,newchannel->originateprofile->chan_name,strlen(newchannel->originateprofile->chan_name));
}
- if(newchannel->originateprofile && newchannel->originateprofile->chan_name != 0)
- strncpy(dstchannel,newchannel->originateprofile->chan_name,strlen(newchannel->originateprofile->chan_name));
}
strncpy(myuuid,newchannel->callerprofile->uuid,strlen(newchannel->callerprofile->uuid));
@@ -140,7 +149,7 @@
if(switch_channel_test_flag(newchannel->channel,CF_ANSWERED))
{
disposition=1;
- billusec = newchannel->timetable->hungup - newchannel->timetable->answered;
+ billusec = timetable->hungup - timetable->answered;
}
else
{
Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.h
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.h (original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/basecdr.h Fri Dec 1 13:46:41 2006
@@ -50,11 +50,11 @@
{
switch_core_session_t *session;
switch_channel_t *channel;
- switch_channel_timetable_t *timetable;
+ //switch_channel_timetable_t *timetable;
switch_caller_extension_t *callerextension;
switch_caller_profile_t *callerprofile;
- switch_caller_profile_t *originateprofile;
- bool originate;
+ //switch_caller_profile_t *originateprofile;
+ //bool originate;
};
enum switch_mod_cdr_sql_types_t { CDR_INTEGER,CDR_STRING,CDR_DECIMAL,CDR_DOUBLE,CDR_TINY };
Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp (original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp Fri Dec 1 13:46:41 2006
@@ -45,6 +45,8 @@
// Create the APR threadsafe queue, though I don't know if this is the current memory pool.
switch_queue_create(&cdrqueue,5224288, module_pool);
+ queue_paused = 0;
+
strcpy(configfile,"mod_cdr.conf");
switch_mod_cdr_newchannel_t *newchannel; // = new switch_mod_cdr_newchannel_t;
@@ -90,8 +92,14 @@
switch_console_printf(SWITCH_CHANNEL_LOG,"mod_cdr shutdown gracefully.");
}
-void CDRContainer::reload()
+void CDRContainer::reload(switch_stream_handle_t *stream)
{
+ // The queue can't be paused otherwise it will never be able to reload safely.
+ if(queue_paused)
+ {
+ stream->write_function(stream,"The queue is currently paused, resuming it.\n");
+ queue_resume(stream);
+ }
// Something tells me I still need to figure out what to do if there are items still in queue after reload that are no longer active in the configuration.
switch_queue_isempty(cdrqueue); // Waits for the queue to be empty
@@ -138,6 +146,31 @@
switch_console_printf(SWITCH_CHANNEL_LOG,"mod_cdr configuration reloaded.");
}
+void CDRContainer::queue_pause(switch_stream_handle_t *stream)
+{
+ if(queue_paused)
+ stream->write_function(stream,"Queue is already paused.\n");
+ else
+ {
+ queue_paused = 1;
+ switch_queue_blockpop(cdrqueue);
+ stream->write_function(stream,"CDR queue is now paused. Beware that this can waste resources the longer you keep it paused.\n");
+ }
+}
+
+void CDRContainer::queue_resume(switch_stream_handle_t *stream)
+{
+ if(!queue_paused)
+ stream->write_function(stream,"Queue is currently running, no need to resume it.\n");
+ else
+ {
+ queue_paused = 0;
+ switch_queue_unblockpop(cdrqueue);
+ stream->write_function(stream,"CDR queue has now resumed processing CDR records.\n");
+ }
+
+}
+
void CDRContainer::add_cdr(switch_core_session_t *session)
{
switch_mod_cdr_newchannel_t *newchannel = new switch_mod_cdr_newchannel_t;
@@ -146,60 +179,31 @@
newchannel->channel = switch_core_session_get_channel(session);
assert(newchannel->channel != 0);
+ // Need to fix this up a bit so that it reflects a change to switch_caller_profile_t
+ // switch_channel_t will contain caller_profile, and caller_profile will contain
+ // the originator and originatee profile
newchannel->session = session;
- newchannel->timetable = switch_channel_get_timetable(newchannel->channel);
+ //newchannel->timetable = switch_channel_get_timetable(newchannel->channel);
newchannel->callerextension = switch_channel_get_caller_extension(newchannel->channel);
newchannel->callerprofile = switch_channel_get_caller_profile(newchannel->channel);
- newchannel->originateprofile = switch_channel_get_originator_caller_profile(newchannel->channel);
+ //newchannel->originateprofile = switch_channel_get_originator_caller_profile(newchannel->channel);
BaseRegistry& registry(BaseRegistry::get());
for(BaseRegistry::iterator it = registry.active_begin(); it != registry.active_end(); ++it)
{
- /*
- First time it might be originator profile, or originatee. Second and
- after is always going to be originatee profile.
- */
-
basecdr_creator func = *it;
- if(newchannel->originateprofile != 0 )
+ do
{
BaseCDR* newloggerobject = func(newchannel);
switch_console_printf(SWITCH_CHANNEL_LOG,"Adding a new logger object to the queue.\n");
switch_queue_push(cdrqueue,newloggerobject);
-
- if(newchannel->timetable->next != 0)
- {
- newchannel->originateprofile = switch_channel_get_originatee_caller_profile(newchannel->channel);
- newchannel->originate = 1;
- }
- }
- else
- {
- newchannel->originateprofile = switch_channel_get_originatee_caller_profile(newchannel->channel);
- if(newchannel->originateprofile != 0)
- {
- newchannel->originate = 1;
-
- BaseCDR* newloggerobject = func(newchannel);
- switch_console_printf(SWITCH_CHANNEL_LOG,"Adding a new logger object to the queue.\n");
- switch_queue_push(cdrqueue,newloggerobject);
- }
- }
-
- while (newchannel->timetable->next != 0 && newchannel->callerextension->next != 0 && newchannel->callerprofile->next != 0 && newchannel->originateprofile->next != 0 )
- {
- newchannel->timetable = newchannel->timetable->next;
newchannel->callerprofile = newchannel->callerprofile->next;
newchannel->callerextension = newchannel->callerextension->next;
- newchannel->originateprofile = newchannel->originateprofile->next;
-
- BaseCDR* newloggerobject = func(newchannel);
- switch_console_printf(SWITCH_CHANNEL_LOG,"Adding a new logger object to the queue.\n");
- switch_queue_push(cdrqueue,newloggerobject);
- }
+ } while (newchannel->callerprofile && newchannel->callerextension);
+
}
-
+
delete newchannel;
}
Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h (original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h Fri Dec 1 13:46:41 2006
@@ -58,13 +58,16 @@
~CDRContainer();
void add_cdr(switch_core_session_t *session);
void process_records();
- void reload();
+ void reload(switch_stream_handle_t *stream);
+ void queue_pause(switch_stream_handle_t *stream);
+ void queue_resume(switch_stream_handle_t *stream);
protected:
private:
switch_xml_t cfg, xml, settings, param;
switch_queue_t *cdrqueue;
std::string tempfilepath;
char configfile[13];
+ bool queue_paused;
};
#ifdef __cplusplus
Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp (original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp Fri Dec 1 13:46:41 2006
@@ -64,6 +64,22 @@
/*.desc */ "Reload mod_cdr's configuration",
/*.function */ modcdr_reload,
/*.syntax */ "modcdr_reload",
+ /*.next */ &modcdr_queue_pause
+};
+
+static switch_api_interface_t modcdr_queue_pause = {
+ /*.interface_name */ "modcdr_queue_pause",
+ /*.desc */ "Manually pauses the popping of objects from the queue. (DANGER: Can suck your memory away rather quickly.)",
+ /*.function */ modcdr_queue_pause,
+ /*.syntax */ "modcdr_queue_pause",
+ /*.next */ &modcdr_queue_resume
+};
+
+static switch_api_interface_t modcdr_queue_resume = {
+ /*.interface_name */ "modcdr_queue_pause",
+ /*.desc */ "Manually resumes the popping of objects from the queue.",
+ /*.function */ modcdr_queue_resume,
+ /*.syntax */ "modcdr_queue_resume",
/*.next */ 0
};
@@ -117,9 +133,21 @@
static switch_status_t modcdr_reload(char *dest=0, switch_core_session_t *isession=0, switch_stream_handle_t *stream=0)
{
switch_thread_rwlock_wrlock(cdr_rwlock);
- newcdrcontainer->reload();
+ newcdrcontainer->reload(stream);
switch_thread_rwlock_unlock(cdr_rwlock);
stream->write_function(stream, "XML Reloaded and mod_cdr reloaded.\n");
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t modcdr_queue_pause(char *dest=0, switch_core_session_t *isession=0, switch_stream_handle_t *stream=0)
+{
+ newcdrcontainer->queue_pause(stream);
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t modcdr_queue_resume(char *dest=0, switch_core_session_t *isession=0, switch_stream_handle_t *stream=0)
+{
+ newcdrcontainer->queue_resume(stream);
return SWITCH_STATUS_SUCCESS;
}
More information about the Freeswitch-svn
mailing list