//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#ifndef ZIP_UNCOMPRESSED_H
#define ZIP_UNCOMPRESSED_H
#ifdef _WIN32
#pragma once
#endif

#include "datamap.h"

#define PKID( a, b ) (((b)<<24)|((a)<<16)|('K'<<8)|'P')

// compressionMethod field
#define ZIP_COMPRESSION_NONE  0
#define ZIP_COMPRESSION_LZMA 14

#pragma pack(1)

struct ZIP_EndOfCentralDirRecord
{
	DECLARE_BYTESWAP_DATADESC();
	unsigned int	signature; // 4 bytes PK56
	unsigned short	numberOfThisDisk;  // 2 bytes
	unsigned short	numberOfTheDiskWithStartOfCentralDirectory; // 2 bytes
	unsigned short	nCentralDirectoryEntries_ThisDisk;	// 2 bytes
	unsigned short	nCentralDirectoryEntries_Total;	// 2 bytes
	unsigned int	centralDirectorySize; // 4 bytes
	unsigned int	startOfCentralDirOffset; // 4 bytes
	unsigned short	commentLength; // 2 bytes
	// zip file comment follows
};

struct ZIP_FileHeader
{
	DECLARE_BYTESWAP_DATADESC();
	unsigned int	signature; //  4 bytes PK12 
	unsigned short	versionMadeBy; // version made by 2 bytes 
	unsigned short	versionNeededToExtract; // version needed to extract 2 bytes 
	unsigned short	flags; // general purpose bit flag 2 bytes 
	unsigned short	compressionMethod; // compression method 2 bytes 
	unsigned short	lastModifiedTime; // last mod file time 2 bytes 
	unsigned short	lastModifiedDate; // last mod file date 2 bytes 
	unsigned int	crc32; // crc-32 4 bytes 
	unsigned int	compressedSize; // compressed size 4 bytes 
	unsigned int	uncompressedSize; // uncompressed size 4 bytes 
	unsigned short	fileNameLength; // file name length 2 bytes 
	unsigned short	extraFieldLength; // extra field length 2 bytes 
	unsigned short	fileCommentLength; // file comment length 2 bytes 
	unsigned short	diskNumberStart; // disk number start 2 bytes 
	unsigned short	internalFileAttribs; // internal file attributes 2 bytes 
	unsigned int	externalFileAttribs; // external file attributes 4 bytes 
	unsigned int	relativeOffsetOfLocalHeader; // relative offset of local header 4 bytes 
	// file name (variable size) 
	// extra field (variable size) 
	// file comment (variable size) 
};

struct ZIP_LocalFileHeader
{
	DECLARE_BYTESWAP_DATADESC();
	unsigned int	signature; //local file header signature 4 bytes PK34 
	unsigned short	versionNeededToExtract; // version needed to extract 2 bytes 
	unsigned short	flags; // general purpose bit flag 2 bytes 
	unsigned short	compressionMethod; // compression method 2 bytes 
	unsigned short	lastModifiedTime; // last mod file time 2 bytes 
	unsigned short	lastModifiedDate; // last mod file date 2 bytes 
	unsigned int	crc32; // crc-32 4 bytes 
	unsigned int	compressedSize; // compressed size 4 bytes 
	unsigned int	uncompressedSize; // uncompressed size 4 bytes 
	unsigned short	fileNameLength; // file name length 2 bytes 
	unsigned short	extraFieldLength; // extra field length 2 bytes 
	// file name (variable size) 
	// extra field (variable size) 
};

//=============================================================================//
//	Valve Non standard Extension, Preload Section
//	An optional first file in an aligned zip that can be loaded into ram and
//	used by the FileSystem to supply header data rather than disk.
//	Is is an optimization to prevent the large of amount of small I/O performed
///	by the map loading process.
//=============================================================================//

#define PRELOAD_SECTION_NAME	"__preload_section.pre"
#define PRELOAD_HDR_VERSION		3
#define XZIP_COMMENT_LENGTH		32
#define INVALID_PRELOAD_ENTRY	( (unsigned short)-1 )

struct ZIP_PreloadHeader 
{
	DECLARE_BYTESWAP_DATADESC();
	unsigned int Version;					// VERSION
	unsigned int DirectoryEntries;			// Number of zip directory entries.
	unsigned int PreloadDirectoryEntries;	// Number of preloaded directory entries (equal or less than the zip dir).
	unsigned int Alignment;					// File alignment of the zip
};

struct ZIP_PreloadDirectoryEntry
{
	DECLARE_BYTESWAP_DATADESC();
    unsigned int Length;					// Length of the file's preload data in bytes
    unsigned int DataOffset;				// Offset the file data in the .zip, relative to the logical beginning of the preload file.
};

struct ZIP_PreloadRemapTable
{
	DECLARE_BYTESWAP_DATADESC();
	unsigned short PreloadIndex;			// Index into preload directory, entry marked invalid if no preload entry present
};

#pragma pack()

#endif // ZIP_UNCOMPRESSED_H