summaryrefslogtreecommitdiff
path: root/ruby/qpid/connection.rb
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2007-03-07 17:13:02 +0000
committerRafael H. Schloming <rhs@apache.org>2007-03-07 17:13:02 +0000
commit6dbcf1d2ef68c8bf2b0032287bf71af8b002e35e (patch)
tree5c2411ae8c9af50f952eab48a870d4ddd9357448 /ruby/qpid/connection.rb
parentc4d2e2a327175ad1703639e42363e8b4479ce0c0 (diff)
downloadqpid-python-6dbcf1d2ef68c8bf2b0032287bf71af8b002e35e.tar.gz
added test harness, tests, and a few missing pieces of implementation
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@515652 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'ruby/qpid/connection.rb')
-rw-r--r--ruby/qpid/connection.rb119
1 files changed, 114 insertions, 5 deletions
diff --git a/ruby/qpid/connection.rb b/ruby/qpid/connection.rb
index c79e9d8319..f6ee9cf1e4 100644
--- a/ruby/qpid/connection.rb
+++ b/ruby/qpid/connection.rb
@@ -48,6 +48,7 @@ module Qpid
end
def write(frame)
+# puts "OUT #{frame.inspect()}"
@out.octet(@spec.constants[frame.payload.type].id)
@out.short(frame.channel)
frame.payload.encode(@out)
@@ -62,13 +63,15 @@ module Qpid
if oct != frame_end
raise Exception.new("framing error: expected #{frame_end}, got #{oct}")
end
- Frame.new(channel, payload)
+ frame = Frame.new(channel, payload)
+# puts " IN #{frame.inspect}"
+ return frame
end
private
def frame_end
- @spec.constants[:"frame end"].id
+ @spec.constants[:"frame_end"].id
end
end
@@ -113,9 +116,7 @@ module Qpid
attr_reader(:method, :args)
- def Method.type
- :"frame method"
- end
+ def Method.type; :frame_method end
def type; Method.type end
@@ -125,6 +126,7 @@ module Qpid
enc.short(@method.parent.id)
enc.short(@method.id)
@method.fields.zip(self.args).each {|f, a|
+ if a.nil?; a = f.default end
enc.encode(f.type, a)
}
enc.flush()
@@ -140,6 +142,113 @@ module Qpid
return Method.new(meth, args)
end
+ def inspect(); "#{method.qname}(#{args.join(", ")})" end
+
+ end
+
+ class Header < Payload
+
+ def Header.type; :frame_header end
+
+ def initialize(klass, weight, size, properties)
+ @klass = klass
+ @weight = weight
+ @size = size
+ @properties = properties
+ end
+
+ attr_reader :weight, :size, :properties
+
+ def type; Header.type end
+
+ def encode(encoder)
+ buf = StringWriter.new()
+ enc = Encoder.new(buf)
+ enc.short(@klass.id)
+ enc.short(@weight)
+ enc.longlong(@size)
+
+ # property flags
+ nprops = @klass.fields.size
+ flags = 0
+ 0.upto(nprops - 1) do |i|
+ f = @klass.fields[i]
+ flags <<= 1
+ flags |= 1 unless @properties[f.name].nil?
+ # the last bit indicates more flags
+ if i > 0 and (i % 15) == 0
+ flags <<= 1
+ if nprops > (i + 1)
+ flags |= 1
+ enc.short(flags)
+ flags = 0
+ end
+ end
+ end
+ flags <<= ((16 - (nprops % 15)) % 16)
+ enc.short(flags)
+
+ # properties
+ @klass.fields.each do |f|
+ v = @properties[f.name]
+ enc.encode(f.type, v) unless v.nil?
+ end
+ enc.flush()
+ encoder.longstr(buf.to_s)
+ end
+
+ def Header.decode(spec, decoder)
+ dec = Decoder.new(StringReader.new(decoder.longstr()))
+ klass = spec.classes[dec.short()]
+ weight = dec.short()
+ size = dec.longlong()
+
+ # property flags
+ bits = []
+ while true
+ flags = dec.short()
+ 15.downto(1) do |i|
+ if flags >> i & 0x1 != 0
+ bits << true
+ else
+ bits << false
+ end
+ end
+ break if flags & 0x1 == 0
+ end
+
+ # properties
+ properties = {}
+ bits.zip(klass.fields).each do |b, f|
+ properties[f.name] = dec.decode(f.type) if b
+ end
+ return Header.new(klass, weight, size, properties)
+ end
+
+ def inspect(); "#{@klass.name}(#{@properties.inspect()})" end
+
+ end
+
+ class Body < Payload
+
+ def Body.type; :frame_body end
+
+ def type; Body.type end
+
+ def initialize(content)
+ @content = content
+ end
+
+ attr_reader :content
+
+ def encode(enc)
+ enc.longstr(@content)
+ end
+
+ def Body.decode(spec, dec)
+ return Body.new(dec.longstr())
+ end
+
end
end