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:
parent
a5002dd774
commit
19c5f35422
|
@ -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
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue