blob: 79b82a9d59c5d81081df3a1781f9541f6a17b90c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#!/usr/bin/env ruby
# Usage: output_directory xml_spec_file [xml_spec_file...]
#
$: << '..'
require 'cppgen'
class OperationsGen < CppGen
def initialize(chassis, outdir, amqp)
super(outdir, amqp)
@chassis=chassis
@classname="AMQP_#{@chassis.caps}Operations"
end
def handler_method (m)
if (m.has_result?)
return_type = "#{m.amqp_parent.name.caps}#{m.cppname.caps}Result"
else
return_type = "void"
end
if (m.amqp_parent.name == "message" && (m.name == "transfer" || m.name == "append"))
gen "\nvirtual #{return_type} #{m.cppname}(const framing::AMQMethodBody& context) = 0;\n"
else
gen "\nvirtual #{return_type} #{m.cppname}("
gen m.signature.join(",\n")
gen ") = 0;\n"
end
end
def handler_classname(c) c.name.caps+"Handler"; end
def handler_class(c)
if (!c.amqp_methods_on(@chassis).empty?)
handlerclass=handler_classname c
gen <<EOS
// ==================== class #{handlerclass} ====================
class #{handlerclass} : public virtual Invocable {
// Constructors and destructors
public:
#{handlerclass}(){};
virtual ~#{handlerclass}() {}
// Protocol methods
EOS
c.amqp_methods_on(@chassis).each { |m| handler_method(m) }
gen <<EOS
}; // class #{handlerclass}
EOS
end
end
def handler_get(c)
if (!c.amqp_methods_on(@chassis).empty?)
handlerclass=handler_classname c
gen "virtual #{handlerclass}* get#{handlerclass}() = 0;\n"
end
end
def generate()
h_file("qpid/framing/#{@classname}.h") {
gen <<EOS
#include <sstream>
#include "qpid/framing/ProtocolVersion.h"
#include "qpid/framing/amqp_structs.h"
namespace qpid {
namespace framing {
class AMQMethodBody;
class Invocable
{
protected:
Invocable() {}
virtual ~Invocable() {}
};
class #{@classname} {
public:
virtual ~#{@classname}() {}
virtual ProtocolVersion getVersion() const = 0;
// Include framing constant declarations - why?
//#include "qpid/framing/AMQP_Constants.h"
// Inner classes
EOS
indent { @amqp.amqp_classes.each { |c| handler_class(c) } }
gen <<EOS
// Method handler get methods
EOS
indent { @amqp.amqp_classes.each { |c| handler_get(c) } }
gen <<EOS
}; /* class #{@classname} */
}}
EOS
}
end
end
OperationsGen.new("client",ARGV[0], Amqp).generate()
OperationsGen.new("server",ARGV[0], Amqp).generate()
|