#
#
# Copyright (c) 2006, John Mettraux, OpenWFE.org
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# . Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# . Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
#
# $Id: codec.rb 2515 2006-04-26 18:38:39Z jmettraux $
#
require 'socket'
require 'codec'
module OpenWFE
class SocketListener < TCPServer
#
# starts to listen on a given interface (IP) and port
#
def initialize (iface, port)
super(iface, port)
end
def listen ()
while (session = accept())
s = session.gets
if s[0..8] != 'xmlCoder '
session.close
break
end
l = s[9..-1].to_i
s = session.gets
#
# skipping the empty line between the
# header and the actual workitem
sXml = ''
while sXml.length < l
s = session.gets
sXml = "#{sXml}#{s}"
end
session.print ""
session.close
#yield sXml
xml = REXML::Document.new(sXml)
yield OpenWFE.decode(xml.root)
end
end
end
#
# dispatches a workitem over TCP
#
def OpenWFE.dispatchWorkitem (host, port, workitem)
sXml = OpenWFE.encode(workitem)
socket = TCPSocket.new(host, port)
socket.puts "xmlCoder #{sXml.length}"
socket.puts
socket.puts sXml
socket.puts
reply = socket.gets
reply = reply + socket.gets
#
# a bit ridiculous, but it works
socket.close
#puts "dispatch() reply is >#{reply}<"
end
class OwfeHook
end
end
#
# some test code
sl = OpenWFE::SocketListener.new('127.0.0.1', 7010)
puts "..ready.."
sl.listen do |workitem|
#puts workitem
#next
puts workitem.flowExpressionId
puts "...history length : #{workitem.history.length}"
#puts workitem.history
workitem.history.each do |hi|
puts ".....hi = '#{hi.text}' #{hi.date}"
end
#hi = OpenWFE::HistoryItem.new
#hi.author = 'osocket.rb'
#workitem.history.push(hi)
workitem.attributes['ruby?'] = 'yes'
OpenWFE.dispatchWorkitem('127.0.0.1', 7007, workitem)
end