# # # 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