mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 14:07:00 -06:00
22.00
This commit is contained in:
101
CPP/7zip/UI/Agent/AgentProxy.cpp
Normal file → Executable file
101
CPP/7zip/UI/Agent/AgentProxy.cpp
Normal file → Executable file
@@ -18,6 +18,8 @@
|
||||
#include "../../../Windows/PropVariant.h"
|
||||
#include "../../../Windows/PropVariantConv.h"
|
||||
|
||||
#include "../../Archive/Common/ItemNameUtils.h"
|
||||
|
||||
#include "AgentProxy.h"
|
||||
|
||||
using namespace NWindows;
|
||||
@@ -33,12 +35,12 @@ int CProxyArc::FindSubDir(unsigned dirIndex, const wchar_t *name, unsigned &inse
|
||||
insertPos = left;
|
||||
return -1;
|
||||
}
|
||||
unsigned mid = (left + right) / 2;
|
||||
unsigned dirIndex2 = subDirs[mid];
|
||||
int compare = CompareFileNames(name, Dirs[dirIndex2].Name);
|
||||
if (compare == 0)
|
||||
const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
|
||||
const unsigned dirIndex2 = subDirs[mid];
|
||||
const int comp = CompareFileNames(name, Dirs[dirIndex2].Name);
|
||||
if (comp == 0)
|
||||
return dirIndex2;
|
||||
if (compare < 0)
|
||||
if (comp < 0)
|
||||
right = mid;
|
||||
else
|
||||
left = mid + 1;
|
||||
@@ -67,12 +69,12 @@ unsigned CProxyArc::AddDir(unsigned dirIndex, int arcIndex, const UString &name)
|
||||
{
|
||||
unsigned insertPos;
|
||||
int subDirIndex = FindSubDir(dirIndex, name, insertPos);
|
||||
if (subDirIndex >= 0)
|
||||
if (subDirIndex != -1)
|
||||
{
|
||||
if (arcIndex >= 0)
|
||||
if (arcIndex != -1)
|
||||
{
|
||||
CProxyDir &item = Dirs[subDirIndex];
|
||||
if (item.ArcIndex < 0)
|
||||
CProxyDir &item = Dirs[(unsigned)subDirIndex];
|
||||
if (item.ArcIndex == -1)
|
||||
item.ArcIndex = arcIndex;
|
||||
}
|
||||
return subDirIndex;
|
||||
@@ -98,27 +100,31 @@ void CProxyDir::Clear()
|
||||
void CProxyArc::GetDirPathParts(int dirIndex, UStringVector &pathParts) const
|
||||
{
|
||||
pathParts.Clear();
|
||||
while (dirIndex >= 0)
|
||||
while (dirIndex != -1)
|
||||
{
|
||||
const CProxyDir &dir = Dirs[dirIndex];
|
||||
dirIndex = dir.ParentDir;
|
||||
if (dirIndex < 0)
|
||||
if (dirIndex == -1)
|
||||
break;
|
||||
pathParts.Insert(0, dir.Name);
|
||||
// 22.00: we normalize name
|
||||
NArchive::NItemName::NormalizeSlashes_in_FileName_for_OsPath(pathParts[0]);
|
||||
}
|
||||
}
|
||||
|
||||
UString CProxyArc::GetDirPath_as_Prefix(int dirIndex) const
|
||||
{
|
||||
UString s;
|
||||
while (dirIndex >= 0)
|
||||
while (dirIndex != -1)
|
||||
{
|
||||
const CProxyDir &dir = Dirs[dirIndex];
|
||||
dirIndex = dir.ParentDir;
|
||||
if (dirIndex < 0)
|
||||
if (dirIndex == -1)
|
||||
break;
|
||||
s.InsertAtFront(WCHAR_PATH_SEPARATOR);
|
||||
s.Insert(0, dir.Name);
|
||||
// 22.00: we normalize name
|
||||
NArchive::NItemName::NormalizeSlashes_in_FileName_for_OsPath(s.GetBuf(), MyStringLen(dir.Name));
|
||||
}
|
||||
return s;
|
||||
}
|
||||
@@ -251,7 +257,7 @@ HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress)
|
||||
{
|
||||
if (progress && (i & 0xFFFF) == 0)
|
||||
{
|
||||
UInt64 currentItemIndex = i;
|
||||
const UInt64 currentItemIndex = i;
|
||||
RINOK(progress->SetCompleted(¤tItemIndex));
|
||||
}
|
||||
|
||||
@@ -259,9 +265,9 @@ HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress)
|
||||
unsigned len = 0;
|
||||
bool isPtrName = false;
|
||||
|
||||
#if WCHAR_PATH_SEPARATOR != L'/'
|
||||
wchar_t replaceFromChar = 0;
|
||||
#endif
|
||||
#if WCHAR_PATH_SEPARATOR != L'/'
|
||||
wchar_t separatorChar = WCHAR_PATH_SEPARATOR;
|
||||
#endif
|
||||
|
||||
#if defined(MY_CPU_LE) && defined(_WIN32)
|
||||
// it works only if (sizeof(wchar_t) == 2)
|
||||
@@ -278,9 +284,9 @@ HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress)
|
||||
len = size / 2 - 1;
|
||||
s = (const wchar_t *)p;
|
||||
isPtrName = true;
|
||||
#if WCHAR_PATH_SEPARATOR != L'/'
|
||||
replaceFromChar = L'\\';
|
||||
#endif
|
||||
#if WCHAR_PATH_SEPARATOR != L'/'
|
||||
separatorChar = L'/'; // 0
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (!s)
|
||||
@@ -297,7 +303,7 @@ HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress)
|
||||
return E_FAIL;
|
||||
if (len == 0)
|
||||
{
|
||||
RINOK(arc.GetDefaultItemPath(i, path));
|
||||
RINOK(arc.GetItem_DefaultPath(i, path));
|
||||
len = path.Len();
|
||||
s = path;
|
||||
}
|
||||
@@ -328,16 +334,12 @@ HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress)
|
||||
for (unsigned j = 0; j < len; j++)
|
||||
{
|
||||
const wchar_t c = s[j];
|
||||
if (c == WCHAR_PATH_SEPARATOR || c == L'/')
|
||||
{
|
||||
if (c == L'/'
|
||||
#if WCHAR_PATH_SEPARATOR != L'/'
|
||||
if (c == replaceFromChar)
|
||||
{
|
||||
// s.ReplaceOneCharAtPos(j, WCHAR_IN_FILE_NAME_BACKSLASH_REPLACEMENT);
|
||||
continue;
|
||||
}
|
||||
|| (c == separatorChar)
|
||||
#endif
|
||||
|
||||
)
|
||||
{
|
||||
const unsigned kLevelLimit = 1 << 10;
|
||||
if (numLevels <= kLevelLimit)
|
||||
{
|
||||
@@ -345,6 +347,8 @@ HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress)
|
||||
name = "[LONG_PATH]";
|
||||
else
|
||||
name.SetFrom(s + namePos, j - namePos);
|
||||
// 22.00: we can normalize dir here
|
||||
// NArchive::NItemName::NormalizeSlashes_in_FileName_for_OsPath(name);
|
||||
curItem = AddDir(curItem, -1, name);
|
||||
}
|
||||
namePos = j + 1;
|
||||
@@ -384,6 +388,8 @@ HRESULT CProxyArc::Load(const CArc &arc, IProgress *progress)
|
||||
if (isDir)
|
||||
{
|
||||
name = s;
|
||||
// 22.00: we can normalize dir here
|
||||
// NArchive::NItemName::NormalizeSlashes_in_FileName_for_OsPath(name);
|
||||
AddDir(curItem, (int)i, name);
|
||||
}
|
||||
else
|
||||
@@ -418,14 +424,14 @@ void CProxyArc2::GetDirPathParts(int dirIndex, UStringVector &pathParts, bool &i
|
||||
while (dirIndex >= (int)k_Proxy2_NumRootDirs)
|
||||
{
|
||||
const CProxyDir2 &dir = Dirs[dirIndex];
|
||||
const CProxyFile2 &file = Files[dir.ArcIndex];
|
||||
const CProxyFile2 &file = Files[(unsigned)dir.ArcIndex];
|
||||
if (pathParts.IsEmpty() && dirIndex == file.AltDirIndex)
|
||||
isAltStreamDir = true;
|
||||
pathParts.Insert(0, file.Name);
|
||||
int par = file.Parent;
|
||||
if (par < 0)
|
||||
if (par == -1)
|
||||
break;
|
||||
dirIndex = Files[par].DirIndex;
|
||||
dirIndex = Files[(unsigned)par].DirIndex;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -436,7 +442,7 @@ bool CProxyArc2::IsAltDir(unsigned dirIndex) const
|
||||
if (dirIndex == k_Proxy2_AltRootDirIndex)
|
||||
return true;
|
||||
const CProxyDir2 &dir = Dirs[dirIndex];
|
||||
const CProxyFile2 &file = Files[dir.ArcIndex];
|
||||
const CProxyFile2 &file = Files[(unsigned)dir.ArcIndex];
|
||||
return ((int)dirIndex == file.AltDirIndex);
|
||||
}
|
||||
|
||||
@@ -448,7 +454,7 @@ UString CProxyArc2::GetDirPath_as_Prefix(unsigned dirIndex, bool &isAltStreamDir
|
||||
isAltStreamDir = true;
|
||||
else if (dirIndex >= k_Proxy2_NumRootDirs)
|
||||
{
|
||||
const CProxyFile2 &file = Files[dir.ArcIndex];
|
||||
const CProxyFile2 &file = Files[(unsigned)dir.ArcIndex];
|
||||
isAltStreamDir = ((int)dirIndex == file.AltDirIndex);
|
||||
}
|
||||
return dir.PathPrefix;
|
||||
@@ -458,9 +464,9 @@ void CProxyArc2::AddRealIndices_of_ArcItem(unsigned arcIndex, bool includeAltStr
|
||||
{
|
||||
realIndices.Add(arcIndex);
|
||||
const CProxyFile2 &file = Files[arcIndex];
|
||||
if (file.DirIndex >= 0)
|
||||
if (file.DirIndex != -1)
|
||||
AddRealIndices_of_Dir(file.DirIndex, includeAltStreams, realIndices);
|
||||
if (includeAltStreams && file.AltDirIndex >= 0)
|
||||
if (includeAltStreams && file.AltDirIndex != -1)
|
||||
AddRealIndices_of_Dir(file.AltDirIndex, includeAltStreams, realIndices);
|
||||
}
|
||||
|
||||
@@ -520,15 +526,18 @@ void CProxyArc2::CalculateSizes(unsigned dirIndex, IInArchive *archive)
|
||||
}
|
||||
|
||||
const CProxyFile2 &subFile = Files[index];
|
||||
if (subFile.DirIndex < 0)
|
||||
if (subFile.DirIndex == -1)
|
||||
{
|
||||
dir.NumSubFiles++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 22.00: we normalize name
|
||||
UString s = subFile.Name;
|
||||
NArchive::NItemName::NormalizeSlashes_in_FileName_for_OsPath(s);
|
||||
dir.NumSubDirs++;
|
||||
CProxyDir2 &f = Dirs[subFile.DirIndex];
|
||||
f.PathPrefix = dir.PathPrefix + subFile.Name + WCHAR_PATH_SEPARATOR;
|
||||
f.PathPrefix = dir.PathPrefix + s + WCHAR_PATH_SEPARATOR;
|
||||
CalculateSizes(subFile.DirIndex, archive);
|
||||
dir.Size += f.Size;
|
||||
dir.PackSize += f.PackSize;
|
||||
@@ -539,7 +548,7 @@ void CProxyArc2::CalculateSizes(unsigned dirIndex, IInArchive *archive)
|
||||
dir.CrcIsDefined = false;
|
||||
}
|
||||
|
||||
if (subFile.AltDirIndex < 0)
|
||||
if (subFile.AltDirIndex == -1)
|
||||
{
|
||||
// dir.NumSubFiles++;
|
||||
}
|
||||
@@ -688,12 +697,12 @@ HRESULT CProxyArc2::Load(const CArc &arc, IProgress *progress)
|
||||
|
||||
if (file.IsAltStream)
|
||||
{
|
||||
if (file.Parent < 0)
|
||||
if (file.Parent == -1)
|
||||
dirIndex = k_Proxy2_AltRootDirIndex;
|
||||
else
|
||||
{
|
||||
int &folderIndex2 = Files[file.Parent].AltDirIndex;
|
||||
if (folderIndex2 < 0)
|
||||
int &folderIndex2 = Files[(unsigned)file.Parent].AltDirIndex;
|
||||
if (folderIndex2 == -1)
|
||||
{
|
||||
folderIndex2 = Dirs.Size();
|
||||
CProxyDir2 &dir = Dirs.AddNew();
|
||||
@@ -704,12 +713,12 @@ HRESULT CProxyArc2::Load(const CArc &arc, IProgress *progress)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (file.Parent < 0)
|
||||
if (file.Parent == -1)
|
||||
dirIndex = k_Proxy2_RootDirIndex;
|
||||
else
|
||||
{
|
||||
dirIndex = Files[file.Parent].DirIndex;
|
||||
if (dirIndex < 0)
|
||||
dirIndex = Files[(unsigned)file.Parent].DirIndex;
|
||||
if (dirIndex == -1)
|
||||
return E_FAIL;
|
||||
}
|
||||
}
|
||||
@@ -731,7 +740,7 @@ int CProxyArc2::FindItem(unsigned dirIndex, const wchar_t *name, bool foldersOnl
|
||||
FOR_VECTOR (i, dir.Items)
|
||||
{
|
||||
const CProxyFile2 &file = Files[dir.Items[i]];
|
||||
if (foldersOnly && file.DirIndex < 0)
|
||||
if (foldersOnly && file.DirIndex == -1)
|
||||
continue;
|
||||
if (CompareFileNames(file.Name, name) == 0)
|
||||
return i;
|
||||
|
||||
Reference in New Issue
Block a user