Files
easy7zip/7zip/Compress/Rar29/Rar29Decoder.cpp
Igor Pavlov d66cf2fcf3 4.27 beta
2016-05-28 00:15:44 +01:00

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;
}
}
}