From 333d67ef4fdc0310f6db2b49093f8031175b3ece Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 22 Apr 2014 17:36:19 +0200 Subject: [PATCH] sip: Assign an MSC identity to a call For some usecases we have a list of identities and when selecting a route an unused identity/line needs to be used. Keep track of which lines/identities we are using. The code might release a line too early. There should probably be another call in Osmo.SIPCall to inform the code when the call has "terminated" in one way or another (busy, cancel, failure, remote hangup, local hangup, redirected, etc). Right now it could still happen than an identity remains used. --- src/call/SIPMTCall.st | 19 ++++++++++++++++++- src/sip/MSCSIPIdentity.st | 11 ++++++++++- src/sip/SIPIdentityManager.st | 4 ++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/call/SIPMTCall.st b/src/call/SIPMTCall.st index 5c648ba..5e33ea2 100644 --- a/src/call/SIPMTCall.st +++ b/src/call/SIPMTCall.st @@ -17,7 +17,7 @@ " Osmo.SIPCall subclass: SIPMTCall [ - | remoteLeg sdp_alert msc | + | remoteLeg sdp_alert msc mscIdentity | remoteLeg := aLeg. @@ -43,6 +48,7 @@ Osmo.SIPCall subclass: SIPMTCall [ clean up things." remoteLeg := nil. + self releaseMscIdentity. self terminate. ] @@ -50,6 +56,7 @@ Osmo.SIPCall subclass: SIPMTCall [ | newLeg | remoteLeg ifNil: [^self]. + self releaseMscIdentity. newLeg := msc selectRedirectFor: self to: aContact. remoteLeg changeRemoteLeg: newLeg. remoteLeg := nil. @@ -72,6 +79,11 @@ Osmo.SIPCall subclass: SIPMTCall [ self terminateRemote. ] + terminate [ + self releaseMscIdentity. + ^super terminate + ] + sessionNotification: aNot [ | code | "The session has some information. We will use it to tell @@ -86,6 +98,7 @@ Osmo.SIPCall subclass: SIPMTCall [ terminateRemote [ remoteLeg isNil ifFalse: [remoteLeg netTerminate. remoteLeg := nil]. + self releaseMscIdentity. ] sdp [ @@ -97,4 +110,8 @@ Osmo.SIPCall subclass: SIPMTCall [ ^ sdp_alert ] + + releaseMscIdentity [ + mscIdentity ifNotNil: [mscIdentity usedBy: nil. mscIdentity := nil]. + ] ] diff --git a/src/sip/MSCSIPIdentity.st b/src/sip/MSCSIPIdentity.st index e8b8bbc..7eb9c0c 100644 --- a/src/sip/MSCSIPIdentity.st +++ b/src/sip/MSCSIPIdentity.st @@ -17,7 +17,7 @@ " Osmo.SIPIdentity subclass: MSCSIPIdentity [ - | available manager registerTimer | + | available manager registerTimer usedBy | @@ -81,4 +81,13 @@ Osmo.SIPIdentity subclass: MSCSIPIdentity [ isAvailable [ ^available ] + + usedBy: aCall [ + "A SIPCall is using this identity right now." + usedBy := aCall + ] + + isUnused [ + ^usedBy isNil + ] ] diff --git a/src/sip/SIPIdentityManager.st b/src/sip/SIPIdentityManager.st index d7021bf..907d192 100644 --- a/src/sip/SIPIdentityManager.st +++ b/src/sip/SIPIdentityManager.st @@ -59,4 +59,8 @@ Object subclass: SIPIdentityManager [ available [ ^identities select: [:each | each isAvailable] ] + + availableAndUnused [ + ^identities select: [:each | each isAvailable and: [each isUnused]] + ] ]