#ifndef __FILESTREAM_H__
#define __FILESTREAM_H__
#define BASE_PROVIDER_FILE 0x00000000
#define BASE_PROVIDER_MAP 0x00000001
#define BASE_PROVIDER_HTTP 0x00000002
#define BASE_PROVIDER_RIBBIT 0x00000003
#define BASE_PROVIDER_MASK 0x0000000F
#define STREAM_PROVIDER_FLAT 0x00000000
#define STREAM_PROVIDER_PARTIAL 0x00000010
#define STREAM_PROVIDER_ENCRYPTED 0x00000020
#define STREAM_PROVIDER_BLOCK4 0x00000030
#define STREAM_PROVIDER_MASK 0x000000F0
#define STREAM_FLAG_READ_ONLY 0x00000100
#define STREAM_FLAG_WRITE_SHARE 0x00000200
#define STREAM_FLAG_USE_BITMAP 0x00000400
#define STREAM_FLAG_FILL_MISSING 0x00000800
#define STREAM_OPTIONS_MASK 0x0000FF00
#define STREAM_PROVIDERS_MASK 0x000000FF
#define STREAM_FLAGS_MASK 0x0000FFFF
typedef void (*STREAM_INIT)(
struct TFileStream * pStream );
typedef bool (*STREAM_CREATE)(
struct TFileStream * pStream );
typedef bool (*STREAM_OPEN)(
struct TFileStream * pStream, LPCTSTR szFileName, DWORD dwStreamFlags );
typedef bool (*STREAM_READ)(
struct TFileStream * pStream, ULONGLONG * pByteOffset, void * pvBuffer, DWORD dwBytesToRead );
typedef bool (*STREAM_WRITE)(
struct TFileStream * pStream, ULONGLONG * pByteOffset, const void * pvBuffer, DWORD dwBytesToWrite );
typedef bool (*STREAM_RESIZE)(
struct TFileStream * pStream, ULONGLONG FileSize );
typedef bool (*STREAM_GETSIZE)(
struct TFileStream * pStream, ULONGLONG * pFileSize );
typedef bool (*STREAM_GETPOS)(
struct TFileStream * pStream, ULONGLONG * pByteOffset );
typedef void (*STREAM_CLOSE)(
struct TFileStream * pStream );
typedef bool (*BLOCK_READ)(
struct TFileStream * pStream, ULONGLONG StartOffset, ULONGLONG EndOffset, LPBYTE BlockBuffer, DWORD BytesNeeded, bool bAvailable );
typedef bool (*BLOCK_CHECK)(
struct TFileStream * pStream, ULONGLONG BlockOffset );
typedef void (*BLOCK_SAVEMAP)(
struct TFileStream * pStream );
typedef void (WINAPI * STREAM_DOWNLOAD_CALLBACK)(
void * pvUserData,
ULONGLONG ByteOffset,
DWORD dwTotalBytes
);
#define ID_FILE_BITMAP_FOOTER 0x33767470
#define DEFAULT_BLOCK_SIZE 0x00004000
#define DEFAULT_BUILD_NUMBER 10958
typedef struct _PART_FILE_HEADER
{
DWORD PartialVersion; char GameBuildNumber[0x20]; DWORD Flags; DWORD FileSizeLo; DWORD FileSizeHi; DWORD BlockSize;
} PART_FILE_HEADER, *PPART_FILE_HEADER;
typedef struct _PART_FILE_MAP_ENTRY
{
DWORD Flags; DWORD BlockOffsLo; DWORD BlockOffsHi; DWORD LargeValueLo; DWORD LargeValueHi;
} PART_FILE_MAP_ENTRY, *PPART_FILE_MAP_ENTRY;
typedef struct _FILE_BITMAP_FOOTER
{
DWORD Signature; DWORD Version; DWORD BuildNumber; DWORD MapOffsetLo; DWORD MapOffsetHi; DWORD BlockSize;
} FILE_BITMAP_FOOTER, *PFILE_BITMAP_FOOTER;
union TBaseProviderData
{
struct
{
ULONGLONG FileSize; ULONGLONG FilePos; ULONGLONG FileTime; HANDLE hFile; } File;
struct
{
ULONGLONG FileSize; ULONGLONG FilePos; ULONGLONG FileTime; LPBYTE pbFile; } Map;
struct
{
class CASC_SOCKET * pSocket; unsigned char * fileData; char * hostName; char * fileName; size_t fileDataLength; size_t fileDataPos; } Socket;
};
struct TFileStream
{
STREAM_READ StreamRead; STREAM_WRITE StreamWrite; STREAM_RESIZE StreamResize; STREAM_GETSIZE StreamGetSize; STREAM_GETPOS StreamGetPos; STREAM_CLOSE StreamClose;
BLOCK_READ BlockRead; BLOCK_CHECK BlockCheck;
STREAM_CREATE BaseCreate; STREAM_OPEN BaseOpen; STREAM_READ BaseRead; STREAM_WRITE BaseWrite; STREAM_RESIZE BaseResize; STREAM_GETSIZE BaseGetSize; STREAM_GETPOS BaseGetPos; STREAM_CLOSE BaseClose;
TBaseProviderData Base; CASC_LOCK Lock;
TFileStream * pMaster; LPTSTR szFileName;
ULONGLONG StreamSize; ULONGLONG StreamPos; DWORD BuildNumber; DWORD dwFlags;
};
struct TBlockStream : public TFileStream
{
STREAM_DOWNLOAD_CALLBACK pfnCallback; void * FileBitmap; void * UserData; DWORD BitmapSize; DWORD BlockSize; DWORD BlockCount; DWORD IsComplete; DWORD IsModified; };
#define ENCRYPTED_CHUNK_SIZE 0x40
struct TEncryptedStream : public TBlockStream
{
BYTE Key[ENCRYPTED_CHUNK_SIZE]; };
TFileStream * FileStream_CreateFile(LPCTSTR szFileName, DWORD dwStreamFlags);
TFileStream * FileStream_OpenFile(LPCTSTR szFileName, DWORD dwStreamFlags = 0);
LPCTSTR FileStream_GetFileName(TFileStream * pStream);
size_t FileStream_Prefix(LPCTSTR szFileName, DWORD * pdwProvider);
bool FileStream_SetCallback(TFileStream * pStream, STREAM_DOWNLOAD_CALLBACK pfnCallback, void * pvUserData);
bool FileStream_Read(TFileStream * pStream, ULONGLONG * pByteOffset, void * pvBuffer, DWORD dwBytesToRead);
bool FileStream_Write(TFileStream * pStream, ULONGLONG * pByteOffset, const void * pvBuffer, DWORD dwBytesToWrite);
bool FileStream_SetSize(TFileStream * pStream, ULONGLONG NewFileSize);
bool FileStream_GetSize(TFileStream * pStream, ULONGLONG * pFileSize);
bool FileStream_GetPos(TFileStream * pStream, ULONGLONG * pByteOffset);
bool FileStream_GetTime(TFileStream * pStream, ULONGLONG * pFT);
bool FileStream_GetFlags(TFileStream * pStream, PDWORD pdwStreamFlags);
bool FileStream_Replace(TFileStream * pStream, TFileStream * pNewStream);
void FileStream_Close(TFileStream * pStream);
#endif