208 lines
6.1 KiB
C++
208 lines
6.1 KiB
C++
|
|
#ifndef VXBIGFILE_H
|
|
#define VXBIGFILE_H
|
|
|
|
#include "FixedSizeAllocator.h"
|
|
#include "VxCachedFile.h"
|
|
#include "XUtil.h"
|
|
|
|
#ifdef macintosh
|
|
#include <stdio.h>
|
|
#else
|
|
#ifndef _WIN32_WCE
|
|
#include <cstdio>
|
|
#include <stdarg.h>
|
|
#include <sys/stat.h>
|
|
#else
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#endif
|
|
#endif
|
|
|
|
/************************************************************
|
|
The VxSubFile is a special implementation of the VxStream
|
|
It gives access to a file stored inside a big file (concatenation of
|
|
several files in a single,bigger file).
|
|
See Also: VxBigFile
|
|
*************************************************************/
|
|
class VxSubFile : public VxStream
|
|
{
|
|
public:
|
|
|
|
VxSubFile():m_File(NULL),m_Start(0),m_Size(0) {}
|
|
VX_EXPORT void Set(VxFile* iBigFile, XDWORD iOffset, XDWORD iSize);
|
|
|
|
// Virtual overridings
|
|
VX_EXPORT XDWORD Position();
|
|
VX_EXPORT XDWORD Size();
|
|
VX_EXPORT XBOOL IsValid();
|
|
VX_EXPORT XBOOL Seek(int iOffset, SeekMode iOrigin);
|
|
VX_EXPORT XDWORD Read(void* oBuffer, XDWORD iSize);
|
|
VX_EXPORT XDWORD Write(const void* iBuffer, XDWORD iSize);
|
|
protected:
|
|
void EnsurePosition();
|
|
VxFile* m_File;
|
|
XDWORD m_Start;
|
|
XDWORD m_Size;
|
|
XDWORD m_Position;
|
|
|
|
};
|
|
|
|
|
|
/******************************************************************
|
|
A VxBigFile is used to store several files together in a single file.
|
|
Files stored in a big file can be accessed as normal files with the Find method
|
|
which fills a VxSubFile class with the appropriate data to read the sub file content.
|
|
*******************************************************************/
|
|
class VxBigFile
|
|
{
|
|
public:
|
|
|
|
/*******************************************
|
|
A Callback class that can be implemented to handle the progression
|
|
of VxBigFile::Save operation.
|
|
*******************************************/
|
|
class ProgressionCallback
|
|
{
|
|
public:
|
|
// Progression value from 0 to 100
|
|
virtual void Progress(const int iProgression) = 0;
|
|
};
|
|
|
|
#if (defined(PSX2) || defined(PSP))
|
|
/***********************************************
|
|
File buffers as stored inside the big file
|
|
************************************************/
|
|
struct Chunk
|
|
{
|
|
|
|
Chunk():buffersize(0),offset(0) {}
|
|
XDWORD offset; // offset inside the bigfile
|
|
int buffersize; // if buffersize is <= 0, the buffer contains a file path, not yet loaded
|
|
};
|
|
#else
|
|
/***********************************************
|
|
File buffers as stored inside the big file
|
|
************************************************/
|
|
struct Chunk
|
|
{
|
|
|
|
Chunk():buffer(NULL),buffersize(0),offset(0) {}
|
|
|
|
~Chunk()
|
|
{
|
|
delete [] (XBYTE*)buffer;
|
|
}
|
|
XString name; // Filename
|
|
XDWORD offset; // offset inside the bigfile
|
|
void* buffer; // memory buffer or NULL if this chunk reference a not yet loaded file
|
|
int buffersize; // if buffersize is <= 0, the buffer contains a file path, not yet loaded
|
|
};
|
|
#endif
|
|
|
|
#if (defined(PSX2) || defined(PSP))
|
|
typedef XHashTable<Chunk, const char*> ChunkTable;
|
|
#else
|
|
typedef XHashTable<Chunk*, const char*> ChunkTable;
|
|
#endif
|
|
|
|
|
|
VX_EXPORT ~VxBigFile();
|
|
|
|
/*******************************************************************
|
|
Opens an existing BigFile
|
|
*******************************************************************/
|
|
VX_EXPORT XBOOL Open(const char* iFileName, XBOOL iKeepOrder = TRUE);
|
|
/*******************************************************************
|
|
Creates a BigFile containing all the files appended.
|
|
*******************************************************************/
|
|
VX_EXPORT XBOOL Save(const char* iFileName = NULL, ProgressionCallback* iCallback = NULL);
|
|
|
|
/*******************************************************************
|
|
Loads an index file that contains the order in which the file should be
|
|
stored inside the big file
|
|
*******************************************************************/
|
|
VX_EXPORT XBOOL LoadIndex(const char* iFileName);
|
|
/*******************************************************************
|
|
Saves an index file that contains the order in which the file are
|
|
stored inside the big file
|
|
*******************************************************************/
|
|
VX_EXPORT void SaveIndex(const char* iFileName, XBOOL iDetails = FALSE);
|
|
|
|
/***********************************************************************************
|
|
Append a memory buffer or a file inside the big file.
|
|
************************************************************************************/
|
|
VX_EXPORT XBOOL Append(const char* iReference, const char* iFileName, XBOOL iPersistent = TRUE, XBOOL iReplace = TRUE);
|
|
VX_EXPORT XBOOL Append(const char* iReference, const void* iBuffer, XDWORD iSize);
|
|
|
|
/**********************************************************************
|
|
Find and return a sub-file.
|
|
***********************************************************************/
|
|
VX_EXPORT XBOOL Find(const char* iFileName, VxSubFile* oSubFile = NULL);
|
|
/**********************************************************************
|
|
Remove a sub-file.
|
|
***********************************************************************/
|
|
VX_EXPORT XBOOL Remove(const char* iFileName);
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
***********************************************************************/
|
|
const XArray<Chunk*>& GetOrderedChunks() const
|
|
{
|
|
return m_Chunks;
|
|
}
|
|
|
|
/*********************************************************************
|
|
|
|
**********************************************************************/
|
|
const ChunkTable& GetIndex() const
|
|
{
|
|
return m_Index;
|
|
}
|
|
|
|
|
|
// Return the filename of an opened bigfile
|
|
const XString& GetName() const
|
|
{
|
|
return m_FileName;
|
|
}
|
|
|
|
|
|
VxFile& GetFile()
|
|
{
|
|
return m_File;
|
|
}
|
|
|
|
protected:
|
|
|
|
// clear
|
|
void Clear();
|
|
|
|
// Pool of chunk
|
|
XObjectPool<Chunk> m_ChunkPool;
|
|
// list of all the files, in order
|
|
XArray<Chunk*> m_Chunks;
|
|
// index of the file inside the big file
|
|
ChunkTable m_Index;
|
|
// the big file path and file name
|
|
XString m_FileName;
|
|
// the file
|
|
VxCachedFile m_File;
|
|
|
|
// the current folder to look for file
|
|
XString m_CurrentFolder;
|
|
|
|
#if (defined(PSX2) || defined(PSP))
|
|
XAP<XBYTE> m_Header;
|
|
#endif
|
|
|
|
// VxBigFile signature
|
|
static char m_Signature[4];
|
|
|
|
VxFile m_LogHistory;
|
|
|
|
};
|
|
|
|
#endif
|