mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 23:14:54 -06:00
18.06
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "../../../Common/StringConvert.h"
|
||||
#include "../../../Common/StringToInt.h"
|
||||
|
||||
#include "../../../Windows/ErrorMsg.h"
|
||||
#include "../../../Windows/FileDir.h"
|
||||
#include "../../../Windows/FileName.h"
|
||||
#ifdef _WIN32
|
||||
@@ -39,7 +40,9 @@
|
||||
extern bool g_CaseSensitive;
|
||||
extern bool g_PathTrailReplaceMode;
|
||||
|
||||
#ifdef _7ZIP_LARGE_PAGES
|
||||
bool g_LargePagesMode = false;
|
||||
#endif
|
||||
|
||||
#ifdef UNDER_CE
|
||||
|
||||
@@ -410,8 +413,19 @@ static void AddToCensorFromListFile(
|
||||
UStringVector names;
|
||||
if (!NFind::DoesFileExist(us2fs(fileName)))
|
||||
throw CArcCmdLineException(kCannotFindListFile, fileName);
|
||||
if (!ReadNamesFromListFile(us2fs(fileName), names, codePage))
|
||||
DWORD lastError = 0;
|
||||
if (!ReadNamesFromListFile2(us2fs(fileName), names, codePage, lastError))
|
||||
{
|
||||
if (lastError != 0)
|
||||
{
|
||||
UString m;
|
||||
m = "The file operation error for listfile";
|
||||
m.Add_LF();
|
||||
m += NError::MyFormatMessage(lastError);
|
||||
throw CArcCmdLineException(m, fileName);
|
||||
}
|
||||
throw CArcCmdLineException(kIncorrectListFile, fileName);
|
||||
}
|
||||
if (renamePairs)
|
||||
{
|
||||
if ((names.Size() & 1) != 0)
|
||||
|
||||
@@ -1182,7 +1182,9 @@ if (askExtractMode == NArchive::NExtract::NAskMode::kExtract && !_testMode)
|
||||
bool needDelete = true;
|
||||
if (needDelete)
|
||||
{
|
||||
if (NFind::DoesFileExist(fullProcessedPath))
|
||||
if (!DeleteFileAlways(fullProcessedPath))
|
||||
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||
{
|
||||
RINOK(SendMessageError_with_LastError(kCantDeleteOutputFile, fullProcessedPath));
|
||||
return S_OK;
|
||||
@@ -1368,13 +1370,35 @@ if (askExtractMode == NArchive::NExtract::NAskMode::kExtract && !_testMode)
|
||||
// UInt64 ticks = GetCpuTicks();
|
||||
bool res = _outFileStreamSpec->File.SetLength(_curSize);
|
||||
_fileLengthWasSet = res;
|
||||
_outFileStreamSpec->File.SeekToBegin();
|
||||
|
||||
// ticks = GetCpuTicks() - ticks;
|
||||
// printf("\nticks = %10d\n", (unsigned)ticks);
|
||||
if (!res)
|
||||
{
|
||||
RINOK(SendMessageError_with_LastError(kCantSetFileLen, fullProcessedPath));
|
||||
}
|
||||
|
||||
/*
|
||||
_outFileStreamSpec->File.Close();
|
||||
ticks = GetCpuTicks() - ticks;
|
||||
printf("\nticks = %10d\n", (unsigned)ticks);
|
||||
return S_FALSE;
|
||||
*/
|
||||
|
||||
/*
|
||||
File.SetLength() on FAT (xp64): is fast, but then File.Close() can be slow,
|
||||
if we don't write any data.
|
||||
File.SetLength() for remote share file (exFAT) can be slow in some cases,
|
||||
and the Windows can return "network error" after 1 minute,
|
||||
while remote file still can grow.
|
||||
We need some way to detect such bad cases and disable PreAllocateOutFile mode.
|
||||
*/
|
||||
|
||||
res = _outFileStreamSpec->File.SeekToBegin();
|
||||
if (!res)
|
||||
{
|
||||
RINOK(SendMessageError_with_LastError("Can not seek to begin of file", fullProcessedPath));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SUPPORT_ALT_STREAMS
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "../../../Common/Wildcard.h"
|
||||
|
||||
#include "../../../Windows/FileDir.h"
|
||||
#include "../../../Windows/FileName.h"
|
||||
|
||||
@@ -11,7 +13,7 @@
|
||||
using namespace NWindows;
|
||||
using namespace NFile;
|
||||
|
||||
UString CreateArchiveName(const NFind::CFileInfo &fi, bool keepName)
|
||||
static UString CreateArchiveName(const NFind::CFileInfo &fi, bool keepName)
|
||||
{
|
||||
FString resultName = fi.Name;
|
||||
if (!fi.IsDir() && !keepName)
|
||||
@@ -72,7 +74,75 @@ static FString CreateArchiveName2(const FString &path, bool fromPrev, bool keepN
|
||||
return resultName;
|
||||
}
|
||||
|
||||
UString CreateArchiveName(const UString &path, bool fromPrev, bool keepName)
|
||||
|
||||
UString CreateArchiveName(const UStringVector &paths, const NFind::CFileInfo *fi)
|
||||
{
|
||||
return Get_Correct_FsFile_Name(fs2us(CreateArchiveName2(us2fs(path), fromPrev, keepName)));
|
||||
bool keepName = false;
|
||||
/*
|
||||
if (paths.Size() == 1)
|
||||
{
|
||||
const UString &name = paths[0];
|
||||
if (name.Len() > 4)
|
||||
if (CompareFileNames(name.RightPtr(4), L".tar") == 0)
|
||||
keepName = true;
|
||||
}
|
||||
*/
|
||||
|
||||
UString name;
|
||||
if (fi)
|
||||
name = CreateArchiveName(*fi, keepName);
|
||||
else
|
||||
{
|
||||
if (paths.IsEmpty())
|
||||
return L"archive";
|
||||
bool fromPrev = (paths.Size() > 1);
|
||||
name = Get_Correct_FsFile_Name(fs2us(CreateArchiveName2(us2fs(paths.Front()), fromPrev, keepName)));
|
||||
}
|
||||
|
||||
UString postfix;
|
||||
UInt32 index = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
// we don't want cases when we include archive to itself.
|
||||
// so we find first available name for archive
|
||||
const UString name2 = name + postfix;
|
||||
const UString name2_zip = name2 + L".zip";
|
||||
const UString name2_7z = name2 + L".7z";
|
||||
const UString name2_tar = name2 + L".tar";
|
||||
const UString name2_wim = name2 + L".wim";
|
||||
|
||||
unsigned i = 0;
|
||||
|
||||
for (i = 0; i < paths.Size(); i++)
|
||||
{
|
||||
const UString &fn = paths[i];
|
||||
NFind::CFileInfo fi2;
|
||||
|
||||
const NFind::CFileInfo *fp;
|
||||
if (fi && paths.Size() == 1)
|
||||
fp = fi;
|
||||
else
|
||||
{
|
||||
if (!fi2.Find(us2fs(fn)))
|
||||
continue;
|
||||
fp = &fi2;
|
||||
}
|
||||
const UString fname = fs2us(fp->Name);
|
||||
if ( 0 == CompareFileNames(fname, name2_zip)
|
||||
|| 0 == CompareFileNames(fname, name2_7z)
|
||||
|| 0 == CompareFileNames(fname, name2_tar)
|
||||
|| 0 == CompareFileNames(fname, name2_wim))
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == paths.Size())
|
||||
break;
|
||||
index++;
|
||||
postfix = "_";
|
||||
postfix.Add_UInt32(index);
|
||||
}
|
||||
|
||||
name += postfix;
|
||||
return name;
|
||||
}
|
||||
|
||||
@@ -3,11 +3,8 @@
|
||||
#ifndef __ARCHIVE_NAME_H
|
||||
#define __ARCHIVE_NAME_H
|
||||
|
||||
#include "../../../Common/MyString.h"
|
||||
|
||||
#include "../../../Windows/FileFind.h"
|
||||
|
||||
UString CreateArchiveName(const UString &path, bool fromPrev, bool keepName);
|
||||
UString CreateArchiveName(const NWindows::NFile::NFind::CFileInfo &fileInfo, bool keepName);
|
||||
UString CreateArchiveName(const UStringVector &paths, const NWindows::NFile::NFind::CFileInfo *fi = NULL);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -522,10 +522,9 @@ class CBenchProgressInfo:
|
||||
{
|
||||
public:
|
||||
CBenchProgressStatus *Status;
|
||||
HRESULT Res;
|
||||
IBenchCallback *Callback;
|
||||
|
||||
CBenchProgressInfo(): Callback(0) {}
|
||||
CBenchProgressInfo(): Callback(NULL) {}
|
||||
MY_UNKNOWN_IMP
|
||||
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
|
||||
};
|
||||
@@ -758,7 +757,7 @@ struct CEncoderInfo
|
||||
fileData(NULL),
|
||||
CheckCrc_Enc(true),
|
||||
CheckCrc_Dec(true),
|
||||
outStreamSpec(0), callback(0), printCallback(0), propStreamSpec(0) {}
|
||||
outStreamSpec(NULL), callback(NULL), printCallback(NULL), propStreamSpec(NULL) {}
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
|
||||
@@ -1144,7 +1143,7 @@ static const UInt32 kNumThreadsMax = (1 << 12);
|
||||
struct CBenchEncoders
|
||||
{
|
||||
CEncoderInfo *encoders;
|
||||
CBenchEncoders(UInt32 num): encoders(0) { encoders = new CEncoderInfo[num]; }
|
||||
CBenchEncoders(UInt32 num): encoders(NULL) { encoders = new CEncoderInfo[num]; }
|
||||
~CBenchEncoders() { delete []encoders; }
|
||||
};
|
||||
|
||||
@@ -1545,7 +1544,7 @@ struct CFreqThreads
|
||||
CFreqInfo *Items;
|
||||
UInt32 NumThreads;
|
||||
|
||||
CFreqThreads(): Items(0), NumThreads(0) {}
|
||||
CFreqThreads(): Items(NULL), NumThreads(0) {}
|
||||
void WaitAll()
|
||||
{
|
||||
for (UInt32 i = 0; i < NumThreads; i++)
|
||||
@@ -1603,7 +1602,7 @@ struct CCrcThreads
|
||||
CCrcInfo *Items;
|
||||
UInt32 NumThreads;
|
||||
|
||||
CCrcThreads(): Items(0), NumThreads(0) {}
|
||||
CCrcThreads(): Items(NULL), NumThreads(0) {}
|
||||
void WaitAll()
|
||||
{
|
||||
for (UInt32 i = 0; i < NumThreads; i++)
|
||||
@@ -1885,8 +1884,51 @@ AString GetProcessThreadsInfo(const NSystem::CProcessAffinity &ti)
|
||||
}
|
||||
|
||||
|
||||
static void PrintSize(AString &s, UInt64 v)
|
||||
{
|
||||
char c = 0;
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'K';
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'M';
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'G';
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'T';
|
||||
}}}}
|
||||
else
|
||||
{
|
||||
PrintHex(s, v);
|
||||
return;
|
||||
}
|
||||
char temp[32];
|
||||
ConvertUInt64ToString(v, temp);
|
||||
s += temp;
|
||||
if (c)
|
||||
s += c;
|
||||
}
|
||||
|
||||
|
||||
#ifdef _7ZIP_LARGE_PAGES
|
||||
|
||||
extern bool g_LargePagesMode;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
extern SIZE_T g_LargePageSize;
|
||||
}
|
||||
|
||||
void Add_LargePages_String(AString &s)
|
||||
{
|
||||
if (g_LargePagesMode || g_LargePageSize != 0)
|
||||
{
|
||||
s += " (LP-";
|
||||
PrintSize(s, g_LargePageSize);
|
||||
if (!g_LargePagesMode)
|
||||
s += "-NA";
|
||||
s += ")";
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
static void PrintRequirements(IBenchPrintCallback &f, const char *sizeString,
|
||||
bool size_Defined, UInt64 size, const char *threadsString, UInt32 numThreads)
|
||||
@@ -1898,8 +1940,15 @@ static void PrintRequirements(IBenchPrintCallback &f, const char *sizeString,
|
||||
else
|
||||
f.Print(" ?");
|
||||
f.Print(" MB");
|
||||
if (g_LargePagesMode)
|
||||
f.Print(" LP");
|
||||
|
||||
#ifdef _7ZIP_LARGE_PAGES
|
||||
{
|
||||
AString s;
|
||||
Add_LargePages_String(s);
|
||||
f.Print(s);
|
||||
}
|
||||
#endif
|
||||
|
||||
f.Print(", # ");
|
||||
f.Print(threadsString);
|
||||
PrintNumber(f, numThreads, 3);
|
||||
@@ -2539,26 +2588,7 @@ static const char * const k_PF[] =
|
||||
#endif
|
||||
|
||||
|
||||
static void PrintSize(AString &s, UInt64 v)
|
||||
{
|
||||
char c = 0;
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'K';
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'M';
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'G';
|
||||
if ((v & 0x3FF) == 0) { v >>= 10; c = 'T';
|
||||
}}}}
|
||||
else
|
||||
{
|
||||
PrintHex(s, v);
|
||||
return;
|
||||
}
|
||||
char temp[32];
|
||||
ConvertUInt64ToString(v, temp);
|
||||
s += temp;
|
||||
if (c)
|
||||
s += c;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void PrintPage(AString &s, UInt32 v)
|
||||
{
|
||||
@@ -2707,8 +2737,9 @@ void GetCpuName(AString &s)
|
||||
|
||||
#endif
|
||||
|
||||
if (g_LargePagesMode)
|
||||
s += " (LP)";
|
||||
#ifdef _7ZIP_LARGE_PAGES
|
||||
Add_LargePages_String(s);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -2968,6 +2999,9 @@ HRESULT Bench(
|
||||
UInt64 start = ::GetTimeCount();
|
||||
UInt32 sum = (UInt32)start;
|
||||
sum = CountCpuFreq(sum, (UInt32)(numMilCommands * 1000000 / kNumFreqCommands), g_BenchCpuFreqTemp);
|
||||
if (sum == 0xF1541213)
|
||||
if (printCallback)
|
||||
printCallback->Print("");
|
||||
const UInt64 realDelta = ::GetTimeCount() - start;
|
||||
start = realDelta;
|
||||
if (start == 0)
|
||||
@@ -2984,7 +3018,7 @@ HRESULT Bench(
|
||||
else
|
||||
{
|
||||
// PrintNumber(*printCallback, start, 0);
|
||||
PrintNumber(*printCallback, mipsVal, 5 + ((sum == 0xF1541213) ? 1 : 0));
|
||||
PrintNumber(*printCallback, mipsVal, 5);
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -68,5 +68,10 @@ void GetSysInfo(AString &s1, AString &s2);
|
||||
void GetCpuName(AString &s);
|
||||
void GetCpuFeatures(AString &s);
|
||||
|
||||
#ifdef _7ZIP_LARGE_PAGES
|
||||
void Add_LargePages_String(AString &s);
|
||||
#else
|
||||
// #define Add_LargePages_String
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1084,3 +1084,13 @@ CMessagePathException::CMessagePathException(const char *a, const wchar_t *u)
|
||||
(*this) += u;
|
||||
}
|
||||
}
|
||||
|
||||
CMessagePathException::CMessagePathException(const wchar_t *a, const wchar_t *u)
|
||||
{
|
||||
(*this) += a;
|
||||
if (u)
|
||||
{
|
||||
Add_LF();
|
||||
(*this) += u;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ HRESULT EnumerateItems(
|
||||
struct CMessagePathException: public UString
|
||||
{
|
||||
CMessagePathException(const char *a, const wchar_t *u = NULL);
|
||||
CMessagePathException(const wchar_t *a, const wchar_t *u = NULL);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -230,7 +230,7 @@ HRESULT HashCalc(
|
||||
unsigned i;
|
||||
CHashBundle hb;
|
||||
RINOK(hb.SetMethods(EXTERNAL_CODECS_LOC_VARS options.Methods));
|
||||
hb.Init();
|
||||
// hb.Init();
|
||||
|
||||
hb.NumErrors = dirItems.Stat.NumErrors;
|
||||
|
||||
|
||||
@@ -51,9 +51,13 @@ struct CHashBundle: public IHashCalc
|
||||
|
||||
UInt64 CurSize;
|
||||
|
||||
UString MainName;
|
||||
UString FirstFileName;
|
||||
|
||||
HRESULT SetMethods(DECL_EXTERNAL_CODECS_LOC_VARS const UStringVector &methods);
|
||||
|
||||
void Init()
|
||||
// void Init() {}
|
||||
CHashBundle()
|
||||
{
|
||||
NumDirs = NumFiles = NumAltStreams = FilesSize = AltStreamsSize = NumErrors = 0;
|
||||
}
|
||||
@@ -76,7 +80,7 @@ struct CHashBundle: public IHashCalc
|
||||
virtual HRESULT GetStream(const wchar_t *name, bool isFolder) x; \
|
||||
virtual HRESULT OpenFileError(const FString &path, DWORD systemError) x; \
|
||||
virtual HRESULT SetOperationResult(UInt64 fileSize, const CHashBundle &hb, bool showHash) x; \
|
||||
virtual HRESULT AfterLastFile(const CHashBundle &hb) x; \
|
||||
virtual HRESULT AfterLastFile(CHashBundle &hb) x; \
|
||||
|
||||
struct IHashCallbackUI: public IDirItemsCallback
|
||||
{
|
||||
|
||||
@@ -563,6 +563,8 @@ HRESULT CArc::GetItemPathToParent(UInt32 index, UInt32 parent, UStringVector &pa
|
||||
UInt32 parentType = 0;
|
||||
RINOK(GetRawProps->GetParent(curIndex, &curParent, &parentType));
|
||||
|
||||
// 18.06: fixed : we don't want to split name to parts
|
||||
/*
|
||||
if (parentType != NParentType::kAltStream)
|
||||
{
|
||||
for (;;)
|
||||
@@ -576,6 +578,7 @@ HRESULT CArc::GetItemPathToParent(UInt32 index, UInt32 parent, UStringVector &pa
|
||||
s.DeleteFrom(pos);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
parts.Insert(0, s);
|
||||
|
||||
@@ -2013,7 +2016,7 @@ HRESULT CArc::OpenStream2(const COpenOptions &op)
|
||||
}
|
||||
else
|
||||
{
|
||||
const CArcInfoEx &ai = op.codecs->Formats[formatIndex];
|
||||
const CArcInfoEx &ai = op.codecs->Formats[(unsigned)formatIndex];
|
||||
if (ai.FindExtension(extension) >= 0)
|
||||
{
|
||||
if (ai.Flags_FindSignature() && searchMarkerInHandler)
|
||||
|
||||
@@ -288,29 +288,27 @@ void CArchivePath::ParseFromPath(const UString &path, EArcNameMode mode)
|
||||
|
||||
if (mode == k_ArcNameMode_Add)
|
||||
return;
|
||||
if (mode == k_ArcNameMode_Exact)
|
||||
{
|
||||
BaseExtension.Empty();
|
||||
return;
|
||||
}
|
||||
|
||||
int dotPos = Name.ReverseFind_Dot();
|
||||
if (dotPos < 0)
|
||||
return;
|
||||
if ((unsigned)dotPos == Name.Len() - 1)
|
||||
if (mode != k_ArcNameMode_Exact)
|
||||
{
|
||||
Name.DeleteBack();
|
||||
BaseExtension.Empty();
|
||||
return;
|
||||
int dotPos = Name.ReverseFind_Dot();
|
||||
if (dotPos < 0)
|
||||
return;
|
||||
if ((unsigned)dotPos == Name.Len() - 1)
|
||||
Name.DeleteBack();
|
||||
else
|
||||
{
|
||||
const UString ext = Name.Ptr(dotPos + 1);
|
||||
if (BaseExtension.IsEqualTo_NoCase(ext))
|
||||
{
|
||||
BaseExtension = ext;
|
||||
Name.DeleteFrom(dotPos);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
const UString ext = Name.Ptr(dotPos + 1);
|
||||
if (BaseExtension.IsEqualTo_NoCase(ext))
|
||||
{
|
||||
BaseExtension = ext;
|
||||
Name.DeleteFrom(dotPos);
|
||||
}
|
||||
else
|
||||
BaseExtension.Empty();
|
||||
|
||||
BaseExtension.Empty();
|
||||
}
|
||||
|
||||
UString CArchivePath::GetFinalPath() const
|
||||
@@ -327,6 +325,7 @@ UString CArchivePath::GetFinalPath() const
|
||||
UString CArchivePath::GetFinalVolPath() const
|
||||
{
|
||||
UString path = GetPathWithoutExt();
|
||||
// if BaseExtension is empty, we must ignore VolExtension also.
|
||||
if (!BaseExtension.IsEmpty())
|
||||
{
|
||||
path += '.';
|
||||
@@ -1166,7 +1165,7 @@ HRESULT UpdateArchive(
|
||||
{
|
||||
errorInfo.SystemError = ERROR_ACCESS_DENIED;
|
||||
errorInfo.Message = "The file is read-only";
|
||||
errorInfo.FileNames.Add(arcPath);
|
||||
errorInfo.FileNames.Add(us2fs(arcPath));
|
||||
return errorInfo.Get_HRESULT_Error();
|
||||
}
|
||||
|
||||
@@ -1377,6 +1376,31 @@ HRESULT UpdateArchive(
|
||||
|
||||
unsigned ci;
|
||||
|
||||
|
||||
// self including protection
|
||||
if (options.DeleteAfterCompressing)
|
||||
{
|
||||
for (ci = 0; ci < options.Commands.Size(); ci++)
|
||||
{
|
||||
CArchivePath &ap = options.Commands[ci].ArchivePath;
|
||||
const FString path = us2fs(ap.GetFinalPath());
|
||||
// maybe we must compare absolute paths path here
|
||||
FOR_VECTOR (i, dirItems.Items)
|
||||
{
|
||||
const FString phyPath = dirItems.GetPhyPath(i);
|
||||
if (phyPath == path)
|
||||
{
|
||||
UString s;
|
||||
s = "It is not allowed to include archive to itself";
|
||||
s.Add_LF();
|
||||
s += path;
|
||||
throw s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (ci = 0; ci < options.Commands.Size(); ci++)
|
||||
{
|
||||
CArchivePath &ap = options.Commands[ci].ArchivePath;
|
||||
@@ -1562,26 +1586,39 @@ HRESULT UpdateArchive(
|
||||
}
|
||||
|
||||
CCurrentDirRestorer curDirRestorer;
|
||||
|
||||
AStringVector paths;
|
||||
AStringVector names;
|
||||
|
||||
for (i = 0; i < fullPaths.Size(); i++)
|
||||
{
|
||||
const UString arcPath2 = fs2us(fullPaths[i]);
|
||||
const UString fileName = ExtractFileNameFromPath(arcPath2);
|
||||
const AString path (GetAnsiString(arcPath2));
|
||||
const AString name (GetAnsiString(fileName));
|
||||
paths.Add(GetAnsiString(arcPath2));
|
||||
names.Add(GetAnsiString(fileName));
|
||||
// const AString path (GetAnsiString(arcPath2));
|
||||
// const AString name (GetAnsiString(fileName));
|
||||
// Warning!!! MAPISendDocuments function changes Current directory
|
||||
// fnSend(0, ";", (LPSTR)(LPCSTR)path, (LPSTR)(LPCSTR)name, 0);
|
||||
}
|
||||
|
||||
MapiFileDesc f;
|
||||
CRecordVector<MapiFileDesc> files;
|
||||
files.ClearAndSetSize(paths.Size());
|
||||
|
||||
for (i = 0; i < paths.Size(); i++)
|
||||
{
|
||||
MapiFileDesc &f = files[i];
|
||||
memset(&f, 0, sizeof(f));
|
||||
f.nPosition = 0xFFFFFFFF;
|
||||
f.lpszPathName = (char *)(const char *)path;
|
||||
f.lpszFileName = (char *)(const char *)name;
|
||||
|
||||
f.lpszPathName = (char *)(const char *)paths[i];
|
||||
f.lpszFileName = (char *)(const char *)names[i];
|
||||
}
|
||||
|
||||
{
|
||||
MapiMessage m;
|
||||
memset(&m, 0, sizeof(m));
|
||||
m.nFileCount = 1;
|
||||
m.lpFiles = &f;
|
||||
m.nFileCount = files.Size();
|
||||
m.lpFiles = &files.Front();
|
||||
|
||||
const AString addr (GetAnsiString(options.EMailAddress));
|
||||
MapiRecipDesc rec;
|
||||
|
||||
@@ -332,7 +332,7 @@ void CHashCallbackConsole::PrintProperty(const char *name, UInt64 value)
|
||||
*_so << name << s << endl;
|
||||
}
|
||||
|
||||
HRESULT CHashCallbackConsole::AfterLastFile(const CHashBundle &hb)
|
||||
HRESULT CHashCallbackConsole::AfterLastFile(CHashBundle &hb)
|
||||
{
|
||||
ClosePercents2();
|
||||
|
||||
|
||||
@@ -1072,18 +1072,24 @@ HRESULT ListArchives(CCodecs *codecs,
|
||||
errorCode = ERROR_FILE_NOT_FOUND;
|
||||
lastError = HRESULT_FROM_WIN32(lastError);;
|
||||
g_StdOut.Flush();
|
||||
*g_ErrStream << endl << kError << NError::MyFormatMessage(errorCode) << endl;
|
||||
g_ErrStream->NormalizePrint_UString(arcPath);
|
||||
*g_ErrStream << endl << endl;
|
||||
if (g_ErrStream)
|
||||
{
|
||||
*g_ErrStream << endl << kError << NError::MyFormatMessage(errorCode) << endl;
|
||||
g_ErrStream->NormalizePrint_UString(arcPath);
|
||||
*g_ErrStream << endl << endl;
|
||||
}
|
||||
numErrors++;
|
||||
continue;
|
||||
}
|
||||
if (fi.IsDir())
|
||||
{
|
||||
g_StdOut.Flush();
|
||||
*g_ErrStream << endl << kError;
|
||||
g_ErrStream->NormalizePrint_UString(arcPath);
|
||||
*g_ErrStream << " is not a file" << endl << endl;
|
||||
if (g_ErrStream)
|
||||
{
|
||||
*g_ErrStream << endl << kError;
|
||||
g_ErrStream->NormalizePrint_UString(arcPath);
|
||||
*g_ErrStream << " is not a file" << endl << endl;
|
||||
}
|
||||
numErrors++;
|
||||
continue;
|
||||
}
|
||||
@@ -1133,24 +1139,28 @@ HRESULT ListArchives(CCodecs *codecs,
|
||||
{
|
||||
if (result == E_ABORT)
|
||||
return result;
|
||||
g_StdOut.Flush();
|
||||
*g_ErrStream << endl << kError;
|
||||
g_ErrStream->NormalizePrint_UString(arcPath);
|
||||
*g_ErrStream << " : ";
|
||||
if (result == S_FALSE)
|
||||
{
|
||||
Print_OpenArchive_Error(*g_ErrStream, codecs, arcLink);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (result != S_FALSE)
|
||||
lastError = result;
|
||||
*g_ErrStream << "opening : ";
|
||||
if (result == E_OUTOFMEMORY)
|
||||
*g_ErrStream << "Can't allocate required memory";
|
||||
g_StdOut.Flush();
|
||||
if (g_ErrStream)
|
||||
{
|
||||
*g_ErrStream << endl << kError;
|
||||
g_ErrStream->NormalizePrint_UString(arcPath);
|
||||
*g_ErrStream << " : ";
|
||||
if (result == S_FALSE)
|
||||
{
|
||||
Print_OpenArchive_Error(*g_ErrStream, codecs, arcLink);
|
||||
}
|
||||
else
|
||||
*g_ErrStream << NError::MyFormatMessage(result);
|
||||
{
|
||||
*g_ErrStream << "opening : ";
|
||||
if (result == E_OUTOFMEMORY)
|
||||
*g_ErrStream << "Can't allocate required memory";
|
||||
else
|
||||
*g_ErrStream << NError::MyFormatMessage(result);
|
||||
}
|
||||
*g_ErrStream << endl;
|
||||
}
|
||||
*g_ErrStream << endl;
|
||||
numErrors++;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "../../../Windows/TimeUtils.h"
|
||||
|
||||
#include "../Common/ArchiveCommandLine.h"
|
||||
#include "../Common/Bench.h"
|
||||
#include "../Common/ExitCode.h"
|
||||
#include "../Common/Extract.h"
|
||||
|
||||
@@ -56,8 +57,6 @@ using namespace NCommandLineParser;
|
||||
HINSTANCE g_hInstance = 0;
|
||||
#endif
|
||||
|
||||
extern bool g_LargePagesMode;
|
||||
|
||||
extern CStdOutStream *g_StdStream;
|
||||
extern CStdOutStream *g_ErrStream;
|
||||
|
||||
@@ -236,7 +235,7 @@ static void PrintWarningsPaths(const CErrorPathCodes &pc, CStdOutStream &so)
|
||||
{
|
||||
FOR_VECTOR(i, pc.Paths)
|
||||
{
|
||||
so.NormalizePrint_UString(pc.Paths[i]);
|
||||
so.NormalizePrint_UString(fs2us(pc.Paths[i]));
|
||||
so << " : ";
|
||||
so << NError::MyFormatMessage(pc.Codes[i]) << endl;
|
||||
}
|
||||
@@ -376,8 +375,13 @@ static void PrintMemUsage(const char *s, UInt64 val)
|
||||
*g_StdStream << " " << s << " Memory =";
|
||||
PrintNum(SHIFT_SIZE_VALUE(val, 20), 7);
|
||||
*g_StdStream << " MB";
|
||||
if (g_LargePagesMode)
|
||||
*g_StdStream << " (LP)";
|
||||
|
||||
#ifdef _7ZIP_LARGE_PAGES
|
||||
AString lp;
|
||||
Add_LargePages_String(lp);
|
||||
if (!lp.IsEmpty())
|
||||
*g_StdStream << lp;
|
||||
#endif
|
||||
}
|
||||
|
||||
EXTERN_C_BEGIN
|
||||
@@ -911,7 +915,7 @@ int Main2(
|
||||
{
|
||||
hashCalc = &hb;
|
||||
ThrowException_if_Error(hb.SetMethods(EXTERNAL_CODECS_VARS_L options.HashMethods));
|
||||
hb.Init();
|
||||
// hb.Init();
|
||||
}
|
||||
|
||||
hresultMain = Extract(
|
||||
|
||||
@@ -582,7 +582,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu,
|
||||
}
|
||||
}
|
||||
|
||||
const UString &fileName = _fileNames.Front();
|
||||
// const UString &fileName = _fileNames.Front();
|
||||
|
||||
if (needExtract)
|
||||
{
|
||||
@@ -639,12 +639,8 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu,
|
||||
}
|
||||
}
|
||||
|
||||
UString arcName;
|
||||
if (_fileNames.Size() == 1)
|
||||
arcName = CreateArchiveName(fi0, false);
|
||||
else
|
||||
arcName = CreateArchiveName(fileName, _fileNames.Size() > 1, false);
|
||||
|
||||
const UString arcName = CreateArchiveName(_fileNames, _fileNames.Size() == 1 ? &fi0 : NULL);
|
||||
|
||||
UString arcName7z = arcName;
|
||||
arcName7z += ".7z";
|
||||
UString arcNameZip = arcName;
|
||||
|
||||
@@ -327,7 +327,7 @@ HRESULT OpenArchive(const CSysString &fileName,
|
||||
}
|
||||
*/
|
||||
|
||||
static HANDLE MyOpenFilePluginW(const wchar_t *name)
|
||||
static HANDLE MyOpenFilePluginW(const wchar_t *name, bool isAbortCodeSupported)
|
||||
{
|
||||
FString normalizedName = us2fs(name);
|
||||
normalizedName.Trim();
|
||||
@@ -373,7 +373,12 @@ static HANDLE MyOpenFilePluginW(const wchar_t *name)
|
||||
archiverInfoResult, defaultName, openArchiveCallback);
|
||||
*/
|
||||
if (result == E_ABORT)
|
||||
return (HANDLE)-2;
|
||||
{
|
||||
// fixed 18.06:
|
||||
// OpenFilePlugin() is allowed to return (HANDLE)-2 as abort code
|
||||
// OpenPlugin() is not allowed to return (HANDLE)-2.
|
||||
return isAbortCodeSupported ? (HANDLE)-2 : INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
UString errorMessage = agent->GetErrorMessage();
|
||||
if (!errorMessage.IsEmpty())
|
||||
@@ -403,7 +408,7 @@ static HANDLE MyOpenFilePluginW(const wchar_t *name)
|
||||
return (HANDLE)(plugin);
|
||||
}
|
||||
|
||||
static HANDLE MyOpenFilePlugin(const char *name)
|
||||
static HANDLE MyOpenFilePlugin(const char *name, bool isAbortCodeSupported)
|
||||
{
|
||||
UINT codePage =
|
||||
#ifdef UNDER_CE
|
||||
@@ -411,7 +416,7 @@ static HANDLE MyOpenFilePlugin(const char *name)
|
||||
#else
|
||||
::AreFileApisANSI() ? CP_ACP : CP_OEMCP;
|
||||
#endif
|
||||
return MyOpenFilePluginW(GetUnicodeString(name, codePage));
|
||||
return MyOpenFilePluginW(GetUnicodeString(name, codePage), isAbortCodeSupported);
|
||||
}
|
||||
|
||||
EXTERN_C HANDLE WINAPI OpenFilePlugin(char *name, const unsigned char * /* data */, int /* dataSize */)
|
||||
@@ -423,7 +428,7 @@ EXTERN_C HANDLE WINAPI OpenFilePlugin(char *name, const unsigned char * /* data
|
||||
// if (!Opt.ProcessShiftF1)
|
||||
return(INVALID_HANDLE_VALUE);
|
||||
}
|
||||
return MyOpenFilePlugin(name);
|
||||
return MyOpenFilePlugin(name, true); // isAbortCodeSupported
|
||||
MY_TRY_END2("OpenFilePlugin", INVALID_HANDLE_VALUE);
|
||||
}
|
||||
|
||||
@@ -458,7 +463,7 @@ EXTERN_C HANDLE WINAPI OpenPlugin(int openFrom, INT_PTR item)
|
||||
fileName.DeleteBack();
|
||||
fileName.DeleteFrontal(1);
|
||||
}
|
||||
return MyOpenFilePlugin(fileName);
|
||||
return MyOpenFilePlugin(fileName, false); // isAbortCodeSupported
|
||||
}
|
||||
|
||||
if (openFrom == OPEN_PLUGINSMENU)
|
||||
@@ -470,7 +475,7 @@ EXTERN_C HANDLE WINAPI OpenPlugin(int openFrom, INT_PTR item)
|
||||
PluginPanelItem pluginPanelItem;
|
||||
if (!g_StartupInfo.ControlGetActivePanelCurrentItemInfo(pluginPanelItem))
|
||||
throw 142134;
|
||||
return MyOpenFilePlugin(pluginPanelItem.FindData.cFileName);
|
||||
return MyOpenFilePlugin(pluginPanelItem.FindData.cFileName, false); // isAbortCodeSupported
|
||||
}
|
||||
|
||||
case 1:
|
||||
|
||||
@@ -468,7 +468,7 @@ static HRESULT UpdateFile(NFsFolder::CCopyStateIO &state, CFSTR inPath, CFSTR ou
|
||||
{
|
||||
if (NFind::DoesFileOrDirExist(outPath))
|
||||
{
|
||||
RINOK(SendMessageError(callback, NError::MyFormatMessage(ERROR_ALREADY_EXISTS), outPath));
|
||||
RINOK(SendMessageError(callback, NError::MyFormatMessage(ERROR_ALREADY_EXISTS), FString(outPath)));
|
||||
CFileInfo fi;
|
||||
if (fi.Find(inPath))
|
||||
{
|
||||
|
||||
@@ -759,11 +759,15 @@ STDMETHODIMP CExtractCallbackImp::AskWrite(
|
||||
destPathResultTemp = fs2us(destPathSys);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (NFind::DoesFileExist(destPathSys))
|
||||
if (!NDir::DeleteFileAlways(destPathSys))
|
||||
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||
{
|
||||
RINOK(MessageError("can not delete output file", destPathSys));
|
||||
return E_ABORT;
|
||||
}
|
||||
}
|
||||
}
|
||||
*writeAnswer = BoolToInt(true);
|
||||
return StringToBstr(destPathResultTemp, destPathResult);
|
||||
|
||||
@@ -213,6 +213,12 @@ void CListViewDialog::ShowItemInfo()
|
||||
if (index < Values.Size())
|
||||
dlg.Text = Values[index];
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (dlg.Text.Find(L'\r') < 0)
|
||||
dlg.Text.Replace(L"\n", L"\r\n");
|
||||
#endif
|
||||
|
||||
dlg.Create(*this);
|
||||
}
|
||||
|
||||
|
||||
@@ -879,8 +879,9 @@ void CPanel::AddToArchive()
|
||||
|
||||
FOR_VECTOR (i, indices)
|
||||
names.Add(curPrefix + GetItemRelPath2(indices[i]));
|
||||
bool fromPrev = (names.Size() > 1);
|
||||
const UString arcName = CreateArchiveName(names.Front(), fromPrev, false);
|
||||
|
||||
const UString arcName = CreateArchiveName(names);
|
||||
|
||||
HRESULT res = CompressFiles(destCurDirPrefix, arcName, L"",
|
||||
true, // addExtension
|
||||
names, false, true, false);
|
||||
|
||||
@@ -29,7 +29,7 @@ public:
|
||||
CMyComPtr<IFolderOperationsExtractCallback> ExtractCallback;
|
||||
|
||||
CHashBundle Hash;
|
||||
UString FirstFilePath;
|
||||
// UString FirstFilePath;
|
||||
|
||||
HRESULT Result;
|
||||
|
||||
@@ -48,7 +48,7 @@ void CPanelCopyThread::ShowFinalResults(HWND hwnd)
|
||||
if (!ResultsWereShown)
|
||||
{
|
||||
ResultsWereShown = true;
|
||||
ShowHashResults(Hash, fs2us(FirstFilePath), hwnd);
|
||||
ShowHashResults(Hash, hwnd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ HRESULT CPanelCopyThread::ProcessVirt()
|
||||
else if (options->testMode)
|
||||
{
|
||||
CProgressMessageBoxPair &pair = GetMessagePair(false); // GetMessagePair(ExtractCallbackSpec->Hash.NumErrors != 0);
|
||||
AddHashBundleRes(pair.Message, Hash, FirstFilePath);
|
||||
AddHashBundleRes(pair.Message, Hash);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,7 +158,10 @@ HRESULT CPanel::CopyTo(CCopyToOptions &options, const CRecordVector<UInt32> &ind
|
||||
|
||||
|
||||
if (indices.Size() == 1)
|
||||
extracter.FirstFilePath = GetItemRelPath(indices[0]);
|
||||
{
|
||||
extracter.Hash.FirstFileName = GetItemRelPath(indices[0]);
|
||||
extracter.Hash.MainName = extracter.Hash.FirstFileName;
|
||||
}
|
||||
|
||||
if (options.VirtFileSystem)
|
||||
{
|
||||
@@ -186,7 +189,7 @@ HRESULT CPanel::CopyTo(CCopyToOptions &options, const CRecordVector<UInt32> &ind
|
||||
extracter.ExtractCallbackSpec->SetHashCalc(&extracter.Hash);
|
||||
}
|
||||
|
||||
extracter.Hash.Init();
|
||||
// extracter.Hash.Init();
|
||||
|
||||
UString title;
|
||||
{
|
||||
|
||||
@@ -147,7 +147,7 @@ class CThreadCrc: public CProgressThreadVirt
|
||||
public:
|
||||
CDirEnumerator Enumerator;
|
||||
CHashBundle Hash;
|
||||
FString FirstFilePath;
|
||||
// FString FirstFilePath;
|
||||
|
||||
void SetStatus(const UString &s);
|
||||
void AddErrorMessage(DWORD systemError, const FChar *name);
|
||||
@@ -165,7 +165,7 @@ void CThreadCrc::ShowFinalResults(HWND hwnd)
|
||||
if (!ResultsWereShown)
|
||||
{
|
||||
ResultsWereShown = true;
|
||||
ShowHashResults(Hash, fs2us(FirstFilePath), hwnd);
|
||||
ShowHashResults(Hash, hwnd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +193,7 @@ void CThreadCrc::SetStatus(const UString &s2)
|
||||
|
||||
HRESULT CThreadCrc::ProcessVirt()
|
||||
{
|
||||
Hash.Init();
|
||||
// Hash.Init();
|
||||
|
||||
CMyBuffer buf;
|
||||
if (!buf.Allocate(kBufSize))
|
||||
@@ -289,7 +289,7 @@ HRESULT CThreadCrc::ProcessVirt()
|
||||
}
|
||||
if (isFirstFile)
|
||||
{
|
||||
FirstFilePath = path;
|
||||
Hash.FirstFileName = path;
|
||||
isFirstFile = false;
|
||||
}
|
||||
sync.Set_FilePath(fs2us(path));
|
||||
@@ -370,9 +370,13 @@ HRESULT CApp::CalculateCrc2(const UString &methodName)
|
||||
methods.Add(methodName);
|
||||
RINOK(t.Hash.SetMethods(EXTERNAL_CODECS_VARS_G methods));
|
||||
}
|
||||
|
||||
FOR_VECTOR (i, indices)
|
||||
t.Enumerator.FilePaths.Add(us2fs(srcPanel.GetItemRelPath(indices[i])));
|
||||
|
||||
if (t.Enumerator.FilePaths.Size() == 1)
|
||||
t.Hash.MainName = t.Enumerator.FilePaths[0];
|
||||
|
||||
UString basePrefix = srcPanel.GetFsPath();
|
||||
UString basePrefix2 = basePrefix;
|
||||
if (basePrefix2.Back() == ':')
|
||||
|
||||
@@ -940,8 +940,10 @@ void CPanel::CompressDropFiles(const UStringVector &fileNames, const UString &fo
|
||||
if (IsFolderInTemp(folderPath2F))
|
||||
folderPath2 = ROOT_FS_FOLDER;
|
||||
}
|
||||
const UString archiveName = CreateArchiveName(fileNames.Front(), (fileNames.Size() > 1), false);
|
||||
CompressFiles(folderPath2, archiveName, L"",
|
||||
|
||||
const UString arcName = CreateArchiveName(fileNames);
|
||||
|
||||
CompressFiles(folderPath2, arcName, L"",
|
||||
true, // addExtension
|
||||
fileNames,
|
||||
false, // email
|
||||
|
||||
@@ -324,7 +324,6 @@ static void PrintSize_MB(UString &s, UInt64 size)
|
||||
s += kMB;
|
||||
}
|
||||
|
||||
extern bool g_LargePagesMode;
|
||||
|
||||
UInt32 CBenchmarkDialog::OnChangeDictionary()
|
||||
{
|
||||
@@ -338,8 +337,14 @@ UInt32 CBenchmarkDialog::OnChangeDictionary()
|
||||
s += " / ";
|
||||
PrintSize_MB(s, ramSize);
|
||||
}
|
||||
if (g_LargePagesMode)
|
||||
s += " LP";
|
||||
|
||||
#ifdef _7ZIP_LARGE_PAGES
|
||||
{
|
||||
AString s2;
|
||||
Add_LargePages_String(s2);
|
||||
s += s2;
|
||||
}
|
||||
#endif
|
||||
|
||||
SetItemText(IDT_BENCH_MEMORY_VAL, s);
|
||||
|
||||
|
||||
@@ -99,8 +99,10 @@ HRESULT CThreadExtracting::ProcessVirt()
|
||||
CDecompressStat Stat;
|
||||
|
||||
#ifndef _SFX
|
||||
/*
|
||||
if (HashBundle)
|
||||
HashBundle->Init();
|
||||
*/
|
||||
#endif
|
||||
|
||||
HRESULT res = Extract(codecs,
|
||||
@@ -119,7 +121,7 @@ HRESULT CThreadExtracting::ProcessVirt()
|
||||
{
|
||||
AddValuePair(Pairs, IDS_ARCHIVES_COLON, Stat.NumArchives);
|
||||
AddSizeValuePair(Pairs, IDS_PROP_PACKED_SIZE, Stat.PackSize);
|
||||
AddHashBundleRes(Pairs, *HashBundle, UString());
|
||||
AddHashBundleRes(Pairs, *HashBundle);
|
||||
}
|
||||
else if (Options->TestMode)
|
||||
{
|
||||
|
||||
@@ -27,6 +27,7 @@ class CHashCallbackGUI: public CProgressThreadVirt, public IHashCallbackUI
|
||||
UInt64 NumFiles;
|
||||
bool _curIsFolder;
|
||||
UString FirstFileName;
|
||||
// UString MainPath;
|
||||
|
||||
CPropNameValPairs PropNameValPairs;
|
||||
|
||||
@@ -71,9 +72,9 @@ void AddSizeValue(UString &s, UInt64 value)
|
||||
if (value >= (1 << 10))
|
||||
{
|
||||
char c;
|
||||
if (value >= ((UInt64)10 << 30)) { value >>= 30; c = 'G'; }
|
||||
if (value >= (10 << 20)) { value >>= 20; c = 'M'; }
|
||||
else { value >>= 10; c = 'K'; }
|
||||
if (value >= ((UInt64)10 << 30)) { value >>= 30; c = 'G'; }
|
||||
else if (value >= (10 << 20)) { value >>= 20; c = 'M'; }
|
||||
else { value >>= 10; c = 'K'; }
|
||||
char sz[32];
|
||||
ConvertUInt64ToString(value, sz);
|
||||
s += " (";
|
||||
@@ -192,19 +193,25 @@ static void AddHashResString(CPropNameValPairs &s, const CHasherState &h, unsign
|
||||
}
|
||||
|
||||
|
||||
void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb, const UString &firstFileName)
|
||||
void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb)
|
||||
{
|
||||
if (hb.NumErrors != 0)
|
||||
AddValuePair(s, IDS_PROP_NUM_ERRORS, hb.NumErrors);
|
||||
|
||||
if (hb.NumFiles == 1 && hb.NumDirs == 0 && !firstFileName.IsEmpty())
|
||||
|
||||
if (hb.NumFiles == 1 && hb.NumDirs == 0 && !hb.FirstFileName.IsEmpty())
|
||||
{
|
||||
CProperty &pair = s.AddNew();
|
||||
LangString(IDS_PROP_NAME, pair.Name);
|
||||
pair.Value = firstFileName;
|
||||
pair.Value = hb.FirstFileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!hb.MainName.IsEmpty())
|
||||
{
|
||||
CProperty &pair = s.AddNew();
|
||||
LangString(IDS_PROP_NAME, pair.Name);
|
||||
pair.Value = hb.MainName;
|
||||
}
|
||||
if (hb.NumDirs != 0)
|
||||
AddValuePair(s, IDS_PROP_FOLDERS, hb.NumDirs);
|
||||
AddValuePair(s, IDS_PROP_FILES, hb.NumFiles);
|
||||
@@ -240,10 +247,10 @@ void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb, const UString
|
||||
}
|
||||
|
||||
|
||||
void AddHashBundleRes(UString &s, const CHashBundle &hb, const UString &firstFileName)
|
||||
void AddHashBundleRes(UString &s, const CHashBundle &hb)
|
||||
{
|
||||
CPropNameValPairs pairs;
|
||||
AddHashBundleRes(pairs, hb, firstFileName);
|
||||
AddHashBundleRes(pairs, hb);
|
||||
|
||||
FOR_VECTOR (i, pairs)
|
||||
{
|
||||
@@ -263,9 +270,11 @@ void AddHashBundleRes(UString &s, const CHashBundle &hb, const UString &firstFil
|
||||
}
|
||||
|
||||
|
||||
HRESULT CHashCallbackGUI::AfterLastFile(const CHashBundle &hb)
|
||||
HRESULT CHashCallbackGUI::AfterLastFile(CHashBundle &hb)
|
||||
{
|
||||
AddHashBundleRes(PropNameValPairs, hb, FirstFileName);
|
||||
hb.FirstFileName = FirstFileName;
|
||||
// MainPath
|
||||
AddHashBundleRes(PropNameValPairs, hb);
|
||||
|
||||
CProgressSync &sync = Sync;
|
||||
sync.Set_NumFilesCur(hb.NumFiles);
|
||||
@@ -335,10 +344,10 @@ void ShowHashResults(const CPropNameValPairs &propPairs, HWND hwnd)
|
||||
}
|
||||
|
||||
|
||||
void ShowHashResults(const CHashBundle &hb, const UString &firstFileName, HWND hwnd)
|
||||
void ShowHashResults(const CHashBundle &hb, HWND hwnd)
|
||||
{
|
||||
CPropNameValPairs propPairs;
|
||||
AddHashBundleRes(propPairs, hb, firstFileName);
|
||||
AddHashBundleRes(propPairs, hb);
|
||||
ShowHashResults(propPairs, hwnd);
|
||||
}
|
||||
|
||||
|
||||
@@ -18,10 +18,10 @@ void AddValuePair(CPropNameValPairs &pairs, UINT resourceID, UInt64 value);
|
||||
void AddSizeValue(UString &s, UInt64 value);
|
||||
void AddSizeValuePair(CPropNameValPairs &pairs, UINT resourceID, UInt64 value);
|
||||
|
||||
void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb, const UString &firstFileName);
|
||||
void AddHashBundleRes(UString &s, const CHashBundle &hb, const UString &firstFileName);
|
||||
void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb);
|
||||
void AddHashBundleRes(UString &s, const CHashBundle &hb);
|
||||
|
||||
void ShowHashResults(const CPropNameValPairs &propPairs, HWND hwnd);
|
||||
void ShowHashResults(const CHashBundle &hb, const UString &firstFileName, HWND hwnd);
|
||||
void ShowHashResults(const CHashBundle &hb, HWND hwnd);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user