blob: 711d9b7ac65331c3b497bff2a40f133cd0b4dab6 [file] [log] [blame]
require 'etch/bindings/ruby/transport/monitor.rb'
require 'etch/bindings/ruby/transport/runner.rb'
require 'etch/bindings/ruby/transport/runner_handler.rb'
require 'socket'
class Connection < Runner
include Source, RunnerHandler
attr_writer :handler, true
protected :handler
def initialize( handler )
Runner.setRunnerHandler( handler )
@handler = handler
end
def setHandler( handler )
Runner.setRunnerHandler( handler )
@handler = handler
end
def started( runner )
# do nothing
end
def stopped( runner )
# do nothing
end
def exception( runner, what, e )
e = Exception.new
e.message
end
def run0
if( !openSocket?(!first) )
return false
end
throw :Exception1 unless setUpSocket()
throw :Exception2 unless fireUP()
throw :Exception2 unless readSocket()
return true
end
catch :Exception1 => e do
fireException( "setup", e )
return true
end
catch :Exception2 => e do
fireException( "run", e )
close( true )
return true
end
ensure
begin
close( false )
fireDown()
end
def openSocket( reconnect )
raise "subclass responsibility"
end
def setUpSocket()
raise "subclass responsibility"
end
def readSocket()
raise "subclass responsibility"
end
def close( reset )
raise "subclass responsibility"
end
def fireUp()
notifyUp()
if( @handler != nil )
@handler.up( handler )
end
end
def fireDown()
notifyUp()
if( @handler != nil )
@handler.down( handler )
end
end
def notifyUp()
@status.set( $UP )
end
def notifyDown()
@status.set( $DOWN )
end
def waitUp( maxdelay )
@status.waitUntilEq( $UP, maxdelay )
end
def waitDown( maxdelay )
@status.waitUntilEq( $DOWN, maxdelay )
end
@status = Monitor.new( @status, $DOWN )
$DOWN = "down"
$UP = "up"
end