&{AMQP_ClientOperations.h}
/*
 *
 * 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.
 *
 */

/*
 * This file is auto-generated by ${GENERATOR} - do not modify.
 * Supported AMQP versions:
%{VLIST} *   ${major}-${minor}
 */

#ifndef qpid_framing_AMQP_ClientOperations__
#define qpid_framing_AMQP_ClientOperations__

#include <sstream>

#include <FieldTable.h>
#include <ProtocolVersion.h>
#include <ProtocolVersionException.h>

namespace qpid {
namespace framing {

class AMQP_ClientProxy;

class AMQP_ClientOperations
{
protected:
    ProtocolVersion version;
	AMQP_ClientOperations() {}

public:
    AMQP_ClientOperations(u_int8_t major, u_int8_t minor) : version(major, minor) {}
    AMQP_ClientOperations(ProtocolVersion& version) : version(version) {}
    virtual ~AMQP_ClientOperations() {}

    inline u_int8_t getMajor() const { return version.getMajor(); }
    inline u_int8_t getMinor() const { return version.getMinor(); }
    inline const ProtocolVersion& getVersion() const { return version; }
    inline bool isVersion(u_int8_t _major, u_int8_t _minor) const
    {
        return version.equals(_major, _minor);
    }
    inline bool isVersion(ProtocolVersion& _version) const
    {
        return version.equals(_version);
    }

	// Include framing constant declarations
	#include <AMQP_Constants.h>
	
    // Inner classes

%{CLIST} ${coh_inner_class}
	
    // Method handler get methods

%{CLIST} ${coh_method_handler_get_method}

}; /* class AMQP_ClientOperations */

} /* namespace framing */
} /* namespace qpid */

#endif
