summaryrefslogtreecommitdiff
path: root/python/qpid
diff options
context:
space:
mode:
Diffstat (limited to 'python/qpid')
-rw-r--r--python/qpid/codec010.py29
-rw-r--r--python/qpid/delegates.py9
-rw-r--r--python/qpid/spec010.py30
3 files changed, 58 insertions, 10 deletions
diff --git a/python/qpid/codec010.py b/python/qpid/codec010.py
index f6539ffcee..27df9db974 100644
--- a/python/qpid/codec010.py
+++ b/python/qpid/codec010.py
@@ -20,11 +20,18 @@
from packer import Packer
from datatypes import RangedSet
+class CodecException(Exception): pass
+
class Codec(Packer):
def __init__(self, spec):
self.spec = spec
+ def write_void(self, v):
+ assert v == None
+ def read_void(self):
+ return None
+
def write_bit(self, b):
if not b: raise ValueError(b)
def read_bit(self):
@@ -148,10 +155,26 @@ class Codec(Packer):
self.write(b)
def write_map(self, m):
- self.write_uint32(0) #hack
+ sc = StringCodec(self.spec)
+ for k, v in m.items():
+ type = self.spec.encoding(v.__class__)
+ if type == None:
+ raise CodecException("no encoding for %s" % v.__class__)
+ sc.write_str8(k)
+ sc.write_uint8(type.code)
+ type.encode(sc, v)
+ # XXX: need to put in count when CPP supports it
+ self.write_vbin32(sc.encoded)
def read_map(self):
- size = self.read_uint32() #hack
- self.read(size) #hack
+ sc = StringCodec(self.spec, self.read_vbin32())
+ result = {}
+ while sc.encoded:
+ k = sc.read_str8()
+ code = sc.read_uint8()
+ type = self.spec.types[code]
+ v = type.decode(sc)
+ result[k] = v
+ return result
def write_array(self, a):
pass
diff --git a/python/qpid/delegates.py b/python/qpid/delegates.py
index a29d5c5265..d1f615a3fa 100644
--- a/python/qpid/delegates.py
+++ b/python/qpid/delegates.py
@@ -17,8 +17,7 @@
# under the License.
#
-import connection010
-import session
+import os, connection010, session
from util import notify
from datatypes import RangedSet
@@ -117,12 +116,16 @@ class Server(Delegate):
class Client(Delegate):
+ PROPERTIES = {"product": "qpid python client",
+ "version": "development",
+ "platform": os.name}
+
def start(self):
self.connection.write_header(self.spec.major, self.spec.minor)
self.connection.read_header()
def connection_start(self, ch, start):
- ch.connection_start_ok()
+ ch.connection_start_ok(client_properties=Client.PROPERTIES)
def connection_tune(self, ch, tune):
ch.connection_tune_ok()
diff --git a/python/qpid/spec010.py b/python/qpid/spec010.py
index c3f3e6ad57..b84be7a047 100644
--- a/python/qpid/spec010.py
+++ b/python/qpid/spec010.py
@@ -122,7 +122,6 @@ class Type(Named, Node):
def register(self, node):
Named.register(self, node)
- node.types.append(self)
Node.register(self)
class Primitive(Coded, Type):
@@ -133,6 +132,11 @@ class Primitive(Coded, Type):
self.fixed = fixed
self.variable = variable
+ def register(self, node):
+ Type.register(self, node)
+ if self.code is not None:
+ self.spec.types[self.code] = self
+
def is_present(self, value):
if self.fixed == 0:
return value
@@ -265,7 +269,8 @@ class Struct(Composite):
def register(self, node):
Composite.register(self, node)
- self.spec.structs[self.code] = self
+ if self.code is not None:
+ self.spec.structs[self.code] = self
def __str__(self):
fields = ",\n ".join(["%s: %s" % (f.name, f.type.qname)
@@ -384,7 +389,6 @@ class Class(Named, Coded, Node):
Named.__init__(self, name)
Coded.__init__(self, code)
Node.__init__(self, children)
- self.types = []
self.controls = []
self.commands = []
@@ -441,6 +445,16 @@ class Exception(Named, Node):
class Spec(Node):
+ ENCODINGS = {
+ basestring: "vbin16",
+ int: "int32",
+ long: "int64",
+ None.__class__: "void",
+ list: "list",
+ tuple: "list",
+ dict: "map"
+ }
+
def __init__(self, major, minor, port, children):
Node.__init__(self, children)
self.major = major
@@ -448,7 +462,7 @@ class Spec(Node):
self.port = port
self.constants = []
self.classes = []
- self.types = []
+ self.types = {}
self.qname = None
self.spec = self
self.klass = None
@@ -457,6 +471,14 @@ class Spec(Node):
self.commands = {}
self.structs = {}
+ def encoding(self, klass):
+ if Spec.ENCODINGS.has_key(klass):
+ return self.named[Spec.ENCODINGS[klass]]
+ for base in klass.__bases__:
+ result = self.encoding(base)
+ if result != None:
+ return result
+
class Implement:
def __init__(self, handle):