/* * statusacct.cxx * * accounting module for GNU Gatekeeper for the status port. * * Copyright (c) 2005, Jan Willamowius * * This work is published under the GNU Public License (GPL) * see file COPYING for details. * We also explicitely grant the right to link this code * with the OpenH323 library. * * $Log: statusacct.cxx,v $ * Revision 1.2.4.1 2006/06/21 13:23:56 willamowius * compile fix for gcc 3.3.1 on Solaris, shutdown fix for MacOSX and OpenBSD * * Revision 1.3 2006/06/19 22:06:58 willamowius * compile fix for gcc 3.3.1 on Solaris * * Revision 1.2 2006/04/14 13:56:19 willamowius * call failover code merged * * Revision 1.1.1.1 2005/11/21 20:19:58 willamowius * * * Revision 1.4 2005/11/15 19:52:56 jan * Michal v1 (works, but on in routed, not proxy mode) * * Revision 1.1 2005/08/28 18:05:55 willamowius * new accounting module StatusAcct * * */ #if (_MSC_VER >= 1200) #pragma warning( disable : 4786 ) // warning about too long debug symbols off #endif #include #include #include "GkStatus.h" #include "statusacct.h" StatusAcct::StatusAcct( const char* moduleName, const char* cfgSecName ) : GkAcctLogger(moduleName, cfgSecName) { // it is very important to set what type of accounting events // are supported for each accounting module, otherwise the Log method // will no get called SetSupportedEvents(StatusAcctEvents); PConfig* cfg = GetConfig(); const PString& cfgSec = GetConfigSectionName(); m_timestampFormat = cfg->GetString(cfgSec, "TimestampFormat", ""); m_startEvent = cfg->GetString(cfgSec, "StartEvent", "CALL|Start|%{caller-ip}:%{caller-port}|%{callee-ip}:%{callee-port}|%{CallId}"); m_stopEvent = cfg->GetString(cfgSec, "StopEvent", "CALL|Stop|%{caller-ip}:%{caller-port}|%{callee-ip}:%{callee-port}|%{CallId}"); m_updateEvent = cfg->GetString(cfgSec, "UpdateEvent", "CALL|Update|%{caller-ip}:%{caller-port}|%{callee-ip}:%{callee-port}|%{CallId}"); m_connectEvent = cfg->GetString(cfgSec, "ConnectEvent", "CALL|Connect|%{caller-ip}:%{caller-port}|%{callee-ip}:%{callee-port}|%{CallId}"); } StatusAcct::~StatusAcct() { } GkAcctLogger::Status StatusAcct::Log( GkAcctLogger::AcctEvent evt, const callptr& call ) { // a workaround to prevent processing end on "sufficient" module // if it is not interested in this event type if ((evt & GetEnabledEvents() & GetSupportedEvents()) == 0) return Next; if (!call) { PTRACE(1,"STATUSACCT\t"< params; SetupAcctParams(params, call, m_timestampFormat); PString msg = ReplaceAcctParams(eventTmpl, params); GkStatus::Instance()->SignalStatus(msg + "\r\n", STATUS_TRACE_LEVEL_CDR); } return Ok; } PString StatusAcct::EscapeAcctParam(const PString& param) const { return "\"" + param + "\""; // test: quote } namespace { // append status port accounting logger to the global list of loggers GkAcctLoggerCreator StatusAcctCreator("StatusAcct"); }