diff --git a/Start.st b/Start.st index c24b04f..29adb94 100644 --- a/Start.st +++ b/Start.st @@ -11,6 +11,7 @@ Eval [ fileIn: 'src/GSMMOCall.st'; fileIn: 'src/GSMLURequest.st'; fileIn: 'src/GSMCMServiceRequest.st'; + fileIn: 'src/GSMEmergencySetup.st'; fileIn: 'src/BSCIPAConnection.st'; fileIn: 'src/MSC.st'; fileIn: 'src/SIPCall.st'. diff --git a/package.xml b/package.xml index ae51d7e..74ec9e5 100644 --- a/package.xml +++ b/package.xml @@ -16,6 +16,7 @@ src/GSMCMServiceRequest.st src/GSMMOCall.st src/GSMLURequest.st + src/GSMEmergencySetup.st src/BSCIPAConnection.st src/MSC.st src/SIPCall.st diff --git a/src/GSMCMServiceRequest.st b/src/GSMCMServiceRequest.st index 8ad724c..11a2410 100644 --- a/src/GSMCMServiceRequest.st +++ b/src/GSMCMServiceRequest.st @@ -37,6 +37,21 @@ OsmoGSM.GSM48MSG extend [ ] ] +OsmoGSM.GSM48CCEmergencySetup extend [ + dispatchForCMOn: aCM [ + | call | + + + "Start the Emergency Call" + call := (GSMEmergencyCall on: 0 with: self ti) + con: aCM con; yourself. + aCM con openTransaction: call with: self. + + "The CMServiceRequest transaction can go away now." + ^ true + ] +] + GSMTransaction subclass: GSMCMServiceRequest [ | timeout service state | diff --git a/src/GSMEmergencySetup.st b/src/GSMEmergencySetup.st new file mode 100644 index 0000000..bdafacc --- /dev/null +++ b/src/GSMEmergencySetup.st @@ -0,0 +1,33 @@ +" + (C) 2012 by Holger Hans Peter Freyther + All Rights Reserved + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +" + +GSMMOCall subclass: GSMEmergencyCall [ + + + + selectAudioRoute: aCCMessage [ + "select route for this call, or release the call" + remoteLeg := con selectAudioRouteForEmergency: self. + remoteLeg isNil ifTrue: [ + self logError: + 'GSMEmergencyCall(srcref:%1) failed to select audio route.' + % {con srcRef} area: #bsc. + self releaseComplete. + ]. + ] +] diff --git a/src/GSMMOCall.st b/src/GSMMOCall.st index f01c627..426f116 100644 --- a/src/GSMMOCall.st +++ b/src/GSMMOCall.st @@ -244,9 +244,7 @@ GSMTransaction subclass: GSMMOCall [ con removeTransaction: self. ] - start: aCCMessage [ - - + selectAudioRoute: aCCMessage [ "select route for this call, or release the call" remoteLeg := con selectAudioRoute: aCCMessage calledOrDefault leg: self. remoteLeg isNil ifTrue: [ @@ -254,8 +252,14 @@ GSMTransaction subclass: GSMMOCall [ 'GSMMOCall(srcref:%1) failed to select audio route.' % {con srcRef} area: #bsc. self releaseComplete. - ^ self ]. + ] + + start: aCCMessage [ + + + self selectAudioRoute: aCCMessage. + remoteLeg isNil ifTrue: [^self]. "Failed to allocate an endpoint" con allocateEndpoint isNil ifTrue: [ diff --git a/src/GSMProcessor.st b/src/GSMProcessor.st index 1aa111c..401cb4d 100644 --- a/src/GSMProcessor.st +++ b/src/GSMProcessor.st @@ -99,6 +99,11 @@ GSM transaction on a given SAPI'> con := aCon. ] + con [ + + ^ con + ] + assignmentFailure [ "The audio assignment has failed." ] @@ -444,6 +449,12 @@ hosting various transactions and dispatching to them.'> ^ conManager msc mgcpCallAgent ] + selectAudioRouteForEmergency: aLeg [ + + ^ conManager msc + selectAudioRouteForEmergency: self leg: aLeg. + ] + selectAudioRoute: aPlan leg: aLeg [ ^ conManager msc diff --git a/src/MSC.st b/src/MSC.st index 3db68d3..b426b6f 100644 --- a/src/MSC.st +++ b/src/MSC.st @@ -245,6 +245,18 @@ Object subclass: MSCApplication [ sip] ] + selectAudioRouteForEmergency: aCon leg: aLeg [ + ^ (SIPMTCall + fromUser: 'sip:1000@sip.zecke.osmocom.org' + host: '127.0.0.1' + port: 5060 + to: 'sip:911@127.0.0.1' + on: self sipGateway) + remoteLeg: aLeg; + yourself + ] + + selectAudioRoute: aCon plan: aPlan leg: aLeg [ | nr | "TODO: Very simple and hardcoded rule"