summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2011-01-11 17:58:04 +0000
committerTed Ross <tross@apache.org>2011-01-11 17:58:04 +0000
commit180f6554ab2755973026dfe6f47d94be9286da41 (patch)
tree19d2e704c06eef0ac36625fe8cb1df300efdaff3
parent411cf023d5e377886883e8b498b44f412d5d63ad (diff)
downloadqpid-python-180f6554ab2755973026dfe6f47d94be9286da41.tar.gz
Exposed asMap for DataAddr objects in Pyton and Ruby wrappers.
Enhanced the examples to show the passing of a DataAddr in an argument. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1057774 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp22
-rwxr-xr-xqpid/cpp/bindings/qmf2/examples/python/agent.py20
-rw-r--r--qpid/cpp/bindings/qmf2/python/qmf2.py5
-rw-r--r--qpid/cpp/bindings/qmf2/ruby/qmf2.rb1
-rw-r--r--qpid/cpp/bindings/swig_python_typemaps.i24
-rw-r--r--qpid/cpp/bindings/swig_ruby_typemaps.i19
6 files changed, 89 insertions, 2 deletions
diff --git a/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp b/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp
index 3ec42c8d86..51643e203a 100644
--- a/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp
+++ b/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp
@@ -48,6 +48,7 @@ private:
AgentSession session;
Schema sch_exception;
Schema sch_control;
+ Schema sch_child;
Data control;
DataAddr controlAddr;
@@ -120,11 +121,23 @@ void ExampleAgent::setupSchema()
failMethod.addArgument(SchemaProperty("details", SCHEMA_DATA_MAP, "{dir:IN}"));
sch_control.addMethod(failMethod);
+ SchemaMethod createMethod("create_child", "{desc:'Create Child Object'}");
+ createMethod.addArgument(SchemaProperty("name", SCHEMA_DATA_STRING, "{dir:IN}"));
+ createMethod.addArgument(SchemaProperty("childAddr", SCHEMA_DATA_MAP, "{dir:OUT}"));
+ sch_control.addMethod(createMethod);
+
+ //
+ // Declare the child class
+ //
+ sch_child = Schema(SCHEMA_TYPE_DATA, package, "child");
+ sch_child.addProperty(SchemaProperty("name", SCHEMA_DATA_STRING));
+
//
// Register our schemata with the agent session.
//
session.registerSchema(sch_exception);
session.registerSchema(sch_control);
+ session.registerSchema(sch_child);
}
void ExampleAgent::populateData()
@@ -185,6 +198,15 @@ bool ExampleAgent::method(AgentEvent& event)
session.raiseException(event, ex);
}
}
+
+ if (name == "create_child") {
+ const string& name(event.getArguments()["name"]);
+ Data child(sch_child);
+ child.setProperty("name", name);
+ DataAddr addr(session.addData(child, name));
+ event.addReturnArgument("childAddr", addr.asMap());
+ session.methodSuccess(event);
+ }
}
return true;
diff --git a/qpid/cpp/bindings/qmf2/examples/python/agent.py b/qpid/cpp/bindings/qmf2/examples/python/agent.py
index 84d2fe4615..66b7dbdc58 100755
--- a/qpid/cpp/bindings/qmf2/examples/python/agent.py
+++ b/qpid/cpp/bindings/qmf2/examples/python/agent.py
@@ -88,6 +88,14 @@ class ExampleAgent(AgentHandler):
ex.details = args['details']
self.session.raiseException(handle, ex)
+ elif methodName == "create_child":
+ name = args['name']
+ child = Data(self.sch_child)
+ child.name = name
+ addr = self.session.addData(child, name)
+ handle.addReturnArgument("childAddr", addr.asMap())
+ self.session.methodSuccess(handle)
+
def setupSchema(self):
"""
@@ -126,11 +134,23 @@ class ExampleAgent(AgentHandler):
failMethod.addArgument(SchemaProperty("details", SCHEMA_DATA_MAP, direction=DIR_IN))
self.sch_control.addMethod(failMethod)
+ createMethod = SchemaMethod("create_child", desc="Create Child Object")
+ createMethod.addArgument(SchemaProperty("name", SCHEMA_DATA_STRING, direction=DIR_IN))
+ createMethod.addArgument(SchemaProperty("childAddr", SCHEMA_DATA_MAP, direction=DIR_OUT))
+ self.sch_control.addMethod(createMethod)
+
+ ##
+ ## Declare a child object
+ ##
+ self.sch_child = Schema(SCHEMA_TYPE_DATA, package, "child")
+ self.sch_child.addProperty(SchemaProperty("name", SCHEMA_DATA_STRING))
+
##
## Register our schemata with the agent session.
##
self.session.registerSchema(self.sch_exception)
self.session.registerSchema(self.sch_control)
+ self.session.registerSchema(self.sch_child)
def populateData(self):
diff --git a/qpid/cpp/bindings/qmf2/python/qmf2.py b/qpid/cpp/bindings/qmf2/python/qmf2.py
index 911b080dfd..37efb8708b 100644
--- a/qpid/cpp/bindings/qmf2/python/qmf2.py
+++ b/qpid/cpp/bindings/qmf2/python/qmf2.py
@@ -533,6 +533,11 @@ class DataAddr(object):
self.getName() == other.getName() and \
self.getAgentEpoch() == other.getAgentEpoch()
+ def asMap(self):
+ """
+ """
+ return self._impl.asMap()
+
def getAgentName(self):
"""
"""
diff --git a/qpid/cpp/bindings/qmf2/ruby/qmf2.rb b/qpid/cpp/bindings/qmf2/ruby/qmf2.rb
index 65cc695c45..86ba72cc0b 100644
--- a/qpid/cpp/bindings/qmf2/ruby/qmf2.rb
+++ b/qpid/cpp/bindings/qmf2/ruby/qmf2.rb
@@ -404,6 +404,7 @@ module Qmf2
return @impl == other.impl
end
+ def as_map() @impl.asMap end
def agent_name() @impl.getAgentName end
def name() @impl.getName end
def agent_epoch() @impl.getAgentEpoch end
diff --git a/qpid/cpp/bindings/swig_python_typemaps.i b/qpid/cpp/bindings/swig_python_typemaps.i
index 57046d2944..a233641940 100644
--- a/qpid/cpp/bindings/swig_python_typemaps.i
+++ b/qpid/cpp/bindings/swig_python_typemaps.i
@@ -274,12 +274,24 @@ typedef int Py_ssize_t;
/*
* Variant types: C++ --> Python
*/
+%typemap(out) qpid::types::Variant::Map {
+ $result = MapToPy(&$1);
+ if ($result)
+ Py_INCREF($result);
+}
+
%typemap(out) qpid::types::Variant::Map& {
$result = MapToPy($1);
if ($result)
Py_INCREF($result);
}
+%typemap(out) qpid::types::Variant::List {
+ $result = ListToPy(&$1);
+ if ($result)
+ Py_INCREF($result);
+}
+
%typemap(out) qpid::types::Variant::List& {
$result = ListToPy($1);
if ($result)
@@ -344,6 +356,16 @@ typedef int Py_ssize_t;
$1 = PyList_Check($input) ? 1 : 0;
}
+%typemap(typecheck) qpid::types::Variant& {
+ $1 = (PyFloat_Check($input) ||
+ PyString_Check($input) ||
+ PyInt_Check($input) ||
+ PyLong_Check($input) ||
+ PyDict_Check($input) ||
+ PyList_Check($input) ||
+ PyBool_Check($input)) ? 1 : 0;
+}
+
%typemap(typecheck) const qpid::types::Variant::Map const & {
$1 = PyDict_Check($input) ? 1 : 0;
}
@@ -352,7 +374,7 @@ typedef int Py_ssize_t;
$1 = PyList_Check($input) ? 1 : 0;
}
-%typemap(typecheck) qpid::types::Variant& {
+%typemap(typecheck) const qpid::types::Variant const & {
$1 = (PyFloat_Check($input) ||
PyString_Check($input) ||
PyInt_Check($input) ||
diff --git a/qpid/cpp/bindings/swig_ruby_typemaps.i b/qpid/cpp/bindings/swig_ruby_typemaps.i
index b91ca7dfb9..79e679663d 100644
--- a/qpid/cpp/bindings/swig_ruby_typemaps.i
+++ b/qpid/cpp/bindings/swig_ruby_typemaps.i
@@ -237,10 +237,18 @@
/*
* Variant types: C++ --> Ruby
*/
+%typemap(out) qpid::types::Variant::Map {
+ $result = MapToRb(&$1);
+}
+
%typemap(out) qpid::types::Variant::Map& {
$result = MapToRb($1);
}
+%typemap(out) qpid::types::Variant::List {
+ $result = ListToRb(&$1);
+}
+
%typemap(out) qpid::types::Variant::List& {
$result = ListToRb($1);
}
@@ -301,6 +309,15 @@
$1 = (TYPE($input) == T_ARRAY) ? 1 : 0;
}
+%typemap(typecheck) qpid::types::Variant& {
+ $1 = (TYPE($input) == T_FLOAT ||
+ TYPE($input) == T_STRING ||
+ TYPE($input) == T_FIXNUM ||
+ TYPE($input) == T_BIGNUM ||
+ TYPE($input) == T_TRUE ||
+ TYPE($input) == T_FALSE) ? 1 : 0;
+}
+
%typemap(typecheck) qpid::types::Variant::Map const & {
$1 = (TYPE($input) == T_HASH) ? 1 : 0;
}
@@ -309,7 +326,7 @@
$1 = (TYPE($input) == T_ARRAY) ? 1 : 0;
}
-%typemap(typecheck) qpid::types::Variant& {
+%typemap(typecheck) const qpid::types::Variant const & {
$1 = (TYPE($input) == T_FLOAT ||
TYPE($input) == T_STRING ||
TYPE($input) == T_FIXNUM ||