Index: third_party/lzma/v4_65/files/CPP/7zip/UI/Common/EnumDirItems.cpp |
diff --git a/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/EnumDirItems.cpp b/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/EnumDirItems.cpp |
deleted file mode 100644 |
index b83edf2a9e00b3ac38c2c3d79400ebe4441415ea..0000000000000000000000000000000000000000 |
--- a/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/EnumDirItems.cpp |
+++ /dev/null |
@@ -1,367 +0,0 @@ |
-// EnumDirItems.cpp |
- |
-#include "StdAfx.h" |
- |
-#include <stdio.h> |
- |
-#include "Common/StringConvert.h" |
-#include "Common/Wildcard.h" |
-#include "Common/MyCom.h" |
- |
-#include "EnumDirItems.h" |
- |
-using namespace NWindows; |
-using namespace NFile; |
-using namespace NName; |
- |
-void AddDirFileInfo(int phyParent, int logParent, |
- const NFind::CFileInfoW &fi, CObjectVector<CDirItem> &dirItems) |
-{ |
- CDirItem di; |
- di.Size = fi.Size; |
- di.CTime = fi.CTime; |
- di.ATime = fi.ATime; |
- di.MTime = fi.MTime; |
- di.Attrib = fi.Attrib; |
- di.PhyParent = phyParent; |
- di.LogParent = logParent; |
- di.Name = fi.Name; |
- dirItems.Add(di); |
-} |
- |
-UString CDirItems::GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const |
-{ |
- UString path; |
- int len = name.Length(); |
- int i; |
- for (i = index; i >= 0; i = parents[i]) |
- len += Prefixes[i].Length(); |
- int totalLen = len; |
- wchar_t *p = path.GetBuffer(len); |
- p[len] = 0; |
- len -= name.Length(); |
- memcpy(p + len, (const wchar_t *)name, name.Length() * sizeof(wchar_t)); |
- for (i = index; i >= 0; i = parents[i]) |
- { |
- const UString &s = Prefixes[i]; |
- len -= s.Length(); |
- memcpy(p + len, (const wchar_t *)s, s.Length() * sizeof(wchar_t)); |
- } |
- path.ReleaseBuffer(totalLen); |
- return path; |
-} |
- |
-UString CDirItems::GetPhyPath(int index) const |
-{ |
- const CDirItem &di = Items[index]; |
- return GetPrefixesPath(PhyParents, di.PhyParent, di.Name); |
-} |
- |
-UString CDirItems::GetLogPath(int index) const |
-{ |
- const CDirItem &di = Items[index]; |
- return GetPrefixesPath(LogParents, di.LogParent, di.Name); |
-} |
- |
-void CDirItems::ReserveDown() |
-{ |
- Prefixes.ReserveDown(); |
- PhyParents.ReserveDown(); |
- LogParents.ReserveDown(); |
- Items.ReserveDown(); |
-} |
- |
-int CDirItems::AddPrefix(int phyParent, int logParent, const UString &prefix) |
-{ |
- PhyParents.Add(phyParent); |
- LogParents.Add(logParent); |
- return Prefixes.Add(prefix); |
-} |
- |
-void CDirItems::DeleteLastPrefix() |
-{ |
- PhyParents.DeleteBack(); |
- LogParents.DeleteBack(); |
- Prefixes.DeleteBack(); |
-} |
- |
-void CDirItems::EnumerateDirectory(int phyParent, int logParent, const UString &phyPrefix, |
- UStringVector &errorPaths, CRecordVector<DWORD> &errorCodes) |
-{ |
- NFind::CEnumeratorW enumerator(phyPrefix + (wchar_t)kAnyStringWildcard); |
- for (;;) |
- { |
- NFind::CFileInfoW fi; |
- bool found; |
- if (!enumerator.Next(fi, found)) |
- { |
- errorCodes.Add(::GetLastError()); |
- errorPaths.Add(phyPrefix); |
- return; |
- } |
- if (!found) |
- break; |
- AddDirFileInfo(phyParent, logParent, fi, Items); |
- if (fi.IsDir()) |
- { |
- const UString name2 = fi.Name + (wchar_t)kDirDelimiter; |
- int parent = AddPrefix(phyParent, logParent, name2); |
- EnumerateDirectory(parent, parent, phyPrefix + name2, errorPaths, errorCodes); |
- } |
- } |
-} |
- |
-void CDirItems::EnumerateDirItems2(const UString &phyPrefix, const UString &logPrefix, |
- const UStringVector &filePaths, UStringVector &errorPaths, CRecordVector<DWORD> &errorCodes) |
-{ |
- int phyParent = phyPrefix.IsEmpty() ? -1 : AddPrefix(-1, -1, phyPrefix); |
- int logParent = logPrefix.IsEmpty() ? -1 : AddPrefix(-1, -1, logPrefix); |
- |
- for (int i = 0; i < filePaths.Size(); i++) |
- { |
- const UString &filePath = filePaths[i]; |
- NFind::CFileInfoW fi; |
- const UString phyPath = phyPrefix + filePath; |
- if (!NFind::FindFile(phyPath, fi)) |
- { |
- errorCodes.Add(::GetLastError()); |
- errorPaths.Add(phyPath); |
- continue; |
- } |
- int delimiter = filePath.ReverseFind((wchar_t)kDirDelimiter); |
- UString phyPrefixCur; |
- int phyParentCur = phyParent; |
- if (delimiter >= 0) |
- { |
- phyPrefixCur = filePath.Left(delimiter + 1); |
- phyParentCur = AddPrefix(phyParent, logParent, phyPrefixCur); |
- } |
- AddDirFileInfo(phyParentCur, logParent, fi, Items); |
- if (fi.IsDir()) |
- { |
- const UString name2 = fi.Name + (wchar_t)kDirDelimiter; |
- int parent = AddPrefix(phyParentCur, logParent, name2); |
- EnumerateDirectory(parent, parent, phyPrefix + phyPrefixCur + name2, errorPaths, errorCodes); |
- } |
- } |
- ReserveDown(); |
-} |
- |
-static HRESULT EnumerateDirItems(const NWildcard::CCensorNode &curNode, |
- int phyParent, int logParent, const UString &phyPrefix, |
- const UStringVector &addArchivePrefix, |
- CDirItems &dirItems, |
- bool enterToSubFolders, |
- IEnumDirItemCallback *callback, |
- UStringVector &errorPaths, |
- CRecordVector<DWORD> &errorCodes); |
- |
-static HRESULT EnumerateDirItems_Spec(const NWildcard::CCensorNode &curNode, |
- int phyParent, int logParent, const UString &curFolderName, |
- const UString &phyPrefix, |
- const UStringVector &addArchivePrefix, |
- CDirItems &dirItems, |
- bool enterToSubFolders, |
- IEnumDirItemCallback *callback, |
- UStringVector &errorPaths, |
- CRecordVector<DWORD> &errorCodes) |
- |
-{ |
- const UString name2 = curFolderName + (wchar_t)kDirDelimiter; |
- int parent = dirItems.AddPrefix(phyParent, logParent, name2); |
- int numItems = dirItems.Items.Size(); |
- HRESULT res = EnumerateDirItems(curNode, parent, parent, phyPrefix + name2, |
- addArchivePrefix, dirItems, enterToSubFolders, callback, errorPaths, errorCodes); |
- if (numItems == dirItems.Items.Size()) |
- dirItems.DeleteLastPrefix(); |
- return res; |
-} |
- |
- |
-static HRESULT EnumerateDirItems(const NWildcard::CCensorNode &curNode, |
- int phyParent, int logParent, const UString &phyPrefix, |
- const UStringVector &addArchivePrefix, // prefix from curNode |
- CDirItems &dirItems, |
- bool enterToSubFolders, |
- IEnumDirItemCallback *callback, |
- UStringVector &errorPaths, |
- CRecordVector<DWORD> &errorCodes) |
-{ |
- if (!enterToSubFolders) |
- if (curNode.NeedCheckSubDirs()) |
- enterToSubFolders = true; |
- if (callback) |
- RINOK(callback->ScanProgress(dirItems.GetNumFolders(), dirItems.Items.Size(), phyPrefix)); |
- |
- // try direct_names case at first |
- if (addArchivePrefix.IsEmpty() && !enterToSubFolders) |
- { |
- // check that all names are direct |
- int i; |
- for (i = 0; i < curNode.IncludeItems.Size(); i++) |
- { |
- const NWildcard::CItem &item = curNode.IncludeItems[i]; |
- if (item.Recursive || item.PathParts.Size() != 1) |
- break; |
- const UString &name = item.PathParts.Front(); |
- if (name.IsEmpty() || DoesNameContainWildCard(name)) |
- break; |
- } |
- if (i == curNode.IncludeItems.Size()) |
- { |
- // all names are direct (no wildcards) |
- // so we don't need file_system's dir enumerator |
- CRecordVector<bool> needEnterVector; |
- for (i = 0; i < curNode.IncludeItems.Size(); i++) |
- { |
- const NWildcard::CItem &item = curNode.IncludeItems[i]; |
- const UString &name = item.PathParts.Front(); |
- const UString fullPath = phyPrefix + name; |
- NFind::CFileInfoW fi; |
- if (!NFind::FindFile(fullPath, fi)) |
- { |
- errorCodes.Add(::GetLastError()); |
- errorPaths.Add(fullPath); |
- continue; |
- } |
- bool isDir = fi.IsDir(); |
- if (isDir && !item.ForDir || !isDir && !item.ForFile) |
- { |
- errorCodes.Add((DWORD)E_FAIL); |
- errorPaths.Add(fullPath); |
- continue; |
- } |
- { |
- UStringVector pathParts; |
- pathParts.Add(fi.Name); |
- if (curNode.CheckPathToRoot(false, pathParts, !isDir)) |
- continue; |
- } |
- AddDirFileInfo(phyParent, logParent, fi, dirItems.Items); |
- if (!isDir) |
- continue; |
- |
- UStringVector addArchivePrefixNew; |
- const NWildcard::CCensorNode *nextNode = 0; |
- int index = curNode.FindSubNode(name); |
- if (index >= 0) |
- { |
- for (int t = needEnterVector.Size(); t <= index; t++) |
- needEnterVector.Add(true); |
- needEnterVector[index] = false; |
- nextNode = &curNode.SubNodes[index]; |
- } |
- else |
- { |
- nextNode = &curNode; |
- addArchivePrefixNew.Add(name); // don't change it to fi.Name. It's for shortnames support |
- } |
- |
- RINOK(EnumerateDirItems_Spec(*nextNode, phyParent, logParent, fi.Name, phyPrefix, |
- addArchivePrefixNew, dirItems, true, callback, errorPaths, errorCodes)); |
- } |
- for (i = 0; i < curNode.SubNodes.Size(); i++) |
- { |
- if (i < needEnterVector.Size()) |
- if (!needEnterVector[i]) |
- continue; |
- const NWildcard::CCensorNode &nextNode = curNode.SubNodes[i]; |
- const UString fullPath = phyPrefix + nextNode.Name; |
- NFind::CFileInfoW fi; |
- if (!NFind::FindFile(fullPath, fi)) |
- { |
- if (!nextNode.AreThereIncludeItems()) |
- continue; |
- errorCodes.Add(::GetLastError()); |
- errorPaths.Add(fullPath); |
- continue; |
- } |
- if (!fi.IsDir()) |
- { |
- errorCodes.Add((DWORD)E_FAIL); |
- errorPaths.Add(fullPath); |
- continue; |
- } |
- |
- RINOK(EnumerateDirItems_Spec(nextNode, phyParent, logParent, fi.Name, phyPrefix, |
- UStringVector(), dirItems, false, callback, errorPaths, errorCodes)); |
- } |
- return S_OK; |
- } |
- } |
- |
- |
- NFind::CEnumeratorW enumerator(phyPrefix + wchar_t(kAnyStringWildcard)); |
- for (int ttt = 0; ; ttt++) |
- { |
- NFind::CFileInfoW fi; |
- bool found; |
- if (!enumerator.Next(fi, found)) |
- { |
- errorCodes.Add(::GetLastError()); |
- errorPaths.Add(phyPrefix); |
- break; |
- } |
- if (!found) |
- break; |
- |
- if (callback && (ttt & 0xFF) == 0xFF) |
- RINOK(callback->ScanProgress(dirItems.GetNumFolders(), dirItems.Items.Size(), phyPrefix)); |
- const UString &name = fi.Name; |
- bool enterToSubFolders2 = enterToSubFolders; |
- UStringVector addArchivePrefixNew = addArchivePrefix; |
- addArchivePrefixNew.Add(name); |
- { |
- UStringVector addArchivePrefixNewTemp(addArchivePrefixNew); |
- if (curNode.CheckPathToRoot(false, addArchivePrefixNewTemp, !fi.IsDir())) |
- continue; |
- } |
- if (curNode.CheckPathToRoot(true, addArchivePrefixNew, !fi.IsDir())) |
- { |
- AddDirFileInfo(phyParent, logParent, fi, dirItems.Items); |
- if (fi.IsDir()) |
- enterToSubFolders2 = true; |
- } |
- if (!fi.IsDir()) |
- continue; |
- |
- const NWildcard::CCensorNode *nextNode = 0; |
- if (addArchivePrefix.IsEmpty()) |
- { |
- int index = curNode.FindSubNode(name); |
- if (index >= 0) |
- nextNode = &curNode.SubNodes[index]; |
- } |
- if (!enterToSubFolders2 && nextNode == 0) |
- continue; |
- |
- addArchivePrefixNew = addArchivePrefix; |
- if (nextNode == 0) |
- { |
- nextNode = &curNode; |
- addArchivePrefixNew.Add(name); |
- } |
- |
- RINOK(EnumerateDirItems_Spec(*nextNode, phyParent, logParent, name, phyPrefix, |
- addArchivePrefixNew, dirItems, enterToSubFolders2, callback, errorPaths, errorCodes)); |
- } |
- return S_OK; |
-} |
- |
-HRESULT EnumerateItems( |
- const NWildcard::CCensor &censor, |
- CDirItems &dirItems, |
- IEnumDirItemCallback *callback, |
- UStringVector &errorPaths, |
- CRecordVector<DWORD> &errorCodes) |
-{ |
- for (int i = 0; i < censor.Pairs.Size(); i++) |
- { |
- const NWildcard::CPair &pair = censor.Pairs[i]; |
- int phyParent = pair.Prefix.IsEmpty() ? -1 : dirItems.AddPrefix(-1, -1, pair.Prefix); |
- RINOK(EnumerateDirItems(pair.Head, phyParent, -1, pair.Prefix, UStringVector(), dirItems, false, |
- callback, errorPaths, errorCodes)); |
- } |
- dirItems.ReserveDown(); |
- return S_OK; |
-} |