Author: sitharus Date: To: rubyfreenet Subject: [Rubyfreenet] r9186 - in trunk/apps/rubyFreenet: freenet/fcp rsite
Author: sitharus
Date: 2006-06-13 22:00:58 +0000 (Tue, 13 Jun 2006)
New Revision: 9186
Modified:
trunk/apps/rubyFreenet/freenet/fcp/client.rb
trunk/apps/rubyFreenet/freenet/fcp/message.rb
trunk/apps/rubyFreenet/rsite/rsite.rb
Log:
Moved reading/writing to Message class so I can write unit tests easier.
Some changes to rsite to make it work better.
Modified: trunk/apps/rubyFreenet/freenet/fcp/client.rb
===================================================================
--- trunk/apps/rubyFreenet/freenet/fcp/client.rb 2006-06-13 18:58:30 UTC (rev 9185)
+++ trunk/apps/rubyFreenet/freenet/fcp/client.rb 2006-06-13 22:00:58 UTC (rev 9186)
@@ -295,6 +295,9 @@
when 'PutFailed','ProtocolError'
message.unlock
raise RequestFailed.new(message.response)
+ when 'SimpleProgress'
+ puts "T:#{message.response.items['Total']}/R:#{message.response.items['Required']}/F:#{message.response.items['Failed']}/FF:#{message.response.items['FatallyFailed']}/S:#{message.response.items['Succeeded']}/#{message.response.items['FinalizedTotal']}"
+ message.unlock
else
message.unlock
end
@@ -363,11 +366,12 @@
@socket.close
Thread.exit
end
+
begin
while message = @message_queue.pop(true)
send_message(message)
end
- rescue ThreadError => e
+ rescue ThreadError => e # If the queue is empty.
end
# Wait two seconds for communication, shouldn't slow down too much and should save CPU.
@@ -476,19 +480,7 @@
raise FCPConnectionError.new('Socket does not exist') unless @socket
@messages[message.identifier] ||= message
unless message.load_only
- @socket.write(message.type+"\n")
- message.items.each do |key, value|
- @socket.write("#{key}=#{value}\n")
- end
-
- if message.data
- @socket.write("DataLength=#{message.data.length}\n")
- @socket.write("Data\n")
- @socket.write(message.data)
- else
- @socket.write("EndMessage\n")
- end
- @socket.write("\n")
+ message.write(@socket)
end
end
@@ -498,25 +490,7 @@
# raises FCPConnectionError if socket isn't connected
def read_message
raise FCPConnectionError.new('Socket does not exist') unless @socket
- items = {}
- type = nil
- data = nil
- loop do
- line = @socket.readline.strip
- case line
- when "End","EndMessage"
- break
- when /=/
- key, value = line.split('=', 2)
- items[key] = value
- when "Data"
- data = @socket.read(items['DataLength'].to_i)
- break
- else
- type = line if type == nil
- end
- end
- return Message.new(type, data, items)
+ return Message.read(@socket)
end
end
end
Modified: trunk/apps/rubyFreenet/freenet/fcp/message.rb
===================================================================
--- trunk/apps/rubyFreenet/freenet/fcp/message.rb 2006-06-13 18:58:30 UTC (rev 9185)
+++ trunk/apps/rubyFreenet/freenet/fcp/message.rb 2006-06-13 22:00:58 UTC (rev 9186)
@@ -11,14 +11,15 @@
# [load_only] Only load in to the message queue, don't actually send. Used when restoring persistent
# requests if a client dies
# [content_type] The content type of the data. Set automatically on response, set manually when inserting.
- # [retries]
+ # [retries] The number of retries that have happened in case of DataNotFound. The hard limit is five at the moment.
class Message
attr_reader :type, :data, :items, :identifier
attr_accessor :callback, :load_only, :response, :data_found, :content_type, :retries, :timeout, :added
# [type] The FCP message type
# [data] Any data to send with the message
- # [items] A hash of message parameters
+ # [items] A hash of message parameters. They vary for different messages, Timeout is a special
+ # item that sets the timeout in seconds for this message, it doesn't go to the node.
# [callback] Callback for asynchronous messages
def initialize(type, data = nil, items = [], callback = nil)
@retries = 0
@@ -88,6 +89,47 @@
@this_thread = Thread.current
Thread.stop
end
+
+ # Write this object to an FCP stream.
+ def write(stream)
+ stream.write(type+"\n")
+ items.each do |key, value|
+ stream.write("#{key}=#{value}\n")
+ end
+
+ if data
+ stream.write("DataLength=#{data.length}\n")
+ stream.write("Data\n")
+ stream.write(data)
+ else
+ stream.write("EndMessage\n")
+ end
+ stream.flush
+ end
+
+ # Read from stream and create a new message object
+ def self.read(stream)
+ items = {}
+ type = nil
+ data = nil
+ loop do
+ line = stream.readline.strip
+ case line
+ when "End","EndMessage"
+ break
+ when /=/
+ key, value = line.split('=', 2)
+ items[key] = value
+ when "Data"
+ data = stream.read(items['DataLength'].to_i)
+ break
+ else
+ type = line if type == nil
+ end
+ end
+ puts "Read #{type}"
+ return Message.new(type, data, items)
+ end
end
end
end
\ No newline at end of file