/*
 * 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_PATTERN_LOGGING_EVENT_PATTERN_CONVERTER_H
#define _LOG4CXX_PATTERN_LOGGING_EVENT_PATTERN_CONVERTER_H

#include <log4cxx/pattern/patternconverter.h>
#include <log4cxx/spi/loggingevent.h>

namespace log4cxx
{

namespace pattern
{
/**
* LoggingEventPatternConverter is a base class for pattern converters
* that can format information from instances of LoggingEvent.
*
*
*
*
*/
class LOG4CXX_EXPORT LoggingEventPatternConverter : public PatternConverter
{
	protected:
		/**
		 * Constructs an instance of LoggingEventPatternConverter.
		 * @param name name of converter.
		 * @param style CSS style for output.
		 */
		LoggingEventPatternConverter(
			const LogString& name, const LogString& style);

	public:
		DECLARE_LOG4CXX_PATTERN(LoggingEventPatternConverter)
		BEGIN_LOG4CXX_CAST_MAP()
		LOG4CXX_CAST_ENTRY(LoggingEventPatternConverter)
		LOG4CXX_CAST_ENTRY_CHAIN(PatternConverter)
		END_LOG4CXX_CAST_MAP()

		/**
		 * Formats an event into a string buffer.
		 * @param event event to format, may not be null.
		 * @param toAppendTo string buffer to which the formatted event will be appended.  May not be null.
		 * @param p pool for memory allocations needing during format.
		 */
		virtual void format(
			const log4cxx::spi::LoggingEventPtr& event,
			LogString& toAppendTo,
			log4cxx::helpers::Pool& p) const = 0;

		void format(const log4cxx::helpers::ObjectPtr& obj,
			LogString& toAppendTo,
			log4cxx::helpers::Pool& p) const;

		/**
		 * Normally pattern converters are not meant to handle Exceptions although
		 * few pattern converters might.
		 *
		 * By examining the return values for this method, the containing layout will
		 * determine whether it handles throwables or not.

		 * @return true if this PatternConverter handles throwables
		 */
		virtual bool handlesThrowable() const;
};

LOG4CXX_PTR_DEF(LoggingEventPatternConverter);

}
}

#endif
