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
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#!/usr/bin/env ruby
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Usage: output_directory xml_spec_file [xml_spec_file...]
#
$: << '..'
require 'cppgen'
require 'fileutils'
require 'etc'
require 'pathname'
class OperationsGen < CppGen
def initialize(chassis, outdir, amqp)
super(outdir, amqp)
@chassis=chassis
@classname="AMQP_#{@chassis.caps}Operations"
end
def handler_method (m)
return_type = m.result ? m.result.cpptype.ret_by_val : "void"
gen "\nvirtual #{return_type} #{m.cppname}("
gen m.signature.join(",\n")
gen ") = 0;\n"
end
def handler_classname(c) c.name.caps+"Handler"; end
def methods_on(parent, chassis)
chassis == "all" ? parent.methods_ : parent.methods_on(chassis)
end
def handler_class(c)
m = methods_on(c,@chassis)
if (not m.empty?)
handlerclass=handler_classname c
gen <<EOS
// ==================== class #{handlerclass} ====================
class #{handlerclass} {
// Constructors and destructors
public:
class Invoker; // Declared in #{@chassis.caps}Invoker
#{handlerclass}(){};
virtual ~#{handlerclass}() {}
// Protocol methods
EOS
m.each { |m| handler_method(m) if !m.content() }
gen <<EOS
}; // class #{handlerclass}
EOS
end
end
def handler_get(c)
m = methods_on(c,@chassis)
if (not m.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 #{@classname} {
public:
class Invoker; // Declared in #{@chassis.caps}Invoker
virtual ~#{@classname}() {}
virtual ProtocolVersion getVersion() const = 0;
// Inner classes
EOS
indent { @amqp.classes.each { |c| handler_class(c) } }
gen <<EOS
// Method handler get methods
EOS
indent { @amqp.classes.each { |c| handler_get(c) } }
gen <<EOS
}; /* class #{@classname} */
}}
EOS
}
end
end
OperationsGen.new("client",$outdir, $amqp).generate()
OperationsGen.new("server",$outdir, $amqp).generate()
OperationsGen.new("all",$outdir, $amqp).generate()
|