mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-11 06:07:12 -06:00
154 lines
3.2 KiB
C++
Executable File
154 lines
3.2 KiB
C++
Executable File
// Rar29Decoder.cpp
|
|
// According to unRAR license,
|
|
// this code may not be used to develop a
|
|
// RAR (WinRAR) compatible archiver
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "Rar29Decoder.h"
|
|
|
|
#include "Windows/Defs.h"
|
|
|
|
// #include "Original/unpack15.cpp"
|
|
|
|
ErrorHandler ErrHandler;
|
|
|
|
namespace NCompress {
|
|
namespace NRar29 {
|
|
|
|
CDecoder::CDecoder():
|
|
m_IsSolid(false),
|
|
// DataIO(NULL)
|
|
DataIO()
|
|
{
|
|
Unp = new Unpack(&DataIO);
|
|
Unp->Init(NULL);
|
|
}
|
|
|
|
CDecoder::~CDecoder()
|
|
{
|
|
delete Unp;
|
|
}
|
|
|
|
STDMETHODIMP CDecoder::CodeReal(ISequentialInStream *inStream,
|
|
ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
|
|
ICompressProgressInfo *progress)
|
|
{
|
|
// CCoderReleaser coderReleaser(this);
|
|
|
|
DataIO.CurUnpRead=0;
|
|
DataIO.CurUnpWrite=0;
|
|
DataIO.UnpFileCRC=0xffffffff;
|
|
DataIO.PackedCRC=0xffffffff;
|
|
/*
|
|
DataIO.SetEncryption(
|
|
0,0,
|
|
NULL,false);
|
|
*/
|
|
|
|
DataIO.SetPackedSizeToRead(*inSize);
|
|
DataIO.SetFiles(inStream, outStream, progress);
|
|
DataIO.SetTestMode(false);
|
|
// DataIO.SetSkipUnpCRC(SkipSolid);
|
|
/*
|
|
if (!TestMode && Arc.NewLhd.FullUnpSize>0x1000)
|
|
CurFile.Prealloc(Arc.NewLhd.FullUnpSize);
|
|
|
|
CurFile.SetAllowDelete(!Cmd->KeepBroken);
|
|
*/
|
|
|
|
Unp->SetDestSize(*outSize);
|
|
|
|
Unp->DoUnpack(29, m_IsSolid);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream,
|
|
ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
|
|
ICompressProgressInfo *progress)
|
|
{
|
|
try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
|
|
catch(const CExitCode &exitCode) { return exitCode.Result; }
|
|
catch(...) { return S_FALSE; }
|
|
}
|
|
|
|
STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
|
|
{
|
|
if (size < 1)
|
|
return E_INVALIDARG;
|
|
m_IsSolid = (data[0] != 0);
|
|
return S_OK;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
namespace NRar15 {
|
|
|
|
CDecoder::CDecoder():
|
|
m_IsSolid(false),
|
|
DataIO()
|
|
{
|
|
Unp=new Unpack(&DataIO);
|
|
Unp->Init(NULL);
|
|
}
|
|
|
|
CDecoder::~CDecoder()
|
|
{
|
|
delete Unp;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CDecoder::CodeReal(ISequentialInStream *inStream,
|
|
ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
|
|
ICompressProgressInfo *progress)
|
|
{
|
|
// CCoderReleaser coderReleaser(this);
|
|
|
|
DataIO.CurUnpRead=0;
|
|
DataIO.CurUnpWrite=0;
|
|
DataIO.UnpFileCRC=0xffffffff;
|
|
DataIO.PackedCRC=0xffffffff;
|
|
/*
|
|
DataIO.SetEncryption(
|
|
0,0,
|
|
NULL,false);
|
|
*/
|
|
|
|
DataIO.SetPackedSizeToRead(*inSize);
|
|
DataIO.SetFiles(inStream, outStream, progress);
|
|
DataIO.SetTestMode(false);
|
|
// DataIO.SetSkipUnpCRC(SkipSolid);
|
|
/*
|
|
if (!TestMode && Arc.NewLhd.FullUnpSize>0x1000)
|
|
CurFile.Prealloc(Arc.NewLhd.FullUnpSize);
|
|
|
|
CurFile.SetAllowDelete(!Cmd->KeepBroken);
|
|
*/
|
|
Unp->SetDestSize(*outSize);
|
|
Unp->DoUnpack(15, m_IsSolid);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream,
|
|
ISequentialOutStream *outStream, const UInt64 *inSize,
|
|
const UInt64 *outSize,
|
|
ICompressProgressInfo *progress)
|
|
{
|
|
try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
|
|
catch(const CExitCode &exitCode) { return exitCode.Result; }
|
|
catch(...) { return S_FALSE;}
|
|
}
|
|
|
|
STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
|
|
{
|
|
if (size < 1)
|
|
return E_INVALIDARG;
|
|
m_IsSolid = (data[0] != 0);
|
|
return S_OK;
|
|
}
|
|
|
|
}
|
|
|
|
}
|