/*
 * 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.
 */

#ifndef _LOG4CXX_HELPERS_EXCEPTION_H
#define _LOG4CXX_HELPERS_EXCEPTION_H

#include <exception>
#include <log4cxx/log4cxx.h>
#include <log4cxx/logstring.h>

namespace log4cxx
{
namespace helpers
{
/** The class Exception and its subclasses indicate conditions that a
reasonable application might want to catch.
*/
class LOG4CXX_EXPORT Exception : public ::std::exception
{
    public:
        Exception(const char* msg);
        Exception(const LogString& msg);
        Exception(const Exception& src);
        Exception& operator=(const Exception& src);
        const char* what() const throw();
    private:
        enum { MSG_SIZE = 128 };
        char msg[MSG_SIZE + 1];
}; // class Exception

/** RuntimeException is the parent class of those exceptions that can be
thrown during the normal operation of the process.
*/
class LOG4CXX_EXPORT RuntimeException : public Exception
{
    public:
        RuntimeException(log4cxx_status_t stat);
        RuntimeException(const LogString& msg);
        RuntimeException(const RuntimeException& msg);
        RuntimeException& operator=(const RuntimeException& src);
    private:
        static LogString formatMessage(log4cxx_status_t stat);
}; // class RuntimeException

/** Thrown when an application attempts to use null in a case where an
object is required.
*/
class LOG4CXX_EXPORT  NullPointerException : public RuntimeException
{
    public:
        NullPointerException(const LogString& msg);
        NullPointerException(const NullPointerException& msg);
        NullPointerException& operator=(const NullPointerException& src);
}; // class NullPointerException

/** Thrown to indicate that a method has been passed
an illegal or inappropriate argument.*/
class LOG4CXX_EXPORT IllegalArgumentException : public RuntimeException
{
    public:
        IllegalArgumentException(const LogString& msg);
        IllegalArgumentException(const IllegalArgumentException&);
        IllegalArgumentException& operator=(const IllegalArgumentException&);
}; // class IllegalArgumentException

/** Signals that an I/O exception of some sort has occurred. This class
is the general class of exceptions produced by failed or interrupted
I/O operations.
*/
class LOG4CXX_EXPORT IOException : public Exception
{
    public:
        IOException();
        IOException(log4cxx_status_t stat);
        IOException(const LogString& msg);
        IOException(const IOException& src);
        IOException& operator=(const IOException&);
    private:
        static LogString formatMessage(log4cxx_status_t stat);
};

class LOG4CXX_EXPORT MissingResourceException : public Exception
{
    public:
        MissingResourceException(const LogString& key);
        MissingResourceException(const MissingResourceException& src);
        MissingResourceException& operator=(const MissingResourceException&);
    private:
        static LogString formatMessage(const LogString& key);
};

class LOG4CXX_EXPORT PoolException : public Exception
{
    public:
        PoolException(log4cxx_status_t stat);
        PoolException(const PoolException& src);
        PoolException& operator=(const PoolException&);
    private:
        static LogString formatMessage(log4cxx_status_t stat);
};


class LOG4CXX_EXPORT MutexException : public Exception
{
    public:
        MutexException(log4cxx_status_t stat);
        MutexException(const MutexException& src);
        MutexException& operator=(const MutexException&);
    private:
        static LogString formatMessage(log4cxx_status_t stat);
};

class LOG4CXX_EXPORT InterruptedException : public Exception
{
    public:
        InterruptedException();
        InterruptedException(log4cxx_status_t stat);
        InterruptedException(const InterruptedException& src);
        InterruptedException& operator=(const InterruptedException&);
    private:
        static LogString formatMessage(log4cxx_status_t stat);
};

class LOG4CXX_EXPORT ThreadException
    : public Exception
{
    public:
        ThreadException(log4cxx_status_t stat);
        ThreadException(const LogString& msg);
        ThreadException(const ThreadException& src);
        ThreadException& operator=(const ThreadException&);
    private:
        static LogString formatMessage(log4cxx_status_t stat);
};

class LOG4CXX_EXPORT TranscoderException : public Exception
{
    public:
        TranscoderException(log4cxx_status_t stat);
        TranscoderException(const TranscoderException& src);
        TranscoderException& operator=(const TranscoderException&);
    private:
        static LogString formatMessage(log4cxx_status_t stat);
};

class LOG4CXX_EXPORT IllegalMonitorStateException
    : public Exception
{
    public:
        IllegalMonitorStateException(const LogString& msg);
        IllegalMonitorStateException(const IllegalMonitorStateException& msg);
        IllegalMonitorStateException& operator=(const IllegalMonitorStateException& msg);
};

/**
Thrown when an application tries to create an instance of a class using
the newInstance method in class Class, but the specified class object
cannot be instantiated because it is an interface or is an abstract class.
*/
class LOG4CXX_EXPORT InstantiationException : public Exception
{
    public:
        InstantiationException(const LogString& msg);
        InstantiationException(const InstantiationException& msg);
        InstantiationException& operator=(const InstantiationException& msg);
};

/**
Thrown when an application tries to load in a class through its
string name but no definition for the class with the specified name
could be found.
*/
class LOG4CXX_EXPORT ClassNotFoundException : public Exception
{
    public:
        ClassNotFoundException(const LogString& className);
        ClassNotFoundException(const ClassNotFoundException& msg);
        ClassNotFoundException& operator=(const ClassNotFoundException& msg);
    private:
        static LogString formatMessage(const LogString& className);
};


class NoSuchElementException : public Exception
{
    public:
        NoSuchElementException();
        NoSuchElementException(const NoSuchElementException&);
        NoSuchElementException& operator=(const NoSuchElementException&);
};

class IllegalStateException : public Exception
{
    public:
        IllegalStateException();
        IllegalStateException(const IllegalStateException&);
        IllegalStateException& operator=(const IllegalStateException&);
};

/** Thrown to indicate that there is an error in the underlying
protocol, such as a TCP error.
*/
class LOG4CXX_EXPORT SocketException : public IOException
{
    public:
        SocketException(const LogString& msg);
        SocketException(log4cxx_status_t status);
        SocketException(const SocketException&);
        SocketException& operator=(const SocketException&);
};

/** Signals that an error occurred while attempting to connect a socket
to a remote address and port. Typically, the connection was refused
remotely (e.g., no process is listening on the remote address/port).
*/
class LOG4CXX_EXPORT ConnectException : public SocketException
{
    public:
        ConnectException(log4cxx_status_t status);
        ConnectException(const ConnectException& src);
        ConnectException& operator=(const ConnectException&);
};

class LOG4CXX_EXPORT ClosedChannelException : public SocketException
{
    public:
        ClosedChannelException();
        ClosedChannelException(const ClosedChannelException& src);
        ClosedChannelException& operator=(const ClosedChannelException&);
};

/** Signals that an error occurred while attempting to bind a socket to
a local address and port. Typically, the port is in use, or the
requested local address could not be assigned.
*/
class LOG4CXX_EXPORT BindException : public SocketException
{
    public:
        BindException(log4cxx_status_t status);
        BindException(const BindException&);
        BindException& operator=(const BindException&);
};

/** Signals that an I/O operation has been interrupted. An
InterruptedIOException is thrown to indicate that an input or output
transfer has been terminated because the thread performing it was
interrupted. The field bytesTransferred  indicates how many bytes were
successfully transferred before the interruption occurred.
*/
class LOG4CXX_EXPORT InterruptedIOException : public IOException
{
    public:
        InterruptedIOException(const LogString& msg);
        InterruptedIOException(const InterruptedIOException&);
        InterruptedIOException& operator=(const InterruptedIOException&);
};


/** Signals that an I/O operation has been interrupted. An
InterruptedIOException is thrown to indicate that an input or output
transfer has been terminated because the thread performing it was
interrupted. The field bytesTransferred  indicates how many bytes were
successfully transferred before the interruption occurred.
*/
class LOG4CXX_EXPORT SocketTimeoutException : public InterruptedIOException
{
    public:
        SocketTimeoutException();
        SocketTimeoutException(const SocketTimeoutException&);
        SocketTimeoutException& operator=(const SocketTimeoutException&);
};


}  // namespace helpers
} // namespace log4cxx

#endif // _LOG4CXX_HELPERS_EXCEPTION_H
