#**************************************************************************** # Copyright (c) quickfixengine.org All rights reserved. # # This file is part of the QuickFIX FIX Engine # # This file may be distributed under the terms of the quickfixengine.org # license as defined by quickfixengine.org and appearing in the file # LICENSE included in the packaging of this file. # # This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE # WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. # # See http://www.quickfixengine.org/LICENSE for licensing information. # # Contact ask@quickfixengine.org if any conditions of this licensing are # not clear to you. #**************************************************************************** require 'SocketServer' require 'Reflector' class ReflectorServer < SocketServer def initialize(messages, address = "localhost", port = 5000) @reflector = Reflector.new @parser = nil @socket = nil @messages = messages @port = port def @reflector.socket=(s) @socket = s end def @reflector.socket return @socket end def @reflector.server=(s) @server = s end def @reflector.parser=(s) @parser = s end def @reflector.expectedAction(msg, cid) m = @parser.readFixMessage @server.compareAction(msg, m) end def @reflector.initiateAction(msg, cid) @socket.write(msg) end def @reflector.waitConnectAction(cid) @server.waitConnectAction end def @reflector.waitDisconnectAction(cid) begin if IO.select([@socket], nil, nil, 10) == nil then raise "Connection hangs after five seconds." elsif !@socket.eof? then raise "Expected disconnection, got data" end rescue Errno::ECONNRESET # Ignore, client has already disconnected the socket end end end def connectAction(s) if @socket == nil @socket = s @reflector.socket = s @reflector.server = self else s.close end end def waitConnectAction gs = TCPServer.open(@port) addr = gs.addr addr.shift if IO.select([gs], nil, nil, 10) == nil then raise "Connection hangs after ten seconds." end @socket = gs.accept @parser = FixParser.new(@socket) @reflector.parser = @parser @reflector.socket = @socket end def disconnectAction(s) end def receiveAction(s) end def compareAction(e, a) end def start @reflector.server = self @reflector.processFile(@messages) end end