Source code

Revision control

Copy as Markdown

Other Tools

// ExtractGUI.cpp↩
#include "StdAfx.h"
#include "../../../Common/IntToString.h"
#include "../../../Common/StringConvert.h"
#include "../../../Windows/FileDir.h"
#include "../../../Windows/FileFind.h"
#include "../../../Windows/FileName.h"
#include "../../../Windows/Thread.h"
#include "../FileManager/ExtractCallback.h"
#include "../FileManager/FormatUtils.h"
#include "../FileManager/LangUtils.h"
#include "../FileManager/resourceGui.h"
#include "../FileManager/OverwriteDialogRes.h"
#include "../Common/ArchiveExtractCallback.h"
#include "../Common/PropIDUtils.h"
#include "../Explorer/MyMessages.h"
#include "resource2.h"
#include "ExtractRes.h"
#include "ExtractDialog.h"
#include "ExtractGUI.h"
#include "HashGUI.h"
#include "../FileManager/PropertyNameRes.h"
using namespace NWindows;↩
using namespace NFile;↩
using namespace NDir;↩
static const wchar_t * const kIncorrectOutDir = L"Incorrect output directory path";↩
#ifndef _SFX↩
static void AddValuePair(UString &s, UINT resourceID, UInt64 value, bool addColon = true)↩
{↩
AddLangString(s, resourceID);↩
if (addColon)↩
s += ':';↩
s.Add_Space();↩
char sz[32];↩
ConvertUInt64ToString(value, sz);↩
s += sz;↩
s.Add_LF();↩
}↩
static void AddSizePair(UString &s, UINT resourceID, UInt64 value)↩
{↩
AddLangString(s, resourceID);↩
s += ": ";↩
AddSizeValue(s, value);↩
s.Add_LF();↩
}↩
#endif
class CThreadExtracting: public CProgressThreadVirt↩
{↩
HRESULT ProcessVirt();↩
public:↩
CCodecs *codecs;↩
CExtractCallbackImp *ExtractCallbackSpec;↩
const CObjectVector<COpenType> *FormatIndices;↩
const CIntVector *ExcludedFormatIndices;↩
UStringVector *ArchivePaths;↩
UStringVector *ArchivePathsFull;↩
const NWildcard::CCensorNode *WildcardCensor;↩
const CExtractOptions *Options;↩
#ifndef _SFX↩
CHashBundle *HashBundle;↩
virtual void ProcessWasFinished_GuiVirt();↩
#endif
CMyComPtr<IExtractCallbackUI> ExtractCallback;↩
UString Title;↩
CPropNameValPairs Pairs;↩
};↩
#ifndef _SFX↩
void CThreadExtracting::ProcessWasFinished_GuiVirt()↩
{↩
if (HashBundle && !Pairs.IsEmpty())↩
ShowHashResults(Pairs, *this);↩
}↩
#endif
HRESULT CThreadExtracting::ProcessVirt()↩
{↩
CDecompressStat Stat;↩
#ifndef _SFX↩
if (HashBundle)↩
HashBundle->Init();↩
#endif
HRESULT res = Extract(codecs,↩
*FormatIndices, *ExcludedFormatIndices,↩
*ArchivePaths, *ArchivePathsFull,↩
*WildcardCensor, *Options, ExtractCallbackSpec, ExtractCallback,↩
#ifndef _SFX↩
HashBundle,↩
#endif
FinalMessage.ErrorMessage.Message, Stat);↩
#ifndef _SFX↩
if (res == S_OK && ExtractCallbackSpec->IsOK())↩
{↩
if (HashBundle)↩
{↩
AddValuePair(Pairs, IDS_ARCHIVES_COLON, Stat.NumArchives);↩
AddSizeValuePair(Pairs, IDS_PROP_PACKED_SIZE, Stat.PackSize);↩
AddHashBundleRes(Pairs, *HashBundle, UString());↩
}↩
else if (Options->TestMode)↩
{↩
UString s;↩
AddValuePair(s, IDS_ARCHIVES_COLON, Stat.NumArchives, false);↩
AddSizePair(s, IDS_PROP_PACKED_SIZE, Stat.PackSize);↩
if (Stat.NumFolders != 0)↩
AddValuePair(s, IDS_PROP_FOLDERS, Stat.NumFolders);↩
AddValuePair(s, IDS_PROP_FILES, Stat.NumFiles);↩
AddSizePair(s, IDS_PROP_SIZE, Stat.UnpackSize);↩
if (Stat.NumAltStreams != 0)↩
{↩
s.Add_LF();↩
AddValuePair(s, IDS_PROP_NUM_ALT_STREAMS, Stat.NumAltStreams);↩
AddSizePair(s, IDS_PROP_ALT_STREAMS_SIZE, Stat.AltStreams_UnpackSize);↩
}↩
s.Add_LF();↩
AddLangString(s, IDS_MESSAGE_NO_ERRORS);↩
FinalMessage.OkMessage.Title = Title;↩
FinalMessage.OkMessage.Message = s;↩
}↩
}↩
#endif
return res;↩
}↩
HRESULT ExtractGUI(↩
CCodecs *codecs,↩
const CObjectVector<COpenType> &formatIndices,↩
const CIntVector &excludedFormatIndices,↩
UStringVector &archivePaths,↩
UStringVector &archivePathsFull,↩
const NWildcard::CCensorNode &wildcardCensor,↩
CExtractOptions &options,↩
#ifndef _SFX↩
CHashBundle *hb,↩
#endif
bool showDialog,↩
bool &messageWasDisplayed,↩
CExtractCallbackImp *extractCallback,↩
HWND hwndParent)↩
{↩
messageWasDisplayed = false;↩
CThreadExtracting extracter;↩
extracter.codecs = codecs;↩
extracter.FormatIndices = &formatIndices;↩
extracter.ExcludedFormatIndices = &excludedFormatIndices;↩
if (!options.TestMode)↩
{↩
FString outputDir = options.OutputDir;↩
#ifndef UNDER_CE↩
if (outputDir.IsEmpty())↩
GetCurrentDir(outputDir);↩
#endif
if (showDialog)↩
{↩
CExtractDialog dialog;↩
FString outputDirFull;↩
if (!MyGetFullPathName(outputDir, outputDirFull))↩
{↩
ShowErrorMessage(kIncorrectOutDir);↩
messageWasDisplayed = true;↩
return E_FAIL;↩
}↩
NName::NormalizeDirPathPrefix(outputDirFull);↩
dialog.DirPath = fs2us(outputDirFull);↩
dialog.OverwriteMode = options.OverwriteMode;↩
dialog.OverwriteMode_Force = options.OverwriteMode_Force;↩
dialog.PathMode = options.PathMode;↩
dialog.PathMode_Force = options.PathMode_Force;↩
dialog.ElimDup = options.ElimDup;↩
if (archivePathsFull.Size() == 1)↩
dialog.ArcPath = archivePathsFull[0];↩
#ifndef _SFX↩
// dialog.AltStreams = options.NtOptions.AltStreams;↩
dialog.NtSecurity = options.NtOptions.NtSecurity;↩
if (extractCallback->PasswordIsDefined)↩
dialog.Password = extractCallback->Password;↩
#endif
if (dialog.Create(hwndParent) != IDOK)↩
return E_ABORT;↩
outputDir = us2fs(dialog.DirPath);↩
options.OverwriteMode = dialog.OverwriteMode;↩
options.PathMode = dialog.PathMode;↩
options.ElimDup = dialog.ElimDup;↩
#ifndef _SFX↩
// options.NtOptions.AltStreams = dialog.AltStreams;↩
options.NtOptions.NtSecurity = dialog.NtSecurity;↩
extractCallback->Password = dialog.Password;↩
extractCallback->PasswordIsDefined = !dialog.Password.IsEmpty();↩
#endif
}↩
if (!MyGetFullPathName(outputDir, options.OutputDir))↩
{↩
ShowErrorMessage(kIncorrectOutDir);↩
messageWasDisplayed = true;↩
return E_FAIL;↩
}↩
NName::NormalizeDirPathPrefix(options.OutputDir);↩
/*↩
if (!CreateComplexDirectory(options.OutputDir))↩
{↩
UString s = GetUnicodeString(NError::MyFormatMessage(GetLastError()));↩
UString s2 = MyFormatNew(IDS_CANNOT_CREATE_FOLDER,↩
#ifdef LANG↩
0x02000603,↩
#endif↩
options.OutputDir);↩
s2.Add_LF();↩
s2 += s;↩
MyMessageBox(s2);↩
return E_FAIL;↩
}↩
*/
}↩
UString title = LangString(options.TestMode ? IDS_PROGRESS_TESTING : IDS_PROGRESS_EXTRACTING);↩
extracter.Title = title;↩
extracter.ExtractCallbackSpec = extractCallback;↩
extracter.ExtractCallbackSpec->ProgressDialog = &extracter;↩
extracter.ExtractCallback = extractCallback;↩
extracter.ExtractCallbackSpec->Init();↩
extracter.CompressingMode = false;↩
extracter.ArchivePaths = &archivePaths;↩
extracter.ArchivePathsFull = &archivePathsFull;↩
extracter.WildcardCensor = &wildcardCensor;↩
extracter.Options = &options;↩
#ifndef _SFX↩
extracter.HashBundle = hb;↩
#endif
extracter.IconID = IDI_ICON;↩
RINOK(extracter.Create(title, hwndParent));↩
messageWasDisplayed = extracter.ThreadFinishedOK && extracter.MessagesDisplayed;↩
return extracter.Result;↩
}↩