www.pudn.com > eMule0.42e-Sources.zip > ArchiveRecovery.h


//this file is part of eMule 
//Copyright (C)2002 Merkur ( merkur-@users.sourceforge.net / http://www.emule-project.net ) 
// 
//This program is free software; you can redistribute it and/or 
//modify it under the terms of the GNU General Public License 
//as published by the Free Software Foundation; either 
//version 2 of the License, or (at your option) any later version. 
// 
//This program is distributed in the hope that it will be useful, 
//but WITHOUT ANY WARRANTY; without even the implied warranty of 
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the 
//GNU General Public License for more details. 
// 
//You should have received a copy of the GNU General Public License 
//along with this program; if not, write to the Free Software 
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
#pragma once 
#include "loggable.h" 
 
class CPartFile; 
struct Gap_Struct; 
 
#define ZIP_LOCAL_HEADER_MAGIC		0x04034b50 
#define ZIP_LOCAL_HEADER_EXT_MAGIC	0x08074b50 
#define ZIP_CD_MAGIC				0x02014b50 
#define ZIP_END_CD_MAGIC			0x06054b50 
#define ZIP_COMMENT					"Recovered by eMule" 
 
#define RAR_HEAD_FILE 0x74 
#define RAR_START_OF_FILE {	\ 
0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00, 0x08, 0x1A, 0x73, 0x02, 0x00, 0x3B, 0x00, 0x00, 0x00, \ 
0x00, 0x00, 0x00, 0x00, 0xCA, 0x44, 0x75, 0x00, 0x00, 0x2E, 0x00, 0x12, 0x00, 0x14, 0x34, 0x2B, \ 
0x4A, 0x08, 0x15, 0x48, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x2B, 0xF9, 0x0E, 0xE2, 0xC1, \ 
0x32, 0xFB, 0x9E, 0x04, 0x10, 0x50, 0xD7, 0xFE, 0xCD, 0x75, 0x87, 0x9C, 0x28, 0x85, 0xDF, 0xA3, \ 
0x97, 0xE0 } 
 
#pragma pack(1) //??? 
struct ZIP_Entry 
{ 
	uint32	header; 
	uint16	versionToExtract; 
	uint16	generalPurposeFlag; 
	uint16	compressionMethod; 
	uint16	lastModFileTime; 
	uint16	lastModFileDate; 
	uint32	crc32; 
	uint32	lenCompressed; 
	uint32	lenUncompressed; 
	uint16	lenFilename; 
	uint16	lenExtraField; 
	BYTE	*filename; 
	BYTE	*extraField; 
	BYTE	*compressedData; 
}; 
#pragma pack() 
 
#pragma pack(1) 
struct ZIP_CentralDirectory 
{ 
	uint32	header; 
	uint16	versionMadeBy; 
	uint16	versionToExtract; 
	uint16	generalPurposeFlag; 
	uint16	compressionMethod; 
	uint16	lastModFileTime; 
	uint16	lastModFileDate; 
	uint32	crc32; 
	uint32	lenCompressed; 
	uint32	lenUnompressed; 
	uint16	lenFilename; 
	uint16	lenExtraField; 
	uint16	lenComment; 
	uint16	diskNumberStart; 
	uint16	internalFileAttributes; 
	uint32	externalFileAttributes; 
	uint32	relativeOffsetOfLocalHeader; 
	BYTE	*filename; 
	BYTE	*extraField; 
	BYTE	*comment; 
}; 
#pragma pack() 
 
#pragma pack(1) 
struct RAR_BlockFile  
{ 
	// This indicates the position in the input file just after the filename 
	ULONGLONG offsetData;  
	// This indicates how much of the block is after this offset 
	uint32 dataLength; 
     
	uint16	HEAD_CRC; 
	BYTE	HEAD_TYPE; 
	uint16	HEAD_FLAGS; 
	uint16	HEAD_SIZE; 
	uint32	PACK_SIZE; 
	uint32	UNP_SIZE; 
	BYTE	HOST_OS; 
	uint32	FILE_CRC; 
	uint32	FTIME; 
	BYTE	UNP_VER; 
	BYTE	METHOD; 
	uint16	NAME_SIZE; 
	uint32	ATTR; 
	uint32	HIGH_PACK_SIZE; 
	uint32	HIGH_UNP_SIZE; 
	BYTE	*FILE_NAME; 
}; 
#pragma pack() 
 
struct ThreadParam 
{ 
	CPartFile *partFile; 
	CTypedPtrList *filled; 
	bool preview; 
}; 
 
class CArchiveRecovery: public CLoggable 
{ 
public: 
	static void recover(CPartFile *partFile, bool preview = false); 
 
private: 
	CArchiveRecovery(void); // Just use static recover method 
 
	static UINT AFX_CDECL run(LPVOID lpParam); 
	static bool performRecovery(CPartFile *partFile, CTypedPtrList *filled, bool preview); 
 
	static bool recoverZip(CFile *zipInput, CFile *zipOutput, CTypedPtrList *filled, bool fullSize); 
	static bool recoverRar(CFile *rarInput, CFile *rarOutput, CTypedPtrList *filled); 
 
	static bool scanForZipMarker(CFile *input, uint32 marker, uint32 available); 
	static bool processZipEntry(CFile *zipInput, CFile *zipOutput, uint32 available, CTypedPtrList *centralDirectoryEntries); 
	static bool readZipCentralDirectory(CFile *zipInput, CTypedPtrList *centralDirectoryEntries, CTypedPtrList *filled); 
 
	static RAR_BlockFile *scanForRarFileHeader(CFile *input, uint32 available); 
	static bool validateRarFileBlock(RAR_BlockFile *block); 
	static void writeRarBlock(CFile *input, CFile *output, RAR_BlockFile *block); 
 
	static bool CopyFile(CPartFile *partFile, CTypedPtrList *filled, CString tempFileName); 
	static void DeleteMemory(ThreadParam *tp); 
	static bool IsFilled(uint32 start, uint32 end, CTypedPtrList *filled); 
 
	static uint16 readUInt16(CFile *input); 
	static uint32 readUInt32(CFile *input); 
	static uint16 calcUInt16(BYTE *input); 
	static uint32 calcUInt32(BYTE *input); 
	static void writeUInt16(CFile *output, uint16 val); 
	static void writeUInt32(CFile *output, uint32 val); 
};