blob: cd6a363c562e0250c8f48b4145409a50a2a90a57 [file] [log] [blame]
#!/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()