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/LogAreaOsmo.st \
|
||||
osmo/OsmoUDPSocket.st osmo/OsmoCtrlLogging.st \
|
||||
osmo/OsmoStreamSocketBase.st \
|
||||
osmo/OsmoCtrlGrammar.st osmo/OsmoAppConnection.st \
|
||||
osmo/OsmoCtrlConnection.st osmo/OsmoCtrlGrammarTest.st
|
||||
|
||||
|
|
|
@ -16,19 +16,13 @@
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
"
|
||||
|
||||
Object subclass: OsmoAppConnection [
|
||||
| socket writeQueue demuxer muxer dispatcher token hostname port
|
||||
tx_proc rx_proc started connect_block |
|
||||
OsmoStreamSocketBase subclass: OsmoAppConnection [
|
||||
| writeQueue demuxer muxer dispatcher token connect_block |
|
||||
<category: 'OsmoNetwork-Socket'>
|
||||
<comment: 'I connect to a OpenBSC App on the Control Port and wait for
|
||||
TRAPS coming from the server and will act on these.
|
||||
TODO: re-use the IPADispatcher across connections.'>
|
||||
|
||||
OsmoAppConnection class >> connectionException [
|
||||
<category: 'exceptions'>
|
||||
^ SystemExceptions.FileError
|
||||
]
|
||||
|
||||
OsmoAppConnection class >> new [
|
||||
^(self basicNew)
|
||||
hostname: '127.0.0.1';
|
||||
|
@ -36,52 +30,6 @@ TODO: re-use the IPADispatcher across connections.'>
|
|||
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 [
|
||||
| ipa |
|
||||
"Allow another class to register handlers"
|
||||
|
@ -107,16 +55,6 @@ TODO: re-use the IPADispatcher across connections.'>
|
|||
token := aToken.
|
||||
]
|
||||
|
||||
hostname: aHostname [
|
||||
<category: 'creation'>
|
||||
hostname := aHostname
|
||||
]
|
||||
|
||||
port: aPort [
|
||||
<category: 'creation'>
|
||||
port := aPort
|
||||
]
|
||||
|
||||
onConnect: aBlock [
|
||||
<category: 'creation'>
|
||||
"Call the block when the socket is being connected and the dispatcher
|
||||
|
@ -131,47 +69,13 @@ TODO: re-use the IPADispatcher across connections.'>
|
|||
|
||||
connect [
|
||||
<category: 'connect'>
|
||||
socket ifNotNil: [socket close].
|
||||
socket := self createConnection: hostname port: port.
|
||||
super connect.
|
||||
writeQueue := SharedQueue new.
|
||||
demuxer := IPADemuxer initOn: socket.
|
||||
muxer := IPAMuxer initOn: writeQueue.
|
||||
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 [
|
||||
| msg |
|
||||
<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/OsmoCtrlLogging.st</filein>
|
||||
<filein>osmo/OsmoCtrlGrammar.st</filein>
|
||||
<filein>osmo/OsmoStreamSocketBase.st</filein>
|
||||
<filein>osmo/OsmoAppConnection.st</filein>
|
||||
<filein>osmo/OsmoCtrlConnection.st</filein>
|
||||
|
||||
|
|
|
@ -25,7 +25,9 @@ OsmoAppConnection extend [
|
|||
noTimeout;
|
||||
yourself
|
||||
]
|
||||
]
|
||||
|
||||
OsmoStreamSocketBase extend [
|
||||
driveDispatch [
|
||||
<category: 'private'>
|
||||
[
|
||||
|
@ -49,7 +51,7 @@ OsmoAppConnection extend [
|
|||
]
|
||||
]
|
||||
|
||||
OsmoAppConnection class extend [
|
||||
OsmoStreamSocketBase class extend [
|
||||
connectionException [
|
||||
<category: 'pharo-porting'>
|
||||
^ConnectionTimedOut
|
||||
|
|
Reference in New Issue