103 lines
3.0 KiB
C++
103 lines
3.0 KiB
C++
#include "stdafx.h"
|
|
#include "ArchiveExtractor.h"
|
|
#include "Archive.h"
|
|
|
|
#ifdef USE_7Z
|
|
|
|
CArchiveExtractor::CArchiveExtractor(CArchive* pArchive, const QMap<int,CArchiveIO*>& Files)
|
|
{
|
|
m_pArchive = pArchive;
|
|
m_Index = -1;
|
|
m_Files = Files;
|
|
}
|
|
|
|
CArchiveExtractor::~CArchiveExtractor()
|
|
{
|
|
foreach(CArchiveIO* pFile, m_Files)
|
|
delete pFile;
|
|
}
|
|
|
|
STDMETHODIMP CArchiveExtractor::SetTotal(UInt64 size)
|
|
{
|
|
m_pArchive->m_Progress.SetTotal(size);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CArchiveExtractor::SetCompleted(const UInt64 *completeValue)
|
|
{
|
|
ASSERT(completeValue);
|
|
m_pArchive->m_Progress.SetCompleted(*completeValue);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CArchiveExtractor::PrepareOperation (Int32 askExtractMode)
|
|
{
|
|
switch (askExtractMode)
|
|
{
|
|
case NArchive::NExtract::NAskMode::kExtract:
|
|
//TRACE(L"Extracting ...");
|
|
break;
|
|
case NArchive::NExtract::NAskMode::kTest:
|
|
//TRACE(L"Testing ...");
|
|
break;
|
|
case NArchive::NExtract::NAskMode::kSkip:
|
|
//TRACE(L"Skipping ...");
|
|
break;
|
|
default: Q_ASSERT(0);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CArchiveExtractor::GetStream (UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode)
|
|
{
|
|
*outStream = NULL;
|
|
Q_ASSERT(index < m_pArchive->m_Files.count());
|
|
m_Index = index;
|
|
//TRACE(L"Archive Item '%S'", QS2CS(m_pArchive->FileProperty(m_Index, "Path").toString()));
|
|
if(CArchiveIO* pFile = m_Files.take(m_Index))
|
|
{
|
|
Q_ASSERT(askExtractMode == NArchive::NExtract::NAskMode::kExtract);
|
|
if (!pFile->Open(QIODevice::WriteOnly))
|
|
return S_FALSE;
|
|
CMyComPtr<IOutStream> outStreamLoc = pFile;
|
|
*outStream = outStreamLoc.Detach();
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CArchiveExtractor::SetOperationResult (Int32 operationResult)
|
|
{
|
|
switch(operationResult)
|
|
{
|
|
case NArchive::NExtract::NOperationResult::kOK:
|
|
//TRACE(L"... Completed");
|
|
break;
|
|
case NArchive::NExtract::NOperationResult::kUnsupportedMethod:
|
|
//TRACE(L"... Error (Un Supported Method)");
|
|
m_pArchive->LogError(QString("File Extraction Fails (Un Supported Method): %1").arg(m_pArchive->FileProperty(m_Index, "Path").toString()));
|
|
m_pArchive->FileProperty(m_Index, "Error", "Un Supported Method");
|
|
break;
|
|
case NArchive::NExtract::NOperationResult::kCRCError:
|
|
//TRACE(L"... Error (CRC)");
|
|
m_pArchive->LogError(QString("File Extraction Fails (CRC Error): %1").arg(m_pArchive->FileProperty(m_Index, "Path").toString()));
|
|
m_pArchive->FileProperty(m_Index, "Error", "CRC Error");
|
|
break;
|
|
case NArchive::NExtract::NOperationResult::kDataError:
|
|
//TRACE(L"... Error (Data)");
|
|
m_pArchive->LogError(QString("File Extraction Fails (Data Error): %1").arg(m_pArchive->FileProperty(m_Index, "Path").toString()));
|
|
m_pArchive->FileProperty(m_Index, "Error", "Data Error");
|
|
break;
|
|
default: Q_ASSERT(0);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CArchiveExtractor::CryptoGetTextPassword(BSTR *password)
|
|
{
|
|
QString Password = m_pArchive->GetPassword(true);
|
|
if(Password.isEmpty())
|
|
return E_ABORT;
|
|
return StringToBstr(Password.toStdWString().c_str(), password);
|
|
}
|
|
|
|
#endif |