Source code

Revision control

Copy as Markdown

Other Tools

// ExtractEngine.cpp↩
#include "StdAfx.h"
#include "../../../Windows/FileDir.h"
#include "../../../Windows/FileName.h"
#include "../../../Windows/Thread.h"
#include "../../UI/Common/OpenArchive.h"
#include "../../UI/FileManager/FormatUtils.h"
#include "../../UI/FileManager/LangUtils.h"
#include "ExtractCallbackSfx.h"
#include "ExtractEngine.h"
using namespace NWindows;↩
using namespace NFile;↩
using namespace NDir;↩
static LPCSTR const kCantFindArchive = "Can not find archive file";↩
static LPCSTR const kCantOpenArchive = "Can not open the file as archive";↩
struct CThreadExtracting↩
{↩
CCodecs *Codecs;↩
FString FileName;↩
FString DestFolder;↩
CExtractCallbackImp *ExtractCallbackSpec;↩
CMyComPtr<IArchiveExtractCallback> ExtractCallback;↩
CArchiveLink ArchiveLink;↩
HRESULT Result;↩
UString ErrorMessage;↩
void Process2()↩
{↩
NFind::CFileInfo fi;↩
if (!fi.Find(FileName))↩
{↩
ErrorMessage = kCantFindArchive;↩
Result = E_FAIL;↩
return;↩
}↩
CObjectVector<COpenType> incl;↩
CIntVector excl;↩
COpenOptions options;↩
options.codecs = Codecs;↩
options.types = &incl;↩
options.excludedFormats = &excl;↩
options.filePath = fs2us(FileName);↩
Result = ArchiveLink.Open2(options, ExtractCallbackSpec);↩
if (Result != S_OK)↩
{↩
ErrorMessage = kCantOpenArchive;↩
return;↩
}↩
FString dirPath = DestFolder;↩
NName::NormalizeDirPathPrefix(dirPath);↩
if (!CreateComplexDir(dirPath))↩
{↩
ErrorMessage = MyFormatNew(IDS_CANNOT_CREATE_FOLDER,↩
#ifdef LANG↩
0x02000603,↩
#endif
fs2us(dirPath));↩
Result = E_FAIL;↩
return;↩
}↩
ExtractCallbackSpec->Init(ArchiveLink.GetArchive(), dirPath, (UString)"Default", fi.MTime, 0);↩
Result = ArchiveLink.GetArchive()->Extract(0, (UInt32)(Int32)-1 , BoolToInt(false), ExtractCallback);↩
}↩
void Process()↩
{↩
try
{↩
#ifndef _NO_PROGRESS↩
CProgressCloser closer(ExtractCallbackSpec->ProgressDialog);↩
#endif
Process2();↩
}↩
catch(...) { Result = E_FAIL; }↩
}↩
static THREAD_FUNC_DECL MyThreadFunction(void *param)↩
{↩
((CThreadExtracting *)param)->Process();↩
return 0;↩
}↩
};↩
HRESULT ExtractArchive(CCodecs *codecs, const FString &fileName, const FString &destFolder,↩
bool showProgress, bool &isCorrupt, UString &errorMessage)↩
{↩
isCorrupt = false;↩
CThreadExtracting t;↩
t.Codecs = codecs;↩
t.FileName = fileName;↩
t.DestFolder = destFolder;↩
t.ExtractCallbackSpec = new CExtractCallbackImp;↩
t.ExtractCallback = t.ExtractCallbackSpec;↩
#ifndef _NO_PROGRESS↩
if (showProgress)↩
{↩
t.ExtractCallbackSpec->ProgressDialog.IconID = IDI_ICON;↩
NWindows::CThread thread;↩
RINOK(thread.Create(CThreadExtracting::MyThreadFunction, &t));↩
UString title;↩
LangString(IDS_PROGRESS_EXTRACTING, title);↩
t.ExtractCallbackSpec->StartProgressDialog(title, thread);↩
}↩
else
#endif
{↩
t.Process2();↩
}↩
errorMessage = t.ErrorMessage;↩
if (errorMessage.IsEmpty())↩
errorMessage = t.ExtractCallbackSpec->_message;↩
isCorrupt = t.ExtractCallbackSpec->_isCorrupt;↩
return t.Result;↩
}↩