Added more flexible timer check method in Channel.

git-svn-id: http://yate.null.ro/svn/yate/trunk@708 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2006-02-28 15:12:12 +00:00
parent 2e625f110d
commit 5bc59150e3
3 changed files with 37 additions and 1 deletions

View File

@ -512,6 +512,14 @@ void Channel::statusParams(String& str)
}
}
void Channel::checkTimers(Message& msg, const Time& tmr)
{
if (timeout() && (timeout() < tmr))
msgDrop(msg,"timeout");
else if (maxcall() && (maxcall() < tmr))
msgDrop(msg,"noanswer");
}
bool Channel::callPrerouted(Message& msg, bool handled)
{
status("prerouted");
@ -885,6 +893,7 @@ bool Driver::received(Message &msg, int id)
unlock();
if (!c)
break;
c->checkTimers(msg,t);
if (c->timeout() && (c->timeout() < t))
c->msgDrop(msg,"timeout");
else if (c->maxcall() && (c->maxcall() < t))

View File

@ -133,11 +133,14 @@ public:
virtual bool callRouted(Message& msg);
virtual bool msgRinging(Message& msg);
virtual bool msgAnswered(Message& msg);
virtual void checkTimers(Message& msg, const Time& tmr);
void startChannel(NamedList& params);
void addSource();
void addConsumer();
protected:
void setDuration(NamedList& params);
void localParams(String& str);
u_int64_t m_stopTime;
u_int64_t m_timeStart;
unsigned long m_timeRoute;
unsigned long m_timeRing;
@ -537,7 +540,7 @@ void AnalyzerCons::statusParams(String& str)
AnalyzerChan::AnalyzerChan(const String& type, bool outgoing, const char* window)
: Channel(__plugin,0,outgoing),
: Channel(__plugin,0,outgoing), m_stopTime(0),
m_timeStart(Time::now()), m_timeRoute(0), m_timeRing(0), m_timeAnswer(0),
m_window(window)
{
@ -591,6 +594,7 @@ bool AnalyzerChan::callRouted(Message& msg)
{
if (!m_timeRoute)
m_timeRoute = Time::now() - m_timeStart;
setDuration(msg);
return Channel::callRouted(msg);
}
@ -610,6 +614,14 @@ bool AnalyzerChan::msgAnswered(Message& msg)
return Channel::msgAnswered(msg);
}
void AnalyzerChan::checkTimers(Message& msg, const Time& tmr)
{
if (m_stopTime && (m_stopTime < tmr))
msgDrop(msg,"finished");
else
Channel::checkTimers(msg,tmr);
}
void AnalyzerChan::startChannel(NamedList& params)
{
Message* m = message("chan.startup");
@ -629,6 +641,14 @@ void AnalyzerChan::startChannel(NamedList& params)
addConsumer();
addSource();
}
setDuration(params);
}
void AnalyzerChan::setDuration(NamedList& params)
{
int t = params.getIntValue("duration",120000);
if (t > 0)
m_stopTime = Time::now() + 1000 * (uint64_t)t;
}
void AnalyzerChan::addSource()

View File

@ -1276,6 +1276,13 @@ public:
*/
virtual void msgStatus(Message& msg);
/**
* Timer check method, by default handles channel timeouts
* @param msg Timer message
* @param tmr Current time against which timers are compared
*/
virtual void checkTimers(Message& msg, const Time& tmr);
/**
* Notification on progress of prerouting incoming call
* @param msg Notification call.preroute message just after being dispatched