summaryrefslogtreecommitdiff
path: root/cpp/rubygen/templates/Session.rb
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2007-08-05 13:25:36 +0000
committerGordon Sim <gsim@apache.org>2007-08-05 13:25:36 +0000
commitb2efcb6ed3e1e2104836928cda81ed69f2f24559 (patch)
tree392ae403dcb0d32da3edaeaf8a1f497679d9102c /cpp/rubygen/templates/Session.rb
parentb2fadec5d86e278d96112e915e67aec934e91046 (diff)
downloadqpid-python-b2efcb6ed3e1e2104836928cda81ed69f2f24559.tar.gz
Added first cut of generated client interface.
Old channel interface still supported; shares SessionCore with the new interface. Todo: allow applications to signal completion of received commands; keywrod args for interface. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@562866 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/rubygen/templates/Session.rb')
-rw-r--r--cpp/rubygen/templates/Session.rb136
1 files changed, 136 insertions, 0 deletions
diff --git a/cpp/rubygen/templates/Session.rb b/cpp/rubygen/templates/Session.rb
new file mode 100644
index 0000000000..5289a6af30
--- /dev/null
+++ b/cpp/rubygen/templates/Session.rb
@@ -0,0 +1,136 @@
+#!/usr/bin/env ruby
+# Usage: output_directory xml_spec_file [xml_spec_file...]
+#
+$: << '..'
+require 'cppgen'
+
+class SessionGen < CppGen
+
+ def initialize(outdir, amqp)
+ super(outdir, amqp)
+ @chassis="server"
+ @classname="Session"
+ end
+
+ def declare_method (m)
+ gen "Response #{m.amqp_parent.name.lcaps}#{m.cppname.caps}("
+ if (m.content())
+ params=m.signature + ["const MethodContent& content"]
+ else
+ params=m.signature
+ end
+ indent { gen params.join(",\n") }
+ gen ");\n\n"
+ end
+
+ def declare_class(c)
+ c.methods_on(@chassis).each { |m| declare_method(m) }
+ end
+
+ def define_method (m)
+ gen "Response Session::#{m.amqp_parent.name.lcaps}#{m.cppname.caps}("
+ if (m.content())
+ params=m.signature + ["const MethodContent& content"]
+ else
+ params=m.signature
+ end
+ indent { gen params.join(",\n") }
+ gen "){\n\n"
+ indent (2) {
+ gen "return impl->send(AMQMethodBody::shared_ptr(new #{m.body_name}("
+ params = ["version"] + m.param_names
+ gen params.join(", ")
+ other_params=[]
+ if (m.content())
+ other_params << "content"
+ end
+ if m.responses().empty?
+ other_params << "false"
+ else
+ other_params << "true"
+ end
+ gen ")), #{other_params.join(", ")});\n"
+ }
+ gen "}\n\n"
+ end
+
+ def define_class(c)
+ c.methods_on(@chassis).each { |m| define_method(m) }
+ end
+
+ def generate()
+ excludes = ["channel", "connection", "session", "execution"]
+
+ h_file("qpid/client/#{@classname}.h") {
+ gen <<EOS
+#include <sstream>
+#include "qpid/framing/amqp_framing.h"
+#include "qpid/framing/ProtocolVersion.h"
+#include "qpid/framing/MethodContent.h"
+#include "ConnectionImpl.h"
+#include "Response.h"
+#include "SessionCore.h"
+
+namespace qpid {
+namespace client {
+
+using std::string;
+using framing::Content;
+using framing::FieldTable;
+using framing::MethodContent;
+using framing::SequenceNumberSet;
+
+class #{@classname} {
+ ConnectionImpl::shared_ptr parent;
+ SessionCore::shared_ptr impl;
+ framing::ProtocolVersion version;
+public:
+ #{@classname}(ConnectionImpl::shared_ptr, SessionCore::shared_ptr);
+ ~#{@classname}();
+
+ ReceivedContent::shared_ptr get() { return impl->get(); }
+ void close() { impl->close(); parent->released(impl); }
+
+EOS
+ indent { @amqp.classes.each { |c| declare_class(c) if !excludes.include?(c.name) } }
+ gen <<EOS
+}; /* class #{@classname} */
+}
+}
+EOS
+}
+
+ # .cpp file
+ cpp_file("qpid/client/#{@classname}.cpp") {
+ gen <<EOS
+#include "#{@classname}.h"
+#include "qpid/framing/AMQMethodBody.h"
+
+using std::string;
+using namespace qpid::framing;
+
+namespace qpid {
+namespace client {
+
+#{@classname}::#{@classname}(ConnectionImpl::shared_ptr _parent, SessionCore::shared_ptr _impl) : parent(_parent), impl(_impl) {}
+
+#{@classname}::~#{@classname}()
+{
+ impl->stop();
+ parent->released(impl);
+}
+
+EOS
+
+ @amqp.classes.each { |c| define_class(c) if !excludes.include?(c.name) }
+
+ gen <<EOS
+}} // namespace qpid::client
+EOS
+ }
+
+ end
+end
+
+SessionGen.new(ARGV[0], Amqp).generate()
+