net: Introduce the OsmoStreamSocketBase connection
This commit is contained in:
parent
b9d70c018f
commit
f91e5c96aa
1
Makefile
1
Makefile
|
@ -47,6 +47,7 @@ UA = \
|
||||||
OSMO = \
|
OSMO = \
|
||||||
osmo/LogAreaOsmo.st \
|
osmo/LogAreaOsmo.st \
|
||||||
osmo/OsmoUDPSocket.st osmo/OsmoCtrlLogging.st \
|
osmo/OsmoUDPSocket.st osmo/OsmoCtrlLogging.st \
|
||||||
|
osmo/OsmoStreamSocketBase.st \
|
||||||
osmo/OsmoCtrlGrammar.st osmo/OsmoAppConnection.st \
|
osmo/OsmoCtrlGrammar.st osmo/OsmoAppConnection.st \
|
||||||
osmo/OsmoCtrlConnection.st osmo/OsmoCtrlGrammarTest.st
|
osmo/OsmoCtrlConnection.st osmo/OsmoCtrlGrammarTest.st
|
||||||
|
|
||||||
|
|
|
@ -16,19 +16,13 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"
|
"
|
||||||
|
|
||||||
Object subclass: OsmoAppConnection [
|
OsmoStreamSocketBase subclass: OsmoAppConnection [
|
||||||
| socket writeQueue demuxer muxer dispatcher token hostname port
|
| writeQueue demuxer muxer dispatcher token connect_block |
|
||||||
tx_proc rx_proc started connect_block |
|
|
||||||
<category: 'OsmoNetwork-Socket'>
|
<category: 'OsmoNetwork-Socket'>
|
||||||
<comment: 'I connect to a OpenBSC App on the Control Port and wait for
|
<comment: 'I connect to a OpenBSC App on the Control Port and wait for
|
||||||
TRAPS coming from the server and will act on these.
|
TRAPS coming from the server and will act on these.
|
||||||
TODO: re-use the IPADispatcher across connections.'>
|
TODO: re-use the IPADispatcher across connections.'>
|
||||||
|
|
||||||
OsmoAppConnection class >> connectionException [
|
|
||||||
<category: 'exceptions'>
|
|
||||||
^ SystemExceptions.FileError
|
|
||||||
]
|
|
||||||
|
|
||||||
OsmoAppConnection class >> new [
|
OsmoAppConnection class >> new [
|
||||||
^(self basicNew)
|
^(self basicNew)
|
||||||
hostname: '127.0.0.1';
|
hostname: '127.0.0.1';
|
||||||
|
@ -36,52 +30,6 @@ TODO: re-use the IPADispatcher across connections.'>
|
||||||
yourself
|
yourself
|
||||||
]
|
]
|
||||||
|
|
||||||
driveDispatch [
|
|
||||||
<category: 'private'>
|
|
||||||
|
|
||||||
[
|
|
||||||
self dispatchOne
|
|
||||||
] on: SystemExceptions.EndOfStream do: [:e |
|
|
||||||
self logError: 'OsmoApplication eof' area: #osmo.
|
|
||||||
self scheduleReconnect
|
|
||||||
] on: SystemExceptions.FileError do: [:e |
|
|
||||||
self logError: 'OsmoApplication file-error' area: #osmo.
|
|
||||||
self scheduleReconnect
|
|
||||||
] on: Error do: [:e |
|
|
||||||
e logException: 'OsmoApplication error' area: #osmo.
|
|
||||||
self scheduleReconnect
|
|
||||||
]
|
|
||||||
]
|
|
||||||
|
|
||||||
driveSend [
|
|
||||||
<category: 'private'>
|
|
||||||
[
|
|
||||||
self sendOne
|
|
||||||
] on: SystemExceptions.EndOfStream do: [:e |
|
|
||||||
self logError: 'OsmoApplication eof' area: #osmo.
|
|
||||||
self scheduleReconnect
|
|
||||||
] on: Error do: [:e |
|
|
||||||
e logException: 'OsmoApplication error' area: #osmo.
|
|
||||||
self scheduleReconnect
|
|
||||||
]
|
|
||||||
]
|
|
||||||
|
|
||||||
reconnect [
|
|
||||||
<category: 'private'>
|
|
||||||
self logNotice: 'Going to reconnect socket' area: #osmo.
|
|
||||||
self terminate.
|
|
||||||
started ifTrue: [self start]
|
|
||||||
]
|
|
||||||
|
|
||||||
scheduleReconnect [
|
|
||||||
<category: 'private'>
|
|
||||||
socket ifNotNil: [socket close. socket := nil].
|
|
||||||
TimerScheduler instance scheduleInSeconds: 1 block: [self reconnect].
|
|
||||||
"We are done now"
|
|
||||||
Processor activeProcess terminate
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
initializeDispatcher [
|
initializeDispatcher [
|
||||||
| ipa |
|
| ipa |
|
||||||
"Allow another class to register handlers"
|
"Allow another class to register handlers"
|
||||||
|
@ -107,16 +55,6 @@ TODO: re-use the IPADispatcher across connections.'>
|
||||||
token := aToken.
|
token := aToken.
|
||||||
]
|
]
|
||||||
|
|
||||||
hostname: aHostname [
|
|
||||||
<category: 'creation'>
|
|
||||||
hostname := aHostname
|
|
||||||
]
|
|
||||||
|
|
||||||
port: aPort [
|
|
||||||
<category: 'creation'>
|
|
||||||
port := aPort
|
|
||||||
]
|
|
||||||
|
|
||||||
onConnect: aBlock [
|
onConnect: aBlock [
|
||||||
<category: 'creation'>
|
<category: 'creation'>
|
||||||
"Call the block when the socket is being connected and the dispatcher
|
"Call the block when the socket is being connected and the dispatcher
|
||||||
|
@ -131,47 +69,13 @@ TODO: re-use the IPADispatcher across connections.'>
|
||||||
|
|
||||||
connect [
|
connect [
|
||||||
<category: 'connect'>
|
<category: 'connect'>
|
||||||
socket ifNotNil: [socket close].
|
super connect.
|
||||||
socket := self createConnection: hostname port: port.
|
|
||||||
writeQueue := SharedQueue new.
|
writeQueue := SharedQueue new.
|
||||||
demuxer := IPADemuxer initOn: socket.
|
demuxer := IPADemuxer initOn: socket.
|
||||||
muxer := IPAMuxer initOn: writeQueue.
|
muxer := IPAMuxer initOn: writeQueue.
|
||||||
self initializeDispatcher.
|
self initializeDispatcher.
|
||||||
]
|
]
|
||||||
|
|
||||||
start [
|
|
||||||
<category: 'connect'>
|
|
||||||
started := true.
|
|
||||||
|
|
||||||
[
|
|
||||||
self logNotice: 'Attempting to connect' area: #osmo.
|
|
||||||
self connect
|
|
||||||
] on: self class connectionException do: [
|
|
||||||
self logError: 'Failed to connect.' area: #osmo.
|
|
||||||
^Osmo.TimerScheduler instance scheduleInSeconds: 1 block: [self reconnect]].
|
|
||||||
|
|
||||||
rx_proc :=
|
|
||||||
[Processor activeProcess name: 'OsmoAppConnection-RX'.
|
|
||||||
[self driveDispatch] repeat] fork.
|
|
||||||
tx_proc := [Processor activeProcess name: 'OsmoAppConnection-TX'.
|
|
||||||
[self driveSend] repeat] fork
|
|
||||||
]
|
|
||||||
|
|
||||||
stop [
|
|
||||||
<category: 'connect'>
|
|
||||||
started := false.
|
|
||||||
self terminate
|
|
||||||
"A reconnect timer might be running right now"
|
|
||||||
]
|
|
||||||
|
|
||||||
terminate [
|
|
||||||
<category: 'connect'>
|
|
||||||
tx_proc ifNotNil: [tx_proc terminate].
|
|
||||||
rx_proc ifNotNil: [rx_proc terminate].
|
|
||||||
socket ifNotNil: [socket close. socket := nil]
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
sendOne [
|
sendOne [
|
||||||
| msg |
|
| msg |
|
||||||
<category: 'dispatch'>
|
<category: 'dispatch'>
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
"
|
||||||
|
(C) 2011-2013 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 <http://www.gnu.org/licenses/>.
|
||||||
|
"
|
||||||
|
|
||||||
|
Object subclass: OsmoStreamSocketBase [
|
||||||
|
| socket hostname port tx_proc rx_proc started |
|
||||||
|
|
||||||
|
<category: 'OsmoNetwork-Socket'>
|
||||||
|
<comment: 'I am the base class for streaming related sockets. I help with
|
||||||
|
supervising the RX/TX process and re-starting.'>
|
||||||
|
|
||||||
|
OsmoStreamSocketBase class >> connectionException [
|
||||||
|
<category: 'pharo-porting'>
|
||||||
|
^ SystemExceptions.FileError
|
||||||
|
]
|
||||||
|
|
||||||
|
hostname: aHostname [
|
||||||
|
<category: 'creation'>
|
||||||
|
hostname := aHostname
|
||||||
|
]
|
||||||
|
|
||||||
|
port: aPort [
|
||||||
|
<category: 'creation'>
|
||||||
|
port := aPort
|
||||||
|
]
|
||||||
|
|
||||||
|
connect [
|
||||||
|
<category: 'connect'>
|
||||||
|
socket ifNotNil: [socket close].
|
||||||
|
socket := self createConnection: hostname port: port
|
||||||
|
]
|
||||||
|
|
||||||
|
start [
|
||||||
|
<category: 'connect'>
|
||||||
|
started := true.
|
||||||
|
|
||||||
|
[
|
||||||
|
self logNotice: 'Attempting to connect' area: #osmo.
|
||||||
|
self connect
|
||||||
|
] on: self class connectionException do: [
|
||||||
|
self logError: 'Failed to connect.' area: #osmo.
|
||||||
|
^Osmo.TimerScheduler instance scheduleInSeconds: 1 block: [self reconnect]].
|
||||||
|
|
||||||
|
rx_proc :=
|
||||||
|
[Processor activeProcess name: 'OsmoAppConnection-RX'.
|
||||||
|
[self driveDispatch] repeat] fork.
|
||||||
|
tx_proc := [Processor activeProcess name: 'OsmoAppConnection-TX'.
|
||||||
|
[self driveSend] repeat] fork
|
||||||
|
]
|
||||||
|
|
||||||
|
stop [
|
||||||
|
<category: 'connect'>
|
||||||
|
started := false.
|
||||||
|
self terminate
|
||||||
|
"A reconnect timer might be running right now"
|
||||||
|
]
|
||||||
|
|
||||||
|
terminate [
|
||||||
|
<category: 'connect'>
|
||||||
|
tx_proc ifNotNil: [tx_proc terminate].
|
||||||
|
rx_proc ifNotNil: [rx_proc terminate].
|
||||||
|
socket ifNotNil: [socket close. socket := nil]
|
||||||
|
]
|
||||||
|
|
||||||
|
driveDispatch [
|
||||||
|
<category: 'private'>
|
||||||
|
|
||||||
|
[
|
||||||
|
self dispatchOne
|
||||||
|
] on: SystemExceptions.EndOfStream do: [:e |
|
||||||
|
self logError: 'OsmoApplication eof' area: #osmo.
|
||||||
|
self scheduleReconnect
|
||||||
|
] on: SystemExceptions.FileError do: [:e |
|
||||||
|
self logError: 'OsmoApplication file-error' area: #osmo.
|
||||||
|
self scheduleReconnect
|
||||||
|
] on: Error do: [:e |
|
||||||
|
e logException: 'OsmoApplication error' area: #osmo.
|
||||||
|
self scheduleReconnect
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
driveSend [
|
||||||
|
<category: 'private'>
|
||||||
|
[
|
||||||
|
self sendOne
|
||||||
|
] on: SystemExceptions.EndOfStream do: [:e |
|
||||||
|
self logError: 'OsmoApplication eof' area: #osmo.
|
||||||
|
self scheduleReconnect
|
||||||
|
] on: Error do: [:e |
|
||||||
|
e logException: 'OsmoApplication error' area: #osmo.
|
||||||
|
self scheduleReconnect
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
reconnect [
|
||||||
|
<category: 'private'>
|
||||||
|
self logNotice: 'Going to reconnect socket' area: #osmo.
|
||||||
|
self terminate.
|
||||||
|
started ifTrue: [self start]
|
||||||
|
]
|
||||||
|
|
||||||
|
scheduleReconnect [
|
||||||
|
<category: 'private'>
|
||||||
|
socket ifNotNil: [socket close. socket := nil].
|
||||||
|
TimerScheduler instance scheduleInSeconds: 1 block: [self reconnect].
|
||||||
|
"We are done now"
|
||||||
|
Processor activeProcess terminate
|
||||||
|
]
|
||||||
|
|
||||||
|
createConnection: aHostname port: aPort [
|
||||||
|
<category: 'internal'>
|
||||||
|
self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
dispatchOne [
|
||||||
|
<category: 'internal'>
|
||||||
|
self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
sendOne [
|
||||||
|
<category: 'internal'>
|
||||||
|
self subclassResponsibility
|
||||||
|
]
|
||||||
|
]
|
|
@ -33,6 +33,7 @@
|
||||||
<filein>osmo/OsmoUDPSocket.st</filein>
|
<filein>osmo/OsmoUDPSocket.st</filein>
|
||||||
<filein>osmo/OsmoCtrlLogging.st</filein>
|
<filein>osmo/OsmoCtrlLogging.st</filein>
|
||||||
<filein>osmo/OsmoCtrlGrammar.st</filein>
|
<filein>osmo/OsmoCtrlGrammar.st</filein>
|
||||||
|
<filein>osmo/OsmoStreamSocketBase.st</filein>
|
||||||
<filein>osmo/OsmoAppConnection.st</filein>
|
<filein>osmo/OsmoAppConnection.st</filein>
|
||||||
<filein>osmo/OsmoCtrlConnection.st</filein>
|
<filein>osmo/OsmoCtrlConnection.st</filein>
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,9 @@ OsmoAppConnection extend [
|
||||||
noTimeout;
|
noTimeout;
|
||||||
yourself
|
yourself
|
||||||
]
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
OsmoStreamSocketBase extend [
|
||||||
driveDispatch [
|
driveDispatch [
|
||||||
<category: 'private'>
|
<category: 'private'>
|
||||||
[
|
[
|
||||||
|
@ -49,7 +51,7 @@ OsmoAppConnection extend [
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
OsmoAppConnection class extend [
|
OsmoStreamSocketBase class extend [
|
||||||
connectionException [
|
connectionException [
|
||||||
<category: 'pharo-porting'>
|
<category: 'pharo-porting'>
|
||||||
^ConnectionTimedOut
|
^ConnectionTimedOut
|
||||||
|
|
Reference in New Issue