From b2efcb6ed3e1e2104836928cda81ed69f2f24559 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Sun, 5 Aug 2007 13:25:36 +0000 Subject: 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 --- cpp/rubygen/templates/Session.rb | 136 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 cpp/rubygen/templates/Session.rb (limited to 'cpp/rubygen/templates/Session.rb') 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 < +#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 <stop(); + parent->released(impl); +} + +EOS + + @amqp.classes.each { |c| define_class(c) if !excludes.include?(c.name) } + + gen <