[Freeswitch-svn] [commit] r1602 - in freeswitch/branches/mishehu/src/mod: endpoints/mod_portaudio loggers/mod_cdr
Author: mishehu Date: Mon Jun 12 01:12:25 2006 New Revision: 1602 Modified: freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.cpp freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.h freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.cpp freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.h freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema-update.mysql freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema.sql Log: Added in channel variable handling now. Code for handling it in BaseCDR, and AnthmCDR implements it. Merged to trunk r1601. Modified: freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c ============================================================================== --- freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c (original) +++ freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c Mon Jun 12 01:12:25 2006 @@ -886,7 +886,7 @@ void *val; int i = 0; - for (hi = apr_hash_first(module_pool, globals.call_hash); hi; hi = switch_hash_next(hi)) { + for (hi = switch_hash_first(module_pool, globals.call_hash); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, NULL, NULL, &val); tech_pvt = val; channel = switch_core_session_get_channel(tech_pvt->session); @@ -977,7 +977,7 @@ switch_hash_index_t *hi; void *val; if (!callid || !strcasecmp(callid, "all")) { - for (hi = apr_hash_first(module_pool, globals.call_hash); hi; hi = switch_hash_next(hi)) { + for (hi = switch_hash_first(module_pool, globals.call_hash); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, NULL, NULL, &val); tech_pvt = val; print_info(tech_pvt, stream); Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.cpp ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.cpp (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.cpp Mon Jun 12 01:12:25 2006 @@ -16,7 +16,7 @@ memset(formattedcallanswerdate,0,100); memset(formattedcallendate,0,100); - if(channel != 0) + if(newchannel != 0) { switch_time_exp_t tempcallstart, tempcallanswer, tempcallend; memset(&tempcallstart,0,sizeof(tempcallstart)); @@ -34,16 +34,24 @@ switch_strftime(formattedcallenddate,&retsizeced,sizeof(formattedcallenddate),format,&tempcallend); } - outputfile_name = outputfiile_path; + outputfile_name = outputfile_path; outputfile_name.append("/"); outputfile_name.append(myuuid); // The goal is to have a resulting filename of "/path/to/myuuid" outputfile_name.append(".atm"); // The extension is in honor of anthm outputfile.open(outputfile_name); + + process_channel_variables(chanvars_list,newchannel->channel); } -bool AnthmCDR::activated; -bool AnthmCDR::connectionstate; +AnthmCDR::~AnthmCDR() +{ + outputfile.close(); +} + +bool AnthmCDR::activated=0; +bool AnthmCDR::logchanvars=0; +bool AnthmCDR::connectionstate=0; std::string AnthmCDR::outputfile_path; std::list<std::string> AnthmCDR::chanvars_list; @@ -70,6 +78,11 @@ { std::string unparsed; unparsed = val; + if(unparsed.size() > 0) + { + chanvars_list = parse_channel_variables_xconfig(unparsed); + logchanvars=1; + }; } } @@ -82,11 +95,45 @@ { bool retval = 0; if(!outputfile) - switch_console_printf(SWITCH_CHANNEL_CONSOLE, "AnthmCDR::process_record(): Unable to open file %s to commit the call record to. Invalid path name, invalid permissions, or no space available?\n",outputfile_name.cstr()); + switch_console_printf(SWITCH_CHANNEL_CONSOLE, "AnthmCDR::process_record(): Unable to open file %s to commit the call record to. Invalid path name, invalid permissions, or no space available?\n",outputfile_name.c_str()); else { // Format the call record and proceed from here... - + outputfile << "$VAR1 = {" << std::endl; + outputfile << "\t\'callstartdate\' = \'" << callstartdate << "\'," << std::endl; + outputfile << "\t\'callanswerdate\' = " << callanswerdate << "\'," << std::endl; + outputfile << "\t\'callenddate\' = " << callenddate << "\'," << std::endl; + outputfile << "\t\'hangupcause\' = " << hangupcause_text << "\'," << std::endl; + outputfile << "\t\'hangupcausecode\' = " << hangcause << "\'," << std::endl; + outputfile << "\t\'clid\' = " << clid << "\'," << std::endl; + outputfile << "\t\'originated\' = " << originated << "\'," << std::endl; + outputfile << "\t\'dialplan\' = " << dialplan << "\'," << std::endl; + outputfile << "\t\'myuuid\' = " << myuuid << "\'," << std::endl; + outputfile << "\t\'destuuid\' = " << destuuid << "\'," << std::endl; + outputfile << "\t\'src\' = " << src << "\'," << std::endl; + outputfile << "\t\'dst\' = " << dst << "\'," << std::endl; + outputfile << "\t\'srcchannel\' = " << srcchannel << "\'," << std::endl; + outputfile << "\t\'dstchannel\' = " << dstchannel << "\'," << std::endl; + outputfile << "\t\'ani\' = " << ani << "\'," << std::endl; + outputfile << "\t\'ani2\' = " << ani2 << "\'," << std::endl; + outputfile << "\t\'network_addr\' = " << network_addr << "\'," << std::endl; + outputfile << "\t\'lastapp\' = " << lastapp << "\'," << std::endl; + outputfile << "\t\'lastdata\' = " << lastdata << "\'," << std::endl; + outputfile << "\t\'billusec\' = " << billusec << "\'," << std::endl; + outputfile << "\t\'disposition\' = " << disposition << "\'," << std::endl; + outputfile << "\t\'amaflags\' = " << amaflags << "\'," << std::endl; + + // Now to process chanvars + outputfile << "\t\'chanvars\' => {" << std::endl; + if(chanvars.size() > 0 ) + { + std::map<std::string,std::string>::iterator iItr,iBeg,iEnd; + iBeg = chanvars.begin(); + iEnd = chanvars.end(); + for(iItr = iBeg; iItr != iEnd; iItr++) + outputfile << "\t\t\'" << iItr->first << "\' = \'" << iItr.second << "\'," << std::endl; + } + outputfile << "\t}," << std::endl << "};" << std::endl << std::endl; } } Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.h ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.h (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/anthmcdr.h Mon Jun 12 01:12:25 2006 @@ -5,6 +5,7 @@ // #include <fcntl.h> #include <iostream> #include <ofstream> +#include <list> #ifndef ANTHMCDR #define ANTHMCDR @@ -25,6 +26,7 @@ private: static bool activated; // Is this module activated? static bool connectionstate; // What is the status of the connection? + static bool logchanvars; static std::string outputfile_path; // The directory we'll dump these into static std::list<std::string> chanvars_list; // A list containing the list of chanvars to capture char formattedcallstartdate[100]; Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.cpp ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.cpp (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.cpp Mon Jun 12 01:12:25 2006 @@ -142,6 +142,68 @@ } -void BaseCDR::process_channel() +std::list<std::string>& BaseCDR::parse_channel_variables_xconfig(std::string& unparsed) { + std::list<std::string> stringlist; + std::string tempstring; + long j = 0; + for(std::string::size_type i = 0; j != -1; ) + { + j = string1.find(',',i); + if(j > 0) + { + tempstring = unparsed.substr(i,(j-i)); + stringlist.push(tempstring); + i =j+1; + } + else + { + tempstring = unparsed.substr(i); + stringlist.push(tempstring); + } + } + + // Now we need to clean up in case somebody put in a '*' and still left in other nonsense too + std::list<std::string>::iterator iBeg,iItr,iEnd; + iBeg = stringlist.begin(); + iEnd = stringlist.end(); + for(bool testvalue = 1; iItr = stringlist.begin(); iItr != iEnd && testvalue ; iItr++) + { + if(iItr == "*") + { + std::string tempstring = "*"; + stringlist.clear(); + stringlist.push(tempstring); + testvalue = 0; + } + } + return stringlist; +} + +void BaseCDR::process_channel_variables(const std::list<std::string>& stringlist, switch_channel_t *channel) +{ + if(stringlist.front() == "*") + { + switch_hash_index_t *hi; + char *var,*val; + + for (hi = switch_hash_first(0, channel->variables); hi; hi = switch_hash_next(hi)) + { + switch_hash_this(hi, &var, NULL, &val); + chanvars[*var] = *val; + } + } + else + { + std::list<std::string>::iterator iBeg,iItr,iEnd; + iBeg = stringlist.begin(); + iEnd = stringlist.end(); + + for(iItr = stringlist.begin(); iItr != iEnd; iItr++) + { + std::string tempstring = switch_channel_get_variable(channel,iItr->c_str()); + if(tempstring.size() > 0) + chanvars[*iItr] = tempstring; + } + } } Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.h ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.h (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/basecdr.h Mon Jun 12 01:12:25 2006 @@ -15,6 +15,8 @@ #ifdef __cplusplus #include <vector> +#include <list> +#include <queue> #include <switch.h> #include <sys/types.h> #include <sys/stat.h> @@ -44,8 +46,9 @@ virtual void tempdump_record() = 0; virtual void reread_tempdumped_records() = 0; protected: - void process_channel_variables(); - switch_channel_t *tempchannel; + std::list<std::string>& parse_channel_variables_xconfig(std::string& unparsed); + void process_channel_variables(const std::list<std::string>& stringlist,switch_channel_t *channel); + //switch_channel_t *tempchannel; switch_time_t callstartdate; switch_time_t callanswerdate; switch_time_t callenddate; @@ -68,6 +71,7 @@ switch_time_t billusec; // Yes, you heard me, we're measuring in microseconds int disposition; // Currently 0 = Busy/Unanswered, 1 = Answered int amaflags; + std::map<std::string,std::string> chanvars; /* This is what happens when you base the ideas off of Asterisk... you end up with an inconvenient asteriskism. char accountcode[20]; Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp Mon Jun 12 01:12:25 2006 @@ -31,10 +31,14 @@ } bool MysqlCDR::connectionstate = 0; +bool MysqlCDR::logchanvars = 0; +std::list<std::string> MysqlCDR::chanvars_list; bool MysqlCDR::activated = 0; char MysqlCDR::sql_query[1024] = ""; +char MysqlCDR::sql_query_chanvars[1024] = ""; MYSQL* MysqlCDR:: conn = 0; MYSQL_STMT* MysqlCDR::stmt=0; +MYSQL_STMT* MysqlCDR::stmt_chanvars=0; char MysqlCDR::hostname[255] = ""; char MysqlCDR::username[255] =""; char MysqlCDR::dbname[255] = ""; @@ -46,11 +50,11 @@ switch_console_printf(SWITCH_CHANNEL_CONSOLE, "MysqlCDR::connect() - Trying to connect to the server.\n"); activated = 0; // Set it as inactive initially connectionstate = 0; // Initialize it to false to show that we aren't yet connected. - char tmpsql_query[] = "INSERT INTO freeswitchcdr (callstartdate,callanswerdate,callenddate,originated,clid,src,dst,ani,ani2,dialplan,myuuid,destuuid,srcchannel,dstchannel,lastapp,lastdata,billusec,disposition,amaflags) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + char tmpsql_query[] = "INSERT INTO freeswitchcdr (callstartdate,callanswerdate,callenddate,originated,clid,src,dst,ani,ani2,dialplan,myuuid,destuuid,srcchannel,dstchannel,lastapp,lastdata,billusec,disposition,hangupcause,amaflags) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; memset(sql_query,0,1024); strncpy(sql_query,tmpsql_query,strlen(tmpsql_query)); - if ((*settings = switch_xml_child(*cfg, "anthmcdr"))) + if ((*settings = switch_xml_child(*cfg, "mysqlcdr"))) { for (param = switch_xml_child(*settings, "param"); *param; *param = (*param)->next) { @@ -65,6 +69,11 @@ strncpy(password,val,strlen(val)); else if(!strcmp(var,"dbname")) strncpy(dbname,val,strlen(val)); + else if(!strcmp(var,"chanvars") + { + logchanvars = 1; + + } } activated = 1; @@ -169,6 +178,7 @@ add_string_parameter(lastdata,lastdata_length,MYSQL_TYPE_VAR_STRING,0); add_parameter(billusec,MYSQL_TYPE_LONGLONG,0); add_parameter(disposition,MYSQL_TYPE_TINY,0); + add_parameter(hangupcause,MYSQL_TYPE_LONG,0); add_parameter(amaflags,MYSQL_TYPE_TINY,0); switch_console_printf(SWITCH_CHANNEL_CONSOLE, "MysqlCDR::process_record() - Trying to process, bindme has %d elements.\n",bindme.size()); Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h Mon Jun 12 01:12:25 2006 @@ -1,4 +1,5 @@ #include "baseregistry.h" +#include <list> #include <mysql.h> #ifndef MYSQLCDR @@ -20,9 +21,13 @@ private: static bool activated; static char sql_query[1024]; + static char sql_query_chanvars[1024]; static MYSQL *conn; static MYSQL_STMT *stmt; + static MYSQL_STMT *stmt_chanvars; static bool connectionstate; + static bool logchanvars; + static std::list<std::string> chanvars_list; static char hostname[255]; static char username[255]; static char dbname[255]; Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema-update.mysql ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema-update.mysql (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema-update.mysql Mon Jun 12 01:12:25 2006 @@ -1,2 +1,5 @@ ALTER TABLE freeswitchcdr modify callid bigint unsigned auto_increment; ALTER TABLE freeswitchcdr Engine=InnoDB; + +ALTER TABLE chanvars modify callid bigint unsigned auto_increment; +ALTER TABLE chanvars Engine=InnoDB; \ No newline at end of file Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema.sql ============================================================================== --- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema.sql (original) +++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/schema.sql Mon Jun 12 01:12:25 2006 @@ -18,6 +18,7 @@ lastdata varchar(255) default "", billusec bigint default 0, disposition tinyint default 0, /* 0 = Busy or Unanswered, 1 = Answered */ + hangupcause int default 0, amaflags tinyint default 0, /* This section not needed, because it was an old asteriskism. A chan_var table is to replace it perhaps. @@ -29,3 +30,11 @@ create index myuuid_index on freeswitchcdr (myuuid); create index destuuid_index on freeswitchcdr (destuuid); + +create table chanvars ( + callid bigint unsigned default 0, + varname varchar(80) NOT NULL, + varval varchar(255) NOT NULL +); + +create index callid_index on chanvars(callid); \ No newline at end of file
participants (1)
-
mishehuï¼ freeswitch.org