/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkXMLWriter_DEFINED
#define SkXMLWriter_DEFINED

#include "include/core/SkString.h"
#include "include/private/SkTDArray.h"
#include "src/xml/SkDOM.h"

class SkWStream;
class SkXMLParser;

class SkXMLWriter {
public:
            SkXMLWriter(bool doEscapeMarkup = true);
    virtual ~SkXMLWriter();

    void    addS32Attribute(const char name[], int32_t value);
    void    addAttribute(const char name[], const char value[]);
    void    addAttributeLen(const char name[], const char value[], size_t length);
    void    addHexAttribute(const char name[], uint32_t value, int minDigits = 0);
    void    addScalarAttribute(const char name[], SkScalar value);
    void    addText(const char text[], size_t length);
    void    endElement() { this->onEndElement(); }
    void    startElement(const char elem[]);
    void    startElementLen(const char elem[], size_t length);
    void    writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot);
    void    flush();
    virtual void writeHeader();

protected:
    virtual void onStartElementLen(const char elem[], size_t length) = 0;
    virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0;
    virtual void onAddText(const char text[], size_t length) = 0;
    virtual void onEndElement() = 0;

    struct Elem {
        Elem(const char name[], size_t len)
            : fName(name, len)
            , fHasChildren(false)
            , fHasText(false) {}

        SkString    fName;
        bool        fHasChildren;
        bool        fHasText;
    };
    void doEnd(Elem* elem);
    bool doStart(const char name[], size_t length);
    Elem* getEnd();
    const char* getHeader();
    SkTDArray<Elem*> fElems;

private:
    bool fDoEscapeMarkup;
    // illegal
    SkXMLWriter& operator=(const SkXMLWriter&);
};

class SkXMLStreamWriter : public SkXMLWriter {
public:
    enum : uint32_t {
        kNoPretty_Flag = 0x01,
    };

    SkXMLStreamWriter(SkWStream*, uint32_t flags = 0);
    ~SkXMLStreamWriter() override;
    void writeHeader() override;

protected:
    void onStartElementLen(const char elem[], size_t length) override;
    void onEndElement() override;
    void onAddAttributeLen(const char name[], const char value[], size_t length) override;
    void onAddText(const char text[], size_t length) override;

private:
    void newline();
    void tab(int lvl);

    SkWStream&      fStream;
    const uint32_t  fFlags;
};

class SkXMLParserWriter : public SkXMLWriter {
public:
    SkXMLParserWriter(SkXMLParser*);
    ~SkXMLParserWriter() override;
protected:
    void onStartElementLen(const char elem[], size_t length) override;
    void onEndElement() override;
    void onAddAttributeLen(const char name[], const char value[], size_t length) override;
    void onAddText(const char text[], size_t length) override;
private:
    SkXMLParser&        fParser;
};


#endif
