Added circuit events handling to call control and ISUP.

git-svn-id: http://voip.null.ro/svn/yate@1788 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
marian 2008-03-17 11:54:52 +00:00
parent a5002dd774
commit 19c5f35422
3 changed files with 71 additions and 1 deletions

View File

@ -1562,9 +1562,19 @@ SignallingEvent* SS7ISUPCall::getEvent(const Time& when)
default: ;
}
}
// Check circuit event
if (!m_lastEvent && m_circuit) {
SignallingCircuitEvent* cicEvent = m_circuit->getEvent(when);
if (cicEvent) {
if (isup())
m_lastEvent = isup()->processCircuitEvent(*cicEvent,this);
TelEngine::destruct(cicEvent);
}
}
if (m_lastEvent)
XDebug(isup(),DebugNote,"Call(%u). Raising event (%p,'%s') [%p]",
id(),m_lastEvent,m_lastEvent->name(),this);
return m_lastEvent;
}
@ -2586,6 +2596,25 @@ bool SS7ISUP::processMSU(SS7MsgISUP::Type type, unsigned int cic,
return true;
}
// Process an event received from a non-reserved circuit
SignallingEvent* SS7ISUP::processCircuitEvent(SignallingCircuitEvent& event,
SignallingCall* call)
{
switch (event.type()) {
case SignallingCircuitEvent::Alarm:
case SignallingCircuitEvent::NoAlarm:
if (event.circuit())
blockCircuit(event.circuit()->code(),
event.type()==SignallingCircuitEvent::Alarm,false);
break;
default:
Debug(this,DebugStub,"Unhandled circuit event (%u,%s) from call %p",
event.type(),event.c_str(),call);
}
return 0;
}
// Process call related messages
void SS7ISUP::processCallMsg(SS7MsgISUP* msg, const SS7Label& label, int sls)
{
@ -2821,6 +2850,8 @@ bool SS7ISUP::blockCircuit(unsigned int cic, bool block, bool remote)
reserveCircuit(newCircuit);
call->replaceCircuit(newCircuit);
}
if (!remote)
flag |= SignallingCircuit::LockLocalChanged;
if (block)
circuit->setLock(flag);
else

View File

@ -156,6 +156,25 @@ SignallingEvent* SignallingCallControl::getEvent(const Time& when)
return event;
lock();
}
// Get events from circuits not reserved
// TODO: Find a better way to parse circuit list to get events
if (m_circuits) {
Lock lock(m_circuits);
for (ObjList* o = m_circuits->circuits().skipNull(); o; o = o->skipNext()) {
SignallingCircuit* cic = static_cast<SignallingCircuit*>(o->get());
if (cic->status() == SignallingCircuit::Reserved)
continue;
SignallingCircuitEvent* ev = cic->getEvent(when);
if (!ev)
continue;
SignallingEvent* event = processCircuitEvent(*ev);
TelEngine::destruct(ev);
if (event) {
unlock();
return event;
}
}
}
// Terminate if exiting and no more calls
//TODO: Make sure we raise this event one time only
if (exiting() && !m_calls.skipNull())

View File

@ -786,6 +786,16 @@ protected:
virtual bool processEvent(SignallingEvent* event)
{ return false; }
/**
* Process an event received from a non-reserved circuit
* @param event The event
* @param call Optional signalling call whose circuit generated the event
* @return Signalling event pointer or 0
*/
virtual SignallingEvent* processCircuitEvent(SignallingCircuitEvent& event,
SignallingCall* call = 0)
{ return 0; }
/**
* Clear call list
*/
@ -1160,6 +1170,7 @@ public:
enum LockFlags {
LockLocal = 1,
LockRemote = 2,
LockLocalChanged = 4,
};
/**
@ -1395,7 +1406,7 @@ private:
class YSIG_API SignallingCircuitGroup : public SignallingComponent, public Mutex
{
friend class SignallingCircuit;
friend class SignallingCallControl;
public:
/**
* Circuit allocation strategy
@ -5101,6 +5112,15 @@ protected:
const unsigned char* paramPtr, unsigned int paramLen,
const SS7Label& label, SS7Layer3* network, int sls);
/**
* Process an event received from a non-reserved circuit
* @param event The event
* @param call Optional signalling call whose circuit generated the event
* @return Signalling event pointer or 0
*/
virtual SignallingEvent* processCircuitEvent(SignallingCircuitEvent& event,
SignallingCall* call = 0);
/**
* Length of the Circuit Identification Code in octets
*/