&{AMQP_ServerOperations.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_ServerOperations__
#define qpid_framing_AMQP_ServerOperations__

#include <sstream>

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

namespace qpid {
namespace framing {

class AMQP_ServerProxy;
class AMQP_ClientProxy;

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

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

    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} ${soh_inner_class}

    // Method handler get methods

%{CLIST} ${soh_method_handler_get_method}

}; /* class AMQP_ServerOperations */

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

#endif
