/*
 * 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_SPI_ERROR_HANDLER_H
#define _LOG4CXX_SPI_ERROR_HANDLER_H

#if defined(_MSC_VER)
	#pragma warning ( push )
	#pragma warning ( disable: 4231 4251 4275 4786 )
#endif


#include <log4cxx/spi/optionhandler.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/appender.h>
#include <log4cxx/spi/loggingevent.h>

namespace log4cxx
{
namespace spi
{
class ErrorCode
{
	public:
		enum
		{
			GENERIC_FAILURE = 0,
			WRITE_FAILURE = 1,
			FLUSH_FAILURE = 2,
			CLOSE_FAILURE = 3,
			FILE_OPEN_FAILURE = 4,
			MISSING_LAYOUT = 5,
			ADDRESS_PARSE_FAILURE = 6
		};
};


/**
Appenders may delegate their error handling to
<code>ErrorHandlers</code>.

<p>Error handling is a particularly tedious to get right because by
definition errors are hard to predict and to reproduce.


<p>Please take the time to contact the author in case you discover
that errors are not properly handled. You are most welcome to
suggest new error handling policies or criticize existing policies.
*/
class LOG4CXX_EXPORT ErrorHandler : public virtual OptionHandler
{
	public:
		DECLARE_ABSTRACT_LOG4CXX_OBJECT(ErrorHandler)
		BEGIN_LOG4CXX_CAST_MAP()
		LOG4CXX_CAST_ENTRY(ErrorHandler)
		LOG4CXX_CAST_ENTRY(OptionHandler)
		END_LOG4CXX_CAST_MAP()

		virtual ~ErrorHandler() {}

		/**
		Add a reference to a logger to which the failing appender might
		be attached to. The failing appender will be searched and
		replaced only in the loggers you add through this method.

		@param logger One of the loggers that will be searched for the failing
		appender in view of replacement.
		*/
		virtual void setLogger(const LoggerPtr& logger) = 0;


		/**
		Equivalent to the error(const String&, helpers::Exception&, int,
		spi::LoggingEvent&) with the the event parameteter set to
		null.
		*/
		virtual void error(const LogString& message, const std::exception& e,
			int errorCode) const = 0;

		/**
		This method is normally used to just print the error message
		passed as a parameter.
		*/
		virtual void error(const LogString& message) const = 0;

		/**
		This method is invoked to handle the error.

		@param message The message assoicated with the error.
		@param e The Exption that was thrown when the error occured.
		@param errorCode The error code associated with the error.
		@param event The logging event that the failing appender is asked
		to log.
		*/
		virtual void error(const LogString& message, const std::exception& e,
			int errorCode, const LoggingEventPtr& event) const = 0;

		/**
		Set the appender for which errors are handled. This method is
		usually called when the error handler is configured.
		*/
		virtual void setAppender(const AppenderPtr& appender) = 0;

		/**
		Set the appender to fallback upon in case of failure.
		*/
		virtual void setBackupAppender(const AppenderPtr& appender) = 0;
};

LOG4CXX_PTR_DEF(ErrorHandler);
}  //namespace spi
} //namespace log4cxx

#if defined(_MSC_VER)
	#pragma warning ( pop )
#endif

#endif //_LOG4CXX_SPI_ERROR_HANDLER_H
