forked from Mirrors/openclonk
84 lines
2.6 KiB
C++
84 lines
2.6 KiB
C++
/*
|
|
* OpenClonk, http://www.openclonk.org
|
|
*
|
|
* Copyright (c) 1998-2000, Matthes Bender
|
|
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
|
|
* Copyright (c) 2009-2016, The OpenClonk Team and contributors
|
|
*
|
|
* Distributed under the terms of the ISC license; see accompanying file
|
|
* "COPYING" for details.
|
|
*
|
|
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
|
|
* See accompanying file "TRADEMARK" for details.
|
|
*
|
|
* To redistribute this file separately, substitute the full license texts
|
|
* for the above references.
|
|
*/
|
|
|
|
/* A handy wrapper class to gzio files */
|
|
|
|
#ifndef INC_CSTDFILE
|
|
#define INC_CSTDFILE
|
|
|
|
#include <stdio.h>
|
|
#include "platform/StdSync.h" // for StdThreadCheck
|
|
#include <zlib.h> // for gzFile
|
|
|
|
const int CStdFileBufSize = 4096;
|
|
|
|
class CStdStream
|
|
{
|
|
public:
|
|
virtual bool Read(void *pBuffer, size_t iSize) = 0;
|
|
virtual bool Advance(int iOffset) = 0;
|
|
// Get size. compatible with c4group!
|
|
virtual size_t AccessedEntrySize() = 0;
|
|
virtual ~CStdStream() {}
|
|
};
|
|
|
|
class CStdFile: public CStdStream
|
|
{
|
|
public:
|
|
CStdFile();
|
|
~CStdFile();
|
|
bool Status;
|
|
char Name[_MAX_PATH+1];
|
|
protected:
|
|
FILE *hFile;
|
|
gzFile hgzFile;
|
|
StdBuf *pMemory;
|
|
int MemoryPtr;
|
|
BYTE Buffer[CStdFileBufSize];
|
|
int BufferLoad,BufferPtr;
|
|
bool ModeWrite;
|
|
StdThreadCheck thread_check; // thread check helper to make sure only the thread that opened the file is using it
|
|
public:
|
|
bool Create(const char *szFileName, bool fCompressed=false, bool fExecutable=false, bool fMemory=false);
|
|
bool Open(const char *szFileName, bool fCompressed=false);
|
|
bool Append(const char *szFilename, bool text=false); // append (uncompressed only)
|
|
bool Close(StdBuf **ppMemory = NULL);
|
|
bool Default();
|
|
bool Read(void *pBuffer, size_t iSize) { return Read(pBuffer, iSize, 0); }
|
|
bool Read(void *pBuffer, size_t iSize, size_t *ipFSize);
|
|
bool Write(const void *pBuffer, int iSize);
|
|
bool WriteString(const char *szStr);
|
|
bool Rewind();
|
|
bool Advance(int iOffset);
|
|
int Seek(long int offset, int whence); // seek in file by offset and stdio-style SEEK_* constants. Only implemented for uncompressed files.
|
|
long int Tell(); // get current file pos. Only implemented for uncompressed files.
|
|
bool IsOpen() const { return hFile || hgzFile; }
|
|
// flush contents to disk
|
|
inline bool Flush() { if (ModeWrite && BufferLoad) return SaveBuffer(); else return true; }
|
|
size_t AccessedEntrySize();
|
|
protected:
|
|
void ClearBuffer();
|
|
int LoadBuffer();
|
|
bool SaveBuffer();
|
|
};
|
|
|
|
int UncompressedFileSize(const char *szFileName);
|
|
bool GetFileCRC(const char *szFilename, uint32_t *pCRC32);
|
|
bool GetFileSHA1(const char *szFilename, BYTE *pSHA1);
|
|
|
|
#endif // INC_CSTDFILE
|