/*
 * 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.
 */
#if !defined(PRINTWRITER_HEADER_GUARD_1357924680)
#define PRINTWRITER_HEADER_GUARD_1357924680



// Base include file.  Must be first.
#include <xalanc/PlatformSupport/PlatformSupportDefinitions.hpp>



// Base class header file.
#include <xalanc/PlatformSupport/Writer.hpp>



namespace XALAN_CPP_NAMESPACE {



class XALAN_PLATFORMSUPPORT_EXPORT PrintWriter : public Writer
{
public:

    /**
     * Constructor
     * 
     * @param fAutoFlush if true, the output will not be buffered
     */
    PrintWriter( bool   fAutoFlush = false, MemoryManager& theManager XALAN_DEFAULT_MEMMGR);

    MemoryManager& 
    getMemoryManager()
    {
        return m_memoryManager;
    }

    virtual
    ~PrintWriter();

    /**
     * Flush the stream, then check the error status.
     * 
     * @return true if no errors
     */
    virtual bool
    checkError() const = 0;

    // Functions inherited from Writer...

    virtual void
    close() = 0;

    virtual void
    flush() = 0;


    // Output functions inherited from Writer...

    virtual void
    write(
            const char*     s,
            size_t          theOffset = 0,
            size_t          theLength = npos) = 0;

    virtual void
    write(
            const XalanDOMChar*         s,
            XalanDOMString::size_type   theOffset = 0,
            XalanDOMString::size_type   theLength = XalanDOMString::npos) = 0;

    virtual void
    write(XalanDOMChar  c) = 0;

    virtual void
    write(
            const XalanDOMString&       s,
            XalanDOMString::size_type   theOffset = 0,
            XalanDOMString::size_type   theLength = XalanDOMString::npos) = 0;

    // Output functions which are new...

#if !defined(XALAN_BOOL_AS_INT)
    virtual void
    print(bool  b) = 0;
#endif

    virtual void
    print(char  c) = 0;

    virtual void
    print(
            const char*     s,
            size_t          theLength = npos) = 0;

    virtual void
    print(
            const XalanDOMChar*         s,
            XalanDOMString::size_type   theLength = XalanDOMString::npos) = 0;

    virtual void
    print(double    d) = 0;

    virtual void
    print(int   i) = 0;

    virtual void
    print(long  l) = 0;

    virtual void
    print(const XalanDOMString&     s) = 0;

    virtual void
    println() = 0;

#if !defined(XALAN_BOOL_AS_INT)
    virtual void
    println(bool    b) = 0;
#endif

    virtual void
    println(char    x) = 0;

    virtual void
    println(
            const char*     s,
            size_t          theLength = npos) = 0;

    virtual void
    println(
            const XalanDOMChar*         s,
            XalanDOMString::size_type   theLength = XalanDOMString::npos) = 0;

    virtual void
    println(double  x) = 0;

    virtual void
    println(int     x) = 0;

    virtual void
    println(long    x) = 0;

    virtual void
    println(const XalanDOMString&   s) = 0;

protected:

    const bool      m_fAutoFlush;

    MemoryManager&  m_memoryManager;

    // Some static strings to help derived classes...
    static const XalanDOMChar   s_trueString[];

    static const XalanDOMChar   s_falseString[];

    static const XalanDOMChar   s_newlineString[];

private:

    // Not implemented
    PrintWriter(const PrintWriter&);

    PrintWriter&
    operator=(const PrintWriter&);

    bool
    operator==(const PrintWriter&);
};



}



#endif  // PRINTWRITER_HEADER_GUARD_1357924680
