139 lines
4.0 KiB
Smalltalk
139 lines
4.0 KiB
Smalltalk
"
|
|
(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
|
|
]
|
|
]
|