From 561b0cb63488f387cc1b63779af28d80791026e6 Mon Sep 17 00:00:00 2001 From: paulc Date: Tue, 15 Aug 2006 13:51:46 +0000 Subject: [PATCH] Use features of newer libpri if available. git-svn-id: http://voip.null.ro/svn/yate@995 acf43c95-373e-0410-b603-e72c3f656dc1 --- modules/libypri.cpp | 58 ++++++++++++++++++++++++++++++++++++++------- modules/libypri.h | 3 +++ 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/modules/libypri.cpp b/modules/libypri.cpp index 0ac3e540..3255bda0 100644 --- a/modules/libypri.cpp +++ b/modules/libypri.cpp @@ -761,6 +761,32 @@ void PriChan::closeData() m_span->unlock(); } +bool PriChan::progress() +{ + if (!m_call) { + Debug(this,DebugWarn,"Progress request on %s channel %s (%s)", + chanStatus(),id().c_str(),address().c_str()); + return false; + } + Debug(this,DebugInfo,"Progressing on %s (%s)",id().c_str(),address().c_str()); +#ifdef PRI_PROGRESS + ::pri_progress(m_span->pri(),m_call,m_chan,1); +#endif + return true; +} + +bool PriChan::ringing() +{ + if (!m_call) { + Debug(this,DebugWarn,"Ringing request on %s channel %s (%s)", + chanStatus(),id().c_str(),address().c_str()); + return false; + } + Debug(this,DebugInfo,"Answering on %s (%s)",id().c_str(),address().c_str()); + ::pri_acknowledge(m_span->pri(),m_call,m_chan,1); + return true; +} + bool PriChan::answer() { if (!m_ring) { @@ -772,7 +798,7 @@ bool PriChan::answer() m_timeout = 0; status(chanStatus()); Debug(this,DebugInfo,"Answering on %s (%s)",id().c_str(),address().c_str()); - ::pri_answer(m_span->pri(),(q931_call*)m_call,m_chan,!m_isdn); + ::pri_answer(m_span->pri(),m_call,m_chan,!m_isdn); return true; } @@ -795,8 +821,8 @@ void PriChan::hangup(int cause) closeData(); m_ring = false; if (m_call) { - ::pri_hangup(m_span->pri(),(q931_call*)m_call,cause); - ::pri_destroycall(m_span->pri(),(q931_call*)m_call); + ::pri_hangup(m_span->pri(),m_call,cause); + ::pri_destroycall(m_span->pri(),m_call); m_call = 0; Message *m = message("chan.hangup"); m->addParam("span",String(m_span->span())); @@ -846,7 +872,7 @@ void PriChan::gotDigits(const char *digits, bool overlapped) void PriChan::sendDigit(char digit) { if (m_call) - ::pri_information(m_span->pri(),(q931_call*)m_call,digit); + ::pri_information(m_span->pri(),m_call,digit); } bool PriChan::call(Message &msg, const char *called) @@ -906,7 +932,7 @@ bool PriChan::call(Message &msg, const char *called) ::pri_sr_set_called(req,(char *)called,calledplan,complete); ::q931_setup(span()->pri(),m_call,req); #else - ::pri_call(m_span->pri(),(q931_call*)m_call,0/*transmode*/,m_chan,1/*exclusive*/,!m_isdn, + ::pri_call(m_span->pri(),m_call,0/*transmode*/,m_chan,1/*exclusive*/,!m_isdn, caller,callerplan,callername,callerpres,(char *)called,calledplan,layer1 ); #endif @@ -939,7 +965,12 @@ void PriChan::ring(pri_event_ring &ev) m_call = call; m_ring = true; status(chanStatus()); +#ifdef PRI_PROCEEDING_FULL + ::pri_proceeding(m_span->pri(),m_call,m_chan,1); +#else + // we signal ringing without media if the library doesn't know any better ::pri_acknowledge(m_span->pri(),m_call,m_chan,0); +#endif Message *m = message("chan.startup"); m->addParam("span",String(m_span->span())); m->addParam("channel",String(m_chan)); @@ -1016,17 +1047,26 @@ void PriChan::callRejected(const char* error, const char* reason, const Message* hangup(cause); } +bool PriChan::msgProgress(Message& msg) +{ + if (!progress()) + return true; + return Channel::msgProgress(msg); +} + bool PriChan::msgRinging(Message& msg) { - status("ringing"); - return true; + if (!ringing()) + return true; + return Channel::msgRinging(msg); } bool PriChan::msgAnswered(Message& msg) { - answer(); + if (!answer()) + return true; dataChanged(); - return true; + return Channel::msgAnswered(msg); } bool PriChan::msgTone(Message& msg, const char* tone) diff --git a/modules/libypri.h b/modules/libypri.h index b9d1e1fd..3d3fc0b0 100644 --- a/modules/libypri.h +++ b/modules/libypri.h @@ -171,6 +171,7 @@ public: virtual ~PriChan(); virtual void disconnected(bool final, const char *reason); virtual bool nativeConnect(DataEndpoint *peer); + virtual bool msgProgress(Message& msg); virtual bool msgRinging(Message& msg); virtual bool msgAnswered(Message& msg); virtual bool msgTone(Message& msg, const char* tone); @@ -197,6 +198,8 @@ public: bool call(Message &msg, const char *called = 0); bool answer(); void answered(); + bool progress(); + bool ringing(); void idle(); void restart(bool outgoing = false); virtual bool openData(const char* format, int echoTaps = 0) = 0;