#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
 * \return qpXmlWriter instance, or DE_NULL if cannot create file
 *//*--------------------------------------------------------------------*/
qpXmlWriter*	qpXmlWriter_createFileWriter (FILE* outFile, deBool useCompression);

/*--------------------------------------------------------------------*//*!
 * \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, int 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 */