/*
 *
 * 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.
 *
 */
using System;
using log4net;

namespace Qpid.Framing
{
    /// <summary>
    /// Thrown when a frame cannot be decoded. This generally indicates a mismatch between the broker and the
    /// client.
    /// </summary>
    public class AMQFrameDecodingException : AMQException
    {
        public AMQFrameDecodingException(string message)
            : base(message)
        {
        }

        public AMQFrameDecodingException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        public AMQFrameDecodingException(ILog logger, string message)
            : base(logger, message)
        {
        }

        public AMQFrameDecodingException(ILog logger, string message, Exception innerException)
            : base(logger, message, innerException)
        {
        }            
    }
}
