#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;
	deBool				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	= (deBool)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	= (deBool)0xFFFFFFFFu;
	return attrib;
}

DE_INLINE qpXmlAttribute qpSetBoolAttrib (const char* name, deBool 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 DE_TRUE to use compression, if supported by implementation
 * \param flushAfterWrite Set to DE_TRUE to call fflush after writing each XML token
 * \return qpXmlWriter instance, or DE_NULL if cannot create file
 *//*--------------------------------------------------------------------*/
qpXmlWriter*	qpXmlWriter_createFileWriter (FILE* outFile, deBool useCompression, deBool 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
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
deBool			qpXmlWriter_startDocument (qpXmlWriter* writer);

/*--------------------------------------------------------------------*//*!
 * \brief End XML document
 * \param writer qpXmlWriter instance
 * \return true on success, false on error
 *//*--------------------------------------------------------------------*/
deBool			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
 *//*--------------------------------------------------------------------*/
deBool			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
 *//*--------------------------------------------------------------------*/
deBool			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
 *//*--------------------------------------------------------------------*/
deBool			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
 *//*--------------------------------------------------------------------*/
deBool			qpXmlWriter_writeBase64 (qpXmlWriter* writer, const deUint8* 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
 *//*--------------------------------------------------------------------*/
deBool			qpXmlWriter_writeStringElement (qpXmlWriter* writer, const char* elementName, const char* elementContent);

DE_END_EXTERN_C

#endif /* _QPXMLWRITER_H */
