198 lines
4.3 KiB
C
198 lines
4.3 KiB
C
|
#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);
|
||
|
}
|