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