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

 @file         PVRTMemoryFileSystem.h
 @copyright    Copyright (c) Imagination Technologies Limited.
 @brief        Memory file system for resource files.

******************************************************************************/
#ifndef _PVRTMEMORYFILE_H_
#define _PVRTMEMORYFILE_H_

#include "PVRTGlobal.h"
#include <stddef.h>

/*!****************************************************************************
 @class        CPVRTMemoryFileSystem
 @brief        Memory file system for resource files.
******************************************************************************/
class CPVRTMemoryFileSystem
{
public:
	/*!***************************************************************************
     @brief      	Constructor. Creates a CPVRTMemoryFileSystem object based on the parameters supplied.
	 @param[in]		pszFilename		Name of file to register
	 @param[in]		pBuffer			Pointer to file data
	 @param[in]		Size			File size
	 @param[in]		bCopy			Name and data should be copied?
	*****************************************************************************/
    CPVRTMemoryFileSystem(const char* pszFilename, const void* pBuffer, size_t Size, bool bCopy = false);

	/*!***************************************************************************
	 @fn           	RegisterMemoryFile
	 @param[in]		pszFilename		Name of file to register
	 @param[in]		pBuffer			Pointer to file data
	 @param[in]		Size			File size
	 @param[in]		bCopy			Name and data should be copied?
	 @brief      	Registers a block of memory as a file that can be looked up
	                by name.
	*****************************************************************************/
	static void RegisterMemoryFile(const char* pszFilename, const void* pBuffer, size_t Size, bool bCopy = false);

	/*!***************************************************************************
	 @fn           	GetFile
	 @param[in]		pszFilename		Name of file to open
	 @param[out]	ppBuffer		Pointer to file data
	 @param[out]	pSize			File size
	 @return		true if the file was found in memory, false otherwise
	 @brief      	Looks up a file in the memory file system by name. Returns a
	                pointer to the file data as well as its size on success.
	*****************************************************************************/
	static bool GetFile(const char* pszFilename, const void** ppBuffer, size_t* pSize);

	/*!***************************************************************************
	 @fn           	GetNumFiles
	 @return		The number of registered files
	 @brief      	Getter for the number of registered files
	*****************************************************************************/
	static int GetNumFiles();

	/*!***************************************************************************
	 @fn           	GetFilename
	 @param[in]		i32Index		Index of file
	 @return		A pointer to the filename of the requested file
	 @brief      	Looks up a file in the memory file system by name. Returns a
	                pointer to the file data as well as its size on success.
	*****************************************************************************/
	static const char* GetFilename(int i32Index);

protected:
    /*!***************************************************************************
	 @class         CAtExit
	 @brief      	Provides a deconstructor for platforms that don't support the atexit() function.
	*****************************************************************************/
	class CAtExit
	{
	public:
		/*!***************************************************************************
		@brief      Destructor of CAtExit class. Workaround for platforms that
		            don't support the atexit() function. This deletes any memory
					file system data.
		*****************************************************************************/
		~CAtExit();
	};
	static CAtExit s_AtExit;

	friend class CAtExit;

    /*!***************************************************************************
	 @struct        SFileInfo
	 @brief      	Struct which contains information on a single file.
	*****************************************************************************/
	struct SFileInfo
	{
		const char* pszFilename;        ///< File name.
		const void* pBuffer;            ///< Pointer to file data.
		size_t Size;                    ///< File size.
		bool bAllocated;                ///< File was allocated. If true, this file will be deleted on exit.
	};
	static SFileInfo* s_pFileInfo;
	static int s_i32NumFiles;
	static int s_i32Capacity;
};

#endif // _PVRTMEMORYFILE_H_

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