mirror of
https://github.com/mangosfour/server.git
synced 2025-12-17 07:37:03 +00:00
189 lines
8 KiB
C
189 lines
8 KiB
C
/*****************************************************************************/
|
|
/* FileStream.h Copyright (c) Ladislav Zezula 2012 */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Description: Definitions for FileStream object */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Date Ver Who Comment */
|
|
/* -------- ---- --- ------- */
|
|
/* 14.04.12 1.00 Lad The first version of FileStream.h */
|
|
/*****************************************************************************/
|
|
|
|
#ifndef __FILESTREAM_H__
|
|
#define __FILESTREAM_H__
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Function prototypes
|
|
|
|
typedef bool (*STREAM_READ)(
|
|
struct TFileStream * pStream, // Pointer to an open stream
|
|
ULONGLONG * pByteOffset, // Pointer to file byte offset. If NULL, it reads from the current position
|
|
void * pvBuffer, // Pointer to data to be read
|
|
DWORD dwBytesToRead // Number of bytes to read from the file
|
|
);
|
|
|
|
typedef bool (*STREAM_WRITE)(
|
|
struct TFileStream * pStream, // Pointer to an open stream
|
|
ULONGLONG * pByteOffset, // Pointer to file byte offset. If NULL, it writes to the current position
|
|
const void * pvBuffer, // Pointer to data to be written
|
|
DWORD dwBytesToWrite // Number of bytes to read from the file
|
|
);
|
|
|
|
typedef bool (*STREAM_GETPOS)(
|
|
struct TFileStream * pStream, // Pointer to an open stream
|
|
ULONGLONG * pByteOffset // Pointer to store current file position
|
|
);
|
|
|
|
typedef bool (*STREAM_GETSIZE)(
|
|
struct TFileStream * pStream, // Pointer to an open stream
|
|
ULONGLONG * pFileSize // Receives the file size, in bytes
|
|
);
|
|
|
|
typedef bool (*STREAM_SETSIZE)(
|
|
struct TFileStream * pStream, // Pointer to an open stream
|
|
ULONGLONG FileSize // New size for the file, in bytes
|
|
);
|
|
|
|
typedef bool (*STREAM_GETTIME)(
|
|
struct TFileStream * pStream,
|
|
ULONGLONG * pFT
|
|
);
|
|
|
|
typedef bool (*STREAM_SWITCH)(
|
|
struct TFileStream * pStream,
|
|
struct TFileStream * pNewStream
|
|
);
|
|
|
|
typedef bool (*STREAM_GETBMP)(
|
|
TFileStream * pStream,
|
|
TFileBitmap * pBitmap,
|
|
DWORD Length,
|
|
LPDWORD LengthNeeded
|
|
);
|
|
|
|
typedef void (*STREAM_CLOSE)(
|
|
struct TFileStream * pStream
|
|
);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Local structures - part file structure
|
|
|
|
typedef struct _PART_FILE_HEADER
|
|
{
|
|
DWORD PartialVersion; // Always set to 2
|
|
char GameBuildNumber[0x20]; // Minimum build number of the game that can use this MPQ
|
|
DWORD Flags; // Flags (details unknown)
|
|
DWORD FileSizeLo; // Low 32 bits of the contained file size
|
|
DWORD FileSizeHi; // High 32 bits of the contained file size
|
|
DWORD BlockSize; // Size of one file block, in bytes
|
|
|
|
} PART_FILE_HEADER, *PPART_FILE_HEADER;
|
|
|
|
// Structure describing the block-to-file map entry
|
|
typedef struct _PART_FILE_MAP_ENTRY
|
|
{
|
|
DWORD Flags; // 3 = the block is present in the file
|
|
DWORD BlockOffsLo; // Low 32 bits of the block position in the file
|
|
DWORD BlockOffsHi; // High 32 bits of the block position in the file
|
|
DWORD LargeValueLo; // 64-bit value, meaning is unknown
|
|
DWORD LargeValueHi;
|
|
|
|
} PART_FILE_MAP_ENTRY, *PPART_FILE_MAP_ENTRY;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Local structures
|
|
|
|
union TBaseData
|
|
{
|
|
struct
|
|
{
|
|
ULONGLONG FileSize; // Size of the file
|
|
ULONGLONG FilePos; // Current file position
|
|
ULONGLONG FileTime; // Date/time of last modification of the file
|
|
HANDLE hFile; // File handle
|
|
} File;
|
|
|
|
struct
|
|
{
|
|
ULONGLONG FileSize; // Mapped file size
|
|
ULONGLONG FilePos; // Current stream position
|
|
ULONGLONG FileTime; // Date/time of last modification of the file
|
|
LPBYTE pbFile; // Pointer to mapped view
|
|
} Map;
|
|
|
|
struct
|
|
{
|
|
ULONGLONG FileSize; // Size of the internet file
|
|
ULONGLONG FilePos; // Current position in the file
|
|
ULONGLONG FileTime; // Date/time of last modification of the file
|
|
HANDLE hInternet; // Internet handle
|
|
HANDLE hConnect; // Connection to the internet server
|
|
} Http;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Structure for linear stream
|
|
|
|
struct TFileStream
|
|
{
|
|
// Stream provider functions
|
|
STREAM_READ StreamRead; // Pointer to stream read function for this archive. Do not use directly.
|
|
STREAM_WRITE StreamWrite; // Pointer to stream write function for this archive. Do not use directly.
|
|
STREAM_GETPOS StreamGetPos; // Pointer to function that returns current file position
|
|
STREAM_GETSIZE StreamGetSize; // Pointer to function returning file size
|
|
STREAM_SETSIZE StreamSetSize; // Pointer to function changing file size
|
|
STREAM_GETTIME StreamGetTime; // Pointer to function retrieving the file time
|
|
STREAM_GETBMP StreamGetBmp; // Pointer to function that retrieves the file bitmap
|
|
STREAM_SWITCH StreamSwitch; // Pointer to function changing the stream to another file
|
|
STREAM_CLOSE StreamClose; // Pointer to function closing the stream
|
|
|
|
// Stream provider data members
|
|
TCHAR szFileName[MAX_PATH]; // File name
|
|
DWORD dwFlags; // Stream flags
|
|
|
|
// Base provider functions
|
|
STREAM_READ BaseRead;
|
|
STREAM_WRITE BaseWrite;
|
|
STREAM_GETPOS BaseGetPos; // Pointer to function that returns current file position
|
|
STREAM_GETSIZE BaseGetSize; // Pointer to function returning file size
|
|
STREAM_SETSIZE BaseSetSize; // Pointer to function changing file size
|
|
STREAM_GETTIME BaseGetTime; // Pointer to function retrieving the file time
|
|
STREAM_CLOSE BaseClose; // Pointer to function closing the stream
|
|
|
|
// Base provider data members
|
|
TBaseData Base; // Base provider data
|
|
|
|
// Followed by stream provider data, with variable length
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Structure for linear stream
|
|
|
|
struct TLinearStream : public TFileStream
|
|
{
|
|
TFileBitmap * pBitmap; // Pointer to the stream bitmap
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Structure for partial stream
|
|
|
|
struct TPartialStream : public TFileStream
|
|
{
|
|
ULONGLONG VirtualSize; // Virtual size of the file
|
|
ULONGLONG VirtualPos; // Virtual position in the file
|
|
DWORD BlockCount; // Number of file blocks. Used by partial file stream
|
|
DWORD BlockSize; // Size of one block. Used by partial file stream
|
|
|
|
PPART_FILE_MAP_ENTRY PartMap; // File map, variable length
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Structure for encrypted stream
|
|
|
|
#define MPQE_CHUNK_SIZE 0x40 // Size of one chunk to be decrypted
|
|
|
|
struct TEncryptedStream : public TFileStream
|
|
{
|
|
BYTE Key[MPQE_CHUNK_SIZE]; // File key
|
|
};
|
|
|
|
#endif // __FILESTREAM_H__
|