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"