|
|
#include "precomp.h"
#pragma hdrstop
/*
* Stubs for decompression routines. They just copy the file instead of * decompressing it. * * Only routines actually used by the toolkit are included. */
#define MIN_BUFFER_SIZE 2048 // must be a multiple of 2
#define MAX_BUFFER_SIZE (2*65536) // must be a multiple of 2
LONG LcbCopyFile( HANDLE fhSrc, HANDLE fhDest, PFNWFROMW pfn, INT cProgTicks ) { BYTE StaticBuffer[MIN_BUFFER_SIZE],*CopyBuffer; DWORD br,bw; DWORD BufferSize,FileSize,TicksPerCycle=0; LONG DistanceHigh = 0L; LONG RC;
if((FileSize = GetFileSize(fhSrc,NULL)) == (DWORD)(-1)) { return(rcReadError); }
//
// Rewind to beginning of file
//
if(SetFilePointer(fhSrc, 0L, &DistanceHigh, FILE_BEGIN) == 0xFFFFFFFF) { return (rcReadSeekError); }
BufferSize = MAX_BUFFER_SIZE; while((BufferSize > MIN_BUFFER_SIZE) && ((CopyBuffer = SAlloc(BufferSize)) == NULL)) { BufferSize /= 2; } if(CopyBuffer == NULL) { CopyBuffer = StaticBuffer; BufferSize = sizeof(StaticBuffer); }
if(FileSize) { TicksPerCycle = BufferSize*(DWORD)cProgTicks/FileSize; } if(TicksPerCycle > (DWORD)cProgTicks) { TicksPerCycle = (DWORD)cProgTicks; }
while(1) {
if(!ReadFile(fhSrc,CopyBuffer,BufferSize,&br,NULL)) { RC = rcReadError; break; } else if(!br) { // ReadFile returned TRUE and bytesread = 0
RC = rcNoError; break; }
FYield(); if ( fUserQuit ) { RC = rcUserQuit; break; }
if(!WriteFile(fhDest,CopyBuffer,br,&bw,NULL) || (br != bw)) { // the !RC test guesses that br != bw means disk full
if(((RC = GetLastError()) == ERROR_DISK_FULL) || !RC) { RC = rcDiskFull; } else { RC = rcWriteError; } break; }
FYield(); if ( fUserQuit ) { RC = rcUserQuit; break; }
if(pfn != NULL) { pfn(TicksPerCycle); } } if(CopyBuffer != StaticBuffer) { SFree(CopyBuffer); } return(RC); }
LONG LcbDecompFile( HANDLE fhSrc, HANDLE fhDest, PFNWFROMW pfn, INT cProgTicks ) { BYTE StaticBuffer[MIN_BUFFER_SIZE],*CopyBuffer; DWORD br,bw; DWORD BufferSize,FileSize,TicksPerCycle=0; LONG RC;
//
// Use seek to determine file length
//
if(( RC = LZSeek( HandleToUlong(fhSrc), 0L, 2 ) ) < 0) { return (rcReadSeekError); }
FileSize = (DWORD)RC;
//
// Rewind to beginning of file
//
if(( RC = LZSeek( HandleToUlong(fhSrc), 0L, 0 ) ) < 0) { return (rcReadSeekError); }
//
// Copy source file to destination file BufferSize at a time
//
BufferSize = MAX_BUFFER_SIZE; while((BufferSize > MIN_BUFFER_SIZE) && ((CopyBuffer = SAlloc(BufferSize)) == NULL)) { BufferSize /= 2; } if(CopyBuffer == NULL) { CopyBuffer = StaticBuffer; BufferSize = sizeof(StaticBuffer); }
if(FileSize) { TicksPerCycle = BufferSize*(DWORD)cProgTicks/FileSize; } if(TicksPerCycle > (DWORD)cProgTicks) { TicksPerCycle = (DWORD)cProgTicks; }
while(1) {
if((RC = LZRead( HandleToUlong(fhSrc),CopyBuffer,BufferSize) ) < 0) { RC = rcReadError; break; } else if(!RC) { // No error and bytesread = 0
RC = rcNoError; break; }
br = (DWORD)RC;
FYield(); if ( fUserQuit ) { RC = rcUserQuit; break; }
if(!WriteFile(fhDest,CopyBuffer,br,&bw,NULL) || (br != bw)) { // the !RC test guesses that br != bw means disk full
if(((RC = GetLastError()) == ERROR_DISK_FULL) || !RC) { RC = rcDiskFull; } else { RC = rcWriteError; } break; }
FYield(); if ( fUserQuit ) { RC = rcUserQuit; break; }
if(pfn != NULL) { pfn(TicksPerCycle); } } if(CopyBuffer != StaticBuffer) { SFree(CopyBuffer); } return(RC); }
|