Improved call detail by adding unique channels IDs and checking for the ID.

Direction of calls is added to the CDR data set and written to file.


git-svn-id: http://voip.null.ro/svn/yate@105 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2004-11-01 14:08:26 +00:00
parent 3d111c6881
commit 6ff2c10122
5 changed files with 42 additions and 6 deletions

View File

@ -73,6 +73,10 @@ CdrBuilder::CdrBuilder(const char *name, const char *caller, const char *called)
CdrBuilder::~CdrBuilder()
{
const char *dir = m_ring ?
(m_call ? "bidir" : "incoming") :
(m_call ? "outgoing" : "unknown");
if (!m_hangup)
m_hangup = Time::now();
if (!m_ring)
@ -87,6 +91,7 @@ CdrBuilder::~CdrBuilder()
Message *m = new Message("cdr");
m->addParam("time",String(sec(m_ring)));
m->addParam("chan",c_str());
m->addParam("direction",dir);
m->addParam("caller",m_caller);
m->addParam("called",m_called);
m->addParam("duration",String(sec(m_hangup - m_ring)));
@ -99,7 +104,7 @@ CdrBuilder::~CdrBuilder()
String CdrBuilder::getStatus() const
{
String s(m_status);
s << "/" << m_caller << "/" << m_called;
s << "|" << m_caller << "|" << m_called;
return s;
}
@ -151,6 +156,8 @@ bool CdrHandler::received(Message &msg)
id += msg.getValue("span");
id += "/";
id += msg.getValue("channel");
if (id == "//")
return false;
}
CdrBuilder *b = CdrBuilder::find(id);
if (!b && ((m_type == CdrRing) || (m_type == CdrCall))) {

View File

@ -48,8 +48,8 @@ bool CdrFileHandler::received(Message &msg)
Lock lock(m_lock);
if (m_file) {
const char *format = m_tabs
? "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n"
: "%s,\"%s\",\"%s\",\"%s\",%s,%s,%s,\"%s\"\n";
? "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n"
: "%s,\"%s\",\"%s\",\"%s\",%s,%s,%s,\"%s\",\"%s\"\n";
::fprintf(m_file,format,
c_safe(msg.getValue("time")),
c_safe(msg.getValue("chan")),
@ -58,7 +58,8 @@ bool CdrFileHandler::received(Message &msg)
c_safe(msg.getValue("billtime")),
c_safe(msg.getValue("ringtime")),
c_safe(msg.getValue("duration")),
c_safe(msg.getValue("status"))
c_safe(msg.getValue("status")),
c_safe(msg.getValue("direction"))
);
::fflush(m_file);
}

View File

@ -47,6 +47,11 @@ public:
ToneChan(const String &tone);
~ToneChan();
virtual void disconnected(const char *reason);
inline const String &id() const
{ return m_id; }
private:
String m_id;
static int s_nextid;
};
class ToneHandler : public MessageHandler
@ -194,11 +199,14 @@ void ToneSource::run()
m_time = 0;
}
int ToneChan::s_nextid = 1;
ToneChan::ToneChan(const String &tone)
: DataEndpoint("tone")
{
Debug(DebugAll,"ToneChan::ToneChan(\"%s\") [%p]",tone.c_str(),this);
mutex.lock();
m_id << "tone/" << s_nextid++;
chans.append(this);
mutex.unlock();
ToneSource *t = ToneSource::getTone(tone);
@ -212,7 +220,7 @@ ToneChan::ToneChan(const String &tone)
ToneChan::~ToneChan()
{
Debug(DebugAll,"ToneChan::~ToneChan() [%p]",this);
Debug(DebugAll,"ToneChan::~ToneChan() %s [%p]",m_id.c_str(),this);
mutex.lock();
chans.remove(this,false);
mutex.unlock();
@ -259,6 +267,7 @@ bool ToneHandler::received(Message &msg)
m.addParam("callto",m.retValue());
m.retValue() = 0;
ToneChan *tc = new ToneChan(dest.matchString(1).c_str());
m.setParam("id",tc->id());
m.userData(tc);
if (Engine::dispatch(m)) {
tc->deref();

View File

@ -60,6 +60,11 @@ public:
WaveChan(const String& file, bool record, unsigned maxlen = 0);
~WaveChan();
virtual void disconnected(const char *reason);
inline const String &id() const
{ return m_id; }
private:
String m_id;
static int s_nextid;
};
class WaveHandler : public MessageHandler
@ -234,10 +239,16 @@ void WaveConsumer::Consume(const DataBlock &data, unsigned long timeDelta)
}
}
Mutex mutex;
int WaveChan::s_nextid = 1;
WaveChan::WaveChan(const String& file, bool record, unsigned maxlen)
: DataEndpoint("wavefile")
{
Debug(DebugAll,"WaveChan::WaveChan(%s) [%p]",(record ? "record" : "play"),this);
mutex.lock();
m_id << "wave/" << s_nextid++;
mutex.unlock();
if (record) {
setConsumer(new WaveConsumer(file,this,maxlen));
getConsumer()->deref();
@ -250,7 +261,7 @@ WaveChan::WaveChan(const String& file, bool record, unsigned maxlen)
WaveChan::~WaveChan()
{
Debug(DebugAll,"WaveChan::~WaveChan() [%p]",this);
Debug(DebugAll,"WaveChan::~WaveChan() %s [%p]",m_id.c_str(),this);
}
void WaveChan::disconnected(const char *reason)
@ -309,6 +320,7 @@ bool WaveHandler::received(Message &msg)
m.addParam("callto",m.retValue());
m.retValue() = 0;
WaveChan *c = new WaveChan(dest.matchString(2),meth,maxlen);
m.setParam("id",c->id());
m.userData(c);
if (Engine::dispatch(m)) {
c->deref();

View File

@ -1063,6 +1063,7 @@ bool ZapChan::answer()
m->addParam("driver","zap");
m->addParam("span",String(m_span->span()));
m->addParam("channel",String(m_chan));
m->addParam("status","answered");
Engine::enqueue(m);
return true;
}
@ -1099,6 +1100,12 @@ void ZapChan::answered()
}
m_timeout = 0;
Output("Remote answered on zap/%d (%d/%d)",m_abschan,m_span->span(),m_chan);
Message *m = new Message("answer");
m->addParam("driver","zap");
m->addParam("span",String(m_span->span()));
m->addParam("channel",String(m_chan));
m->addParam("status","answered");
Engine::enqueue(m);
}
void ZapChan::sendDigit(char digit)