/*
* Copyright 2006 Sony Computer Entertainment Inc.
*
* Licensed under the MIT Open Source License, for details please see license.txt or the website
* http://www.opensource.org/licenses/mit-license.php
*
*/ 

#ifndef __DAE_IO_PLUGIN_COMMON__
#define __DAE_IO_PLUGIN_COMMON__

#include <vector>
#include <dae/daeElement.h>
#include <dae/daeURI.h>
#include <dae/daeMetaAttribute.h>
#include <dae/daeIOPlugin.h>

class daeMetaElement;
class daeDocument;

/**
 * The @c daeIOPluginCommon class was created to serve as a base class for the common functionality
 * between the daeLIBXMLPlugin and daeTinyXMLPlugin classes.
 */
class DLLSPEC daeIOPluginCommon : public daeIOPlugin {
public:
	/**
	 * Constructor.
	 */
	daeIOPluginCommon();
	/**
	 * Destructor.
	 */
	virtual ~daeIOPluginCommon();

	virtual daeInt setMeta(daeMetaElement *topMeta);

	// Database setup	
	virtual void setDatabase(daeDatabase* database);

	// Operations
	virtual daeInt read(const daeURI& uri, daeString docBuffer);

protected:
	daeDatabase* database;

	// On failure, these functions return NULL
	virtual daeElementRef readFromFile(const daeURI& uri) = 0;
	virtual daeElementRef readFromMemory(daeString buffer, const daeURI& baseUri) = 0;

	// Reading support for subclasses
	typedef std::pair<daeString, daeString> attrPair;
	daeElementRef beginReadElement(daeElement* parentElement, 
	                               daeString elementName, 
	                               const std::vector<attrPair>& attributes,
	                               daeInt lineNumber);
	bool readElementText(daeElement* element, daeString text, daeInt elementLineNumber);

private:
	daeMetaElement* topMeta;
};

#endif //__DAE_IO_PLUGIN_COMMON__