diff options
author | Alan Conway <aconway@apache.org> | 2007-08-09 00:03:43 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2007-08-09 00:03:43 +0000 |
commit | ba57e373864d44cfae17ec8c2c9de7a55f0b4113 (patch) | |
tree | bb16616df6e2a48b9cf164a52ca30fa99f90e1fd /cpp/rubygen | |
parent | b3eb629f662dc2df11ce3981a7c4cc8ab58a8c28 (diff) | |
download | qpid-python-ba57e373864d44cfae17ec8c2c9de7a55f0b4113.tar.gz |
Moved Proxy generation to rubygen.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@564051 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/rubygen')
-rwxr-xr-x | cpp/rubygen/amqpgen.rb | 6 | ||||
-rwxr-xr-x | cpp/rubygen/cppgen.rb | 6 | ||||
-rwxr-xr-x | cpp/rubygen/templates/Proxy.rb (renamed from cpp/rubygen/samples/Proxy.rb) | 56 |
3 files changed, 29 insertions, 39 deletions
diff --git a/cpp/rubygen/amqpgen.rb b/cpp/rubygen/amqpgen.rb index 31f7544011..ae8e4c5d1c 100755 --- a/cpp/rubygen/amqpgen.rb +++ b/cpp/rubygen/amqpgen.rb @@ -114,7 +114,8 @@ class AmqpClass < AmqpElement # chassis should be "client" or "server" def methods_on(chassis) - elements.collect("method/chassis[@name='#{chassis}']/..") { |m| + @cache_methods_on ||= { } + @cache_methods_on[chassis] ||= elements.collect("method/chassis[@name='#{chassis}']/..") { |m| AmqpMethod.new(m,self) }.sort_by_name end @@ -147,7 +148,8 @@ class AmqpRoot < AmqpElement # Return all methods on chassis for all classes. def methods_on(chassis) - classes.collect { |c| c.methods_on(chassis) }.flatten + @cache_methods_on ||= { } + @cache_methods_on[chassis] ||= classes.collect { |c| c.methods_on(chassis) }.flatten end # Merge contents of elements. diff --git a/cpp/rubygen/cppgen.rb b/cpp/rubygen/cppgen.rb index 371cc7cd05..86783b4e14 100755 --- a/cpp/rubygen/cppgen.rb +++ b/cpp/rubygen/cppgen.rb @@ -69,8 +69,8 @@ end # Additional methods for AmqpMethod class AmqpMethod def cppname() name.lcaps.cppsafe; end - def param_names() fields.collect { |f| f.cppname }; end - def signature() fields.collect { |f| f.cpptype+" "+f.cppname }; end + def param_names() @param_names ||= fields.collect { |f| f.cppname }; end + def signature() @signature ||= fields.collect { |f| f.cpptype+" "+f.cppname }; end def body_name() amqp_parent.name.caps+name.caps+"Body"; end end @@ -96,7 +96,7 @@ class AmqpRoot "table"=>["FieldTable", "const FieldTable&", "const FieldTable&"], "content"=>["Content", "const Content&", "const Content&"], "rfc1982-long-set"=>["SequenceNumberSet", "const SequenceNumberSet&", "const SequenceNumberSet&"], - "uuid"=>["Uuid", "const Uuid&", "const Uuid&"] + "uuid"=>["string", "const string&"] # FIXME should be: ["Uuid", "const Uuid&", "const Uuid&"] } def lookup(amqptype) diff --git a/cpp/rubygen/samples/Proxy.rb b/cpp/rubygen/templates/Proxy.rb index f7765f3729..16824b3083 100755 --- a/cpp/rubygen/samples/Proxy.rb +++ b/cpp/rubygen/templates/Proxy.rb @@ -8,10 +8,9 @@ class ProxyGen < CppGen super(outdir, amqp) @chassis=chassis @classname="AMQP_#{@chassis.caps}Proxy" + @filename="qpid/framing/#{@classname}" end - def include(m) gen "#include \"#{m.body_name}.h\"\n"; end - def proxy_member(c) c.name.lcaps+"Proxy"; end def inner_class_decl(c) @@ -22,6 +21,7 @@ class ProxyGen < CppGen { private: ChannelAdapter& channel; + RequestId responseTo; public: // Constructors and destructors @@ -31,7 +31,9 @@ class ProxyGen < CppGen virtual ~#{cname}() {} static #{cname}& get(#{@classname}& proxy) { return proxy.get#{cname}();} - + // set for response correlation + void setResponseTo(RequestId r) { responseTo = r; } + // Protocol methods EOS indent(2) { c.methods_on(@chassis).each { |m| inner_method_decl(m) } } @@ -39,7 +41,8 @@ EOS end def inner_method_decl(m) - gen "virtual void #{m.cppname}(#{m.signature.join(",\n ")})\n\n"; + genl "virtual RequestId #{m.cppname}(#{m.signature.join(",\n ")});" + genl end def inner_class_defn(c) @@ -49,30 +52,16 @@ EOS end def inner_method_defn(m,cname) - if m.response? - rettype="void" - ret="" - sigadd=["RequestId responseTo"] - paramadd=["channel.getVersion(), responseTo"] - else - rettype="RequestId" - ret="return " - sigadd=[] - paramadd=["channel.getVersion()"] - end - sig=(m.signature+sigadd).join(", ") - params=(paramadd+m.param_names).join(",\n ") - gen <<EOS -#{rettype} #{@classname}::#{cname}::#{m.cppname}(#{sig}) { - #{ret}channel.send(new #{m.body_name}(#{params})); -} - -EOS + genl "RequestId #{@classname}::#{cname}::#{m.cppname}(#{m.signature.join(", ")})" + scope { + params=(["channel.getVersion()"]+m.param_names).join(", ") + genl "return channel.send(make_shared_ptr(new #{m.body_name}(#{params})));" + } end def get_decl(c) cname=c.name.caps - gen " #{cname}& #{@classname}::get#{cname}();\n" + gen " #{cname}& get#{cname}();\n" end def get_defn(c) @@ -87,7 +76,7 @@ EOS def generate # .h file - h_file(@classname+".h") { + h_file(@filename) { gen <<EOS #include "qpid/framing/Proxy.h" @@ -118,14 +107,13 @@ EOS } # .cpp file - cpp_file(@classname+".cpp") { - gen <<EOS -#include <sstream> -#include "#{@classname}.h" -#include "qpid/framing/ChannelAdapter.h" -#include "qpid/framing/amqp_types_full.h" -EOS - @amqp.methods_on(@chassis).each { |m| include(m) } + cpp_file(@filename) { + include "<sstream>" + include "#{@classname}.h" + include "qpid/framing/ChannelAdapter.h" + include "qpid/framing/amqp_types_full.h" + @amqp.methods_on(@chassis).each { + |m| include "qpid/framing/#{m.body_name}.h" } gen <<EOS namespace qpid { namespace framing { @@ -142,7 +130,7 @@ EOS @amqp.classes.each { |c| get_defn(c) } gen " // Inner class implementation\n\n" @amqp.classes.each { |c| inner_class_defn(c) } - gen "}} // namespae qpid::framing" + genl "}} // namespae qpid::framing" } end end |