summaryrefslogtreecommitdiff
path: root/qpid/cpp/bindings/qmf/ruby
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2010-01-05 19:45:28 +0000
committerTed Ross <tross@apache.org>2010-01-05 19:45:28 +0000
commit25d63a161d11d504e51ead2f76e761f561503b69 (patch)
tree8f018d410a0d9ba554afc61f0f603407ffd1ecb6 /qpid/cpp/bindings/qmf/ruby
parentf41fee09de1f40adc1323e7d811a5a76bc0b6edc (diff)
downloadqpid-python-25d63a161d11d504e51ead2f76e761f561503b69.tar.gz
Added handling of MAP values for the wrapped QMF interfaces.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@896191 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/bindings/qmf/ruby')
-rw-r--r--qpid/cpp/bindings/qmf/ruby/qmf.rb188
-rw-r--r--qpid/cpp/bindings/qmf/ruby/ruby.i2
2 files changed, 112 insertions, 78 deletions
diff --git a/qpid/cpp/bindings/qmf/ruby/qmf.rb b/qpid/cpp/bindings/qmf/ruby/qmf.rb
index 857dd64aeb..ea085d1be2 100644
--- a/qpid/cpp/bindings/qmf/ruby/qmf.rb
+++ b/qpid/cpp/bindings/qmf/ruby/qmf.rb
@@ -31,6 +31,112 @@ module Qmf
end
end
+ class Util
+ def qmf_to_native(val)
+ case val.getType
+ when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
+ when TYPE_UINT64 then val.asUint64
+ when TYPE_SSTR, TYPE_LSTR then val.asString
+ when TYPE_ABSTIME then val.asInt64
+ when TYPE_DELTATIME then val.asUint64
+ when TYPE_REF then ObjectId.new(val.asObjectId)
+ when TYPE_BOOL then val.asBool
+ when TYPE_FLOAT then val.asFloat
+ when TYPE_DOUBLE then val.asDouble
+ when TYPE_UUID then val.asUuid
+ when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
+ when TYPE_INT64 then val.asInt64
+ when TYPE_MAP then value_to_dict(val)
+ when TYPE_OBJECT
+ when TYPE_LIST
+ when TYPE_ARRAY
+ end
+ end
+
+ def native_to_qmf(target, value)
+ if target.class == Qmfengine::Value
+ val = target
+ typecode = val.getType
+ else
+ typecode = target
+ val = Qmfengine::Value.new(typecode)
+ end
+
+ case typecode
+ when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(value)
+ when TYPE_UINT64 then val.setUint64(value)
+ when TYPE_SSTR, TYPE_LSTR then value ? val.setString(value) : val.setString('')
+ when TYPE_ABSTIME then val.setInt64(value)
+ when TYPE_DELTATIME then val.setUint64(value)
+ when TYPE_REF then val.setObjectId(value.impl)
+ when TYPE_BOOL then value ? val.setBool(value) : val.setBool(0)
+ when TYPE_FLOAT then val.setFloat(value)
+ when TYPE_DOUBLE then val.setDouble(value)
+ when TYPE_UUID then val.setUuid(value)
+ when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(value)
+ when TYPE_INT64 then val.setInt64(value)
+ when TYPE_MAP then dict_to_value(val, value)
+ when TYPE_OBJECT
+ when TYPE_LIST
+ when TYPE_ARRAY
+ end
+ return val
+ end
+
+ def pick_qmf_type(value)
+ if value.class == Fixnum
+ if value >= 0
+ return TYPE_UINT32 if value < 0x100000000
+ return TYPE_UINT64
+ else
+ return TYPE_INT32 if value > -0xffffffff
+ return TYPE_INT64
+ end
+ end
+
+ if value.class == Bignum
+ return TYPE_UINT64 if value >= 0
+ return TYPE_INT64
+ end
+
+ if value.class == String
+ return TYPE_SSTR if value.length < 256
+ return TYPE_LSTR
+ end
+
+ return TYPE_DOUBLE if value.class == Float
+
+ return TYPE_BOOL if value.class == TrueClass
+ return TYPE_BOOL if value.class == FalseClass
+ return TYPE_BOOL if value.class == NilClass
+
+ return TYPE_MAP if value.class == Hash
+
+ raise ArgumentError, "QMF type not known for native type #{value.class}"
+ end
+
+ def value_to_dict(val)
+ # Assume val is of type Qmfengine::Value
+ raise ArgumentError, "value_to_dict must be given a map value" if !val.isMap
+ map = {}
+ for i in 0...val.keyCount
+ key = val.key(i)
+ map[key] = qmf_to_native(val.byKey(key))
+ end
+ return map
+ end
+
+ def dict_to_value(val, map)
+ map.each do |key, value|
+ raise ArgumentError, "QMF map key must be a string" if key.class != String
+ typecode = pick_qmf_type(value)
+ val.insert(key, native_to_qmf(typecode, value))
+ end
+ end
+ end
+
+ $util = Util.new
+
##==============================================================================
## CONNECTION
##==============================================================================
@@ -246,46 +352,12 @@ module Qmf
def get_attr(name)
val = value(name)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
- when TYPE_UINT64 then val.asUint64
- when TYPE_SSTR, TYPE_LSTR then val.asString
- when TYPE_ABSTIME then val.asInt64
- when TYPE_DELTATIME then val.asUint64
- when TYPE_REF then ObjectId.new(val.asObjectId)
- when TYPE_BOOL then val.asBool
- when TYPE_FLOAT then val.asFloat
- when TYPE_DOUBLE then val.asDouble
- when TYPE_UUID then val.asUuid
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
- when TYPE_INT64 then val.asInt64
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
- end
+ $util.qmf_to_native(val)
end
def set_attr(name, v)
val = value(name)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(v)
- when TYPE_UINT64 then val.setUint64(v)
- when TYPE_SSTR, TYPE_LSTR then v ? val.setString(v) : val.setString('')
- when TYPE_ABSTIME then val.setInt64(v)
- when TYPE_DELTATIME then val.setUint64(v)
- when TYPE_REF then val.setObjectId(v.impl)
- when TYPE_BOOL then v ? val.setBool(v) : val.setBool(0)
- when TYPE_FLOAT then val.setFloat(v)
- when TYPE_DOUBLE then val.setDouble(v)
- when TYPE_UUID then val.setUuid(v)
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(v)
- when TYPE_INT64 then val.setInt64(v)
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
- end
+ $util.native_to_qmf(val, v)
end
def [](name)
@@ -488,7 +560,8 @@ module Qmf
key_count = @map.keyCount
a = 0
while a < key_count
- @by_hash[@map.key(a)] = by_key(@map.key(a))
+ key = @map.key(a)
+ @by_hash[key] = $util.qmf_to_native(@map.byKey(key))
a += 1
end
end
@@ -514,48 +587,9 @@ module Qmf
super.method_missing(name, args)
end
- def by_key(key)
- val = @map.byKey(key)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
- when TYPE_UINT64 then val.asUint64
- when TYPE_SSTR, TYPE_LSTR then val.asString
- when TYPE_ABSTIME then val.asInt64
- when TYPE_DELTATIME then val.asUint64
- when TYPE_REF then ObjectId.new(val.asObjectId)
- when TYPE_BOOL then val.asBool
- when TYPE_FLOAT then val.asFloat
- when TYPE_DOUBLE then val.asDouble
- when TYPE_UUID then val.asUuid
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
- when TYPE_INT64 then val.asInt64
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
- end
- end
-
def set(key, value)
val = @map.byKey(key)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(value)
- when TYPE_UINT64 then val.setUint64(value)
- when TYPE_SSTR, TYPE_LSTR then value ? val.setString(value) : val.setString('')
- when TYPE_ABSTIME then val.setInt64(value)
- when TYPE_DELTATIME then val.setUint64(value)
- when TYPE_REF then val.setObjectId(value.impl)
- when TYPE_BOOL then value ? val.setBool(value) : val.setBool(0)
- when TYPE_FLOAT then val.setFloat(value)
- when TYPE_DOUBLE then val.setDouble(value)
- when TYPE_UUID then val.setUuid(value)
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(value)
- when TYPE_INT64 then val.setInt64(value)
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
- end
+ $util.native_to_qmf(val, value)
end
end
diff --git a/qpid/cpp/bindings/qmf/ruby/ruby.i b/qpid/cpp/bindings/qmf/ruby/ruby.i
index b7fed403bd..0101861100 100644
--- a/qpid/cpp/bindings/qmf/ruby/ruby.i
+++ b/qpid/cpp/bindings/qmf/ruby/ruby.i
@@ -76,7 +76,7 @@
if (TYPE($input) == T_BIGNUM)
$1 = NUM2ULL($input);
else
- $1 = (uint64_t) FIX2LONG($input);
+ $1 = (uint64_t) FIX2ULONG($input);
}
%typemap (out) uint64_t