#ifndef _QPXMLWRITER_H
#define _QPXMLWRITER_H
/*-------------------------------------------------------------------------
 * drawElements Quality Program Helper Library
 * -------------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed 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.
 *
 *//*!
 * \file
 * \brief Test log library
 *//*--------------------------------------------------------------------*/

#include "deDefs.h"

#include <stdio.h>

DE_BEGIN_EXTERN_C

typedef struct qpXmlWriter_s qpXmlWriter;

typedef enum qpXmlAttributeType_e
{
    QP_XML_ATTRIBUTE_STRING = 0,
    QP_XML_ATTRIBUTE_INT,
    QP_XML_ATTRIBUTE_BOOL,

    QP_XML_ATTRIBUTE_LAST
} qpXmlAttributeType;

typedef struct qpXmlAttribute_s
{
    const char *name;
    qpXmlAttributeType type;
    const char *stringValue;
    int intValue;
    bool boolValue;
} qpXmlAttribute;

DE_INLINE qpXmlAttribute qpSetStringAttrib(const char *name, const char *value)
{
    qpXmlAttribute attrib;
    attrib.name        = name;
    attrib.type        = QP_XML_ATTRIBUTE_STRING;
    attrib.stringValue = value;
    attrib.intValue    = -678;
    attrib.boolValue   = (bool)0xFFFFFFFFu;
    return attrib;
}

DE_INLINE qpXmlAttribute qpSetIntAttrib(const char *name, int value)
{
    qpXmlAttribute attrib;
    attrib.name        = name;
    attrib.type        = QP_XML_ATTRIBUTE_INT;
    attrib.stringValue = "<intAttrib>";
    attrib.intValue    = value;
    attrib.boolValue   = (bool)0xFFFFFFFFu;
    return attrib;
}

DE_INLINE qpXmlAttribute qpSetBoolAttrib(const char *name, bool value)
{
    qpXmlAttribute attrib;
    attrib.name        = name;
    attrib.type        = QP_XML_ATTRIBUTE_BOOL;
    attrib.stringValue = "<boolAttrib>";
    attrib.intValue    = -679;
    attrib.boolValue   = value;
    return attrib;
}
/*--------------------------------------------------------------------*//*!
 * \brief Create a file based XML Writer instance
 * \param fileName Name of the file
 * \param useCompression Set to true to use compression, if supported by implementation
 * \param flushAfterWrite Set to true to call fflush after writing each XML token
 * \return qpXmlWriter instance, or DE_NULL if cannot create file
 *//*--------------------------------------------------------------------*/
qpXmlWriter *qpXmlWriter_createFileWriter(FILE *outFile, bool useCompression, bool flushAfterWrite);

/*--------------------------------------------------------------------*//*!
 * \brief XML Writer instance
 * \param a    qpXmlWriter instance
 *//*--------------------------------------------------------------------*/
void qpXmlWriter_destroy(qpXmlWriter *writer);

/*--------------------------------------------------------------------*//*!
 * \brief XML Writer instance
 * \param a    qpXmlWriter instance
 *//*--------------------------------------------------------------------*/
void qpXmlWriter_flush(qpXmlWriter *writer);

/*--------------------------------------------------------------------*//*!
 * \brief Start XML document
 * \param writer qpXmlWriter instance
 * \param writeXmlHeader whether to write the <xml.. header
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
bool qpXmlWriter_startDocument(qpXmlWriter *writer, bool writeXmlHeader);

/*--------------------------------------------------------------------*//*!
 * \brief End XML document
 * \param writer qpXmlWriter instance
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
bool qpXmlWriter_endDocument(qpXmlWriter *writer);

/*--------------------------------------------------------------------*//*!
 * \brief Start XML element
 * \param writer qpXmlWriter instance
 * \param elementName Name of the element
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
bool qpXmlWriter_startElement(qpXmlWriter *writer, const char *elementName, int numAttribs,
                              const qpXmlAttribute *attribs);

/*--------------------------------------------------------------------*//*!
 * \brief End XML element
 * \param writer qpXmlWriter instance
 * \param elementName Name of the element
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
bool qpXmlWriter_endElement(qpXmlWriter *writer, const char *elementName);

/*--------------------------------------------------------------------*//*!
 * \brief Write raw string into XML document
 * \param writer qpXmlWriter instance
 * \param content String to be written
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
bool qpXmlWriter_writeString(qpXmlWriter *writer, const char *content);

/*--------------------------------------------------------------------*//*!
 * \brief Write base64 encoded data into XML document
 * \param writer    qpXmlWriter instance
 * \param data        Pointer to data to be written
 * \param numBytes    Length of data in bytes
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
bool qpXmlWriter_writeBase64(qpXmlWriter *writer, const uint8_t *data, size_t numBytes);

/*--------------------------------------------------------------------*//*!
 * \brief Convenience function for writing XML element
 * \param writer qpXmlWriter instance
 * \param elementName Name of the element
 * \param elementContent Contents of the element
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
bool qpXmlWriter_writeStringElement(qpXmlWriter *writer, const char *elementName, const char *elementContent);

DE_END_EXTERN_C

#endif /* _QPXMLWRITER_H */
