/*
* 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;

namespace Apache.NMS
{
    [Serializable]
    public class TransactionRolledBackException : NMSException
    {
        public TransactionRolledBackException()
            : base()
        {
        }

        public TransactionRolledBackException(string message)
            : base(message)
        {
        }

        public TransactionRolledBackException(string message, string errorCode)
            : base(message, errorCode)
        {
        }

        public TransactionRolledBackException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        public TransactionRolledBackException(string message, string errorCode, Exception innerException)
            : base(message, errorCode, innerException)
        {
        }

        #region ISerializable interface implementation

#if !NETCF

        /// <summary>
        /// Initializes a new instance of the TransactionRolledBackException class with serialized data.
        /// Throws System.ArgumentNullException if the info parameter is null.
        /// Throws System.Runtime.Serialization.SerializationException if the class name is null or System.Exception.HResult is zero (0).
        /// </summary>
        /// <param name="info">The SerializationInfo that holds the serialized object data about the exception being thrown.</param>
        /// <param name="context">The StreamingContext that contains contextual information about the source or destination.</param>
        protected TransactionRolledBackException(System.Runtime.Serialization.SerializationInfo info,
            System.Runtime.Serialization.StreamingContext context)
            : base(info, context)
        {
        }

#endif

        #endregion
    }
}