/*!****************************************************************************

 @file         PVRTResourceFile.h
 @copyright    Copyright (c) Imagination Technologies Limited.
 @brief        Simple resource file wrapper

******************************************************************************/
#ifndef _PVRTRESOURCEFILE_H_
#define _PVRTRESOURCEFILE_H_

#include <stdlib.h>
#include "PVRTString.h"

typedef void* (*PFNLoadFileFunc)(const char*, char** pData, size_t &size);
typedef bool  (*PFNReleaseFileFunc)(void* handle);

/*!***************************************************************************
 @class CPVRTResourceFile
 @brief Simple resource file wrapper
*****************************************************************************/
class CPVRTResourceFile
{
public:
	/*!***************************************************************************
	@fn       			SetReadPath
	@param[in]			pszReadPath The path where you would like to read from
	@brief      		Sets the read path
	*****************************************************************************/
	static void SetReadPath(const char* pszReadPath);

	/*!***************************************************************************
	@fn       			GetReadPath
	@return 			The currently set read path
	@brief      		Returns the currently set read path
	*****************************************************************************/
	static CPVRTString GetReadPath();

	/*!***************************************************************************
	@fn       			SetLoadReleaseFunctions
	@param[in]			pLoadFileFunc Function to use for opening a file
	@param[in]			pReleaseFileFunc Function to release any data allocated by the load function
	@brief      		This function is used to override the CPVRTResource file loading functions. If
	                    you pass NULL in as the load function CPVRTResource will use the default functions.
	*****************************************************************************/
	static void SetLoadReleaseFunctions(void* pLoadFileFunc, void* pReleaseFileFunc);

	/*!***************************************************************************
	@brief     			CPVRTResourceFile constructor
	@param[in]			pszFilename Name of the file you would like to open
	*****************************************************************************/
	CPVRTResourceFile(const char* pszFilename);

	/*!***************************************************************************
	@brief     			CPVRTResourceFile constructor
	@param[in]			pData A pointer to the data you would like to use
	@param[in]			i32Size The size of the data      		
	*****************************************************************************/
	CPVRTResourceFile(const char* pData, size_t i32Size);

	/*!***************************************************************************
	@fn       			~CPVRTResourceFile
	@brief      		Destructor
	*****************************************************************************/
	virtual ~CPVRTResourceFile();

	/*!***************************************************************************
	@fn       			IsOpen
	@return 			true if the file is open
	@brief      		Is the file open
	*****************************************************************************/
	bool IsOpen() const;

	/*!***************************************************************************
	@fn       			IsMemoryFile
	@return 			true if the file was opened from memory
	@brief      		Was the file opened from memory
	*****************************************************************************/
	bool IsMemoryFile() const;

	/*!***************************************************************************
	@fn       			Size
	@return 			The size of the opened file
	@brief      		Returns the size of the opened file
	*****************************************************************************/
	size_t Size() const;

	/*!***************************************************************************
	@fn       			DataPtr
	@return 			A pointer to the file data
	@brief      		Returns a pointer to the file data. If the data is expected
						to be a string don't assume that it is null-terminated.
	*****************************************************************************/
	const void* DataPtr() const;

	/*!***************************************************************************
	@fn       			Close
	@brief      		Closes the file
	*****************************************************************************/
	void Close();

protected:
	bool m_bOpen;
	bool m_bMemoryFile;
	size_t m_Size;
	const char* m_pData;
	void *m_Handle;

	static CPVRTString s_ReadPath;
	static PFNLoadFileFunc s_pLoadFileFunc;
	static PFNReleaseFileFunc s_pReleaseFileFunc;
};

#endif // _PVRTRESOURCEFILE_H_

/*****************************************************************************
 End of file (PVRTResourceFile.h)
*****************************************************************************/