mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 15:14:59 -06:00
17.00
This commit is contained in:
@@ -73,6 +73,8 @@ HRESULT CFSFolder::Init(const FString &path /* , IFolderFolder *parentFolder */)
|
||||
// _parentFolder = parentFolder;
|
||||
_path = path;
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
_findChangeNotification.FindFirst(_path, false,
|
||||
FILE_NOTIFY_CHANGE_FILE_NAME
|
||||
| FILE_NOTIFY_CHANGE_DIR_NAME
|
||||
@@ -85,17 +87,24 @@ HRESULT CFSFolder::Init(const FString &path /* , IFolderFolder *parentFolder */)
|
||||
| FILE_NOTIFY_CHANGE_SECURITY
|
||||
*/
|
||||
);
|
||||
|
||||
if (!_findChangeNotification.IsHandleAllocated())
|
||||
{
|
||||
DWORD lastError = GetLastError();
|
||||
CFindFile findFile;
|
||||
CFileInfo fi;
|
||||
if (!findFile.FindFirst(_path + FCHAR_ANY_MASK, fi))
|
||||
FString path2 = _path;
|
||||
path2 += '*'; // CHAR_ANY_MASK;
|
||||
if (!findFile.FindFirst(path2, fi))
|
||||
return lastError;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
HRESULT CFsFolderStat::Enumerate()
|
||||
{
|
||||
if (Progress)
|
||||
@@ -103,9 +112,9 @@ HRESULT CFsFolderStat::Enumerate()
|
||||
RINOK(Progress->SetCompleted(NULL));
|
||||
}
|
||||
Path.Add_PathSepar();
|
||||
unsigned len = Path.Len();
|
||||
Path += FCHAR_ANY_MASK;
|
||||
CEnumerator enumerator(Path);
|
||||
const unsigned len = Path.Len();
|
||||
CEnumerator enumerator;
|
||||
enumerator.SetDirPrefix(Path);
|
||||
CFileInfo fi;
|
||||
while (enumerator.Next(fi))
|
||||
{
|
||||
@@ -164,7 +173,8 @@ HRESULT CFSFolder::LoadSubItems(int dirItem, const FString &relPrefix)
|
||||
{
|
||||
unsigned startIndex = Folders.Size();
|
||||
{
|
||||
CEnumerator enumerator(_path + relPrefix + FCHAR_ANY_MASK);
|
||||
CEnumerator enumerator;
|
||||
enumerator.SetDirPrefix(_path + relPrefix);
|
||||
CDirItem fi;
|
||||
fi.FolderStat_Defined = false;
|
||||
fi.NumFolders = 0;
|
||||
@@ -267,7 +277,7 @@ STDMETHODIMP CFSFolder::LoadItems()
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static CFSTR kDescriptionFileName = FTEXT("descript.ion");
|
||||
static CFSTR const kDescriptionFileName = FTEXT("descript.ion");
|
||||
|
||||
bool CFSFolder::LoadComments()
|
||||
{
|
||||
@@ -389,6 +399,7 @@ bool CFSFolder::ReadFileInfo(CDirItem &di)
|
||||
{
|
||||
di.FileInfo_WasRequested = true;
|
||||
BY_HANDLE_FILE_INFORMATION info;
|
||||
memset(&info, 0, sizeof(info)); // for vc6-O2
|
||||
if (!NIO::CFileBase::GetFileInformation(_path + GetRelPath(di), &info))
|
||||
return false;
|
||||
di.NumLinks = info.nNumberOfLinks;
|
||||
@@ -744,8 +755,6 @@ STDMETHODIMP CFSFolder::BindToFolder(const wchar_t *name, IFolderFolder **result
|
||||
return BindToFolderSpec(us2fs(name), resultFolder);
|
||||
}
|
||||
|
||||
static const CFSTR kSuperPrefix = FTEXT("\\\\?\\");
|
||||
|
||||
STDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder)
|
||||
{
|
||||
*resultFolder = 0;
|
||||
@@ -759,43 +768,39 @@ STDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder)
|
||||
*/
|
||||
if (_path.IsEmpty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
#ifndef UNDER_CE
|
||||
|
||||
if (IsDriveRootPath_SuperAllowed(_path))
|
||||
{
|
||||
CFSDrives *drivesFolderSpec = new CFSDrives;
|
||||
CMyComPtr<IFolderFolder> drivesFolder = drivesFolderSpec;
|
||||
drivesFolderSpec->Init(false, IsSuperPath(_path));
|
||||
*resultFolder = drivesFolder.Detach();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
int pos = _path.ReverseFind_PathSepar();
|
||||
if (pos < 0 || pos != (int)_path.Len() - 1)
|
||||
return E_FAIL;
|
||||
FString parentPath = _path.Left(pos);
|
||||
pos = parentPath.ReverseFind_PathSepar();
|
||||
if (pos < 0)
|
||||
parentPath.DeleteFrom(pos + 1);
|
||||
|
||||
if (NName::IsDrivePath_SuperAllowed(parentPath))
|
||||
{
|
||||
#ifdef UNDER_CE
|
||||
*resultFolder = 0;
|
||||
#else
|
||||
CFSDrives *drivesFolderSpec = new CFSDrives;
|
||||
CMyComPtr<IFolderFolder> drivesFolder = drivesFolderSpec;
|
||||
drivesFolderSpec->Init();
|
||||
*resultFolder = drivesFolder.Detach();
|
||||
#endif
|
||||
return S_OK;
|
||||
CFSFolder *parentFolderSpec = new CFSFolder;
|
||||
CMyComPtr<IFolderFolder> parentFolder = parentFolderSpec;
|
||||
if (parentFolderSpec->Init(parentPath) == S_OK)
|
||||
{
|
||||
*resultFolder = parentFolder.Detach();
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
parentPath.DeleteFrom(pos + 1);
|
||||
|
||||
if (parentPath == kSuperPrefix)
|
||||
{
|
||||
#ifdef UNDER_CE
|
||||
*resultFolder = 0;
|
||||
#else
|
||||
CFSDrives *drivesFolderSpec = new CFSDrives;
|
||||
CMyComPtr<IFolderFolder> drivesFolder = drivesFolderSpec;
|
||||
drivesFolderSpec->Init(false, true);
|
||||
*resultFolder = drivesFolder.Detach();
|
||||
#endif
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
FString parentPathReduced = parentPath.Left(pos);
|
||||
|
||||
#ifndef UNDER_CE
|
||||
pos = parentPathReduced.ReverseFind_PathSepar();
|
||||
if (pos == 1)
|
||||
{
|
||||
@@ -807,13 +812,10 @@ STDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder)
|
||||
*resultFolder = netFolder.Detach();
|
||||
return S_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
CFSFolder *parentFolderSpec = new CFSFolder;
|
||||
CMyComPtr<IFolderFolder> parentFolder = parentFolderSpec;
|
||||
RINOK(parentFolderSpec->Init(parentPath, 0));
|
||||
*resultFolder = parentFolder.Detach();
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -844,24 +846,22 @@ STDMETHODIMP CFSFolder::GetFolderProperty(PROPID propID, PROPVARIANT *value)
|
||||
STDMETHODIMP CFSFolder::WasChanged(Int32 *wasChanged)
|
||||
{
|
||||
bool wasChangedMain = false;
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (!_findChangeNotification.IsHandleAllocated())
|
||||
{
|
||||
*wasChanged = BoolToInt(false);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
DWORD waitResult = ::WaitForSingleObject(_findChangeNotification, 0);
|
||||
bool wasChangedLoc = (waitResult == WAIT_OBJECT_0);
|
||||
if (wasChangedLoc)
|
||||
{
|
||||
_findChangeNotification.FindNext();
|
||||
wasChangedMain = true;
|
||||
}
|
||||
else
|
||||
break;
|
||||
DWORD waitResult = ::WaitForSingleObject(_findChangeNotification, 0);
|
||||
if (waitResult != WAIT_OBJECT_0)
|
||||
break;
|
||||
_findChangeNotification.FindNext();
|
||||
wasChangedMain = true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
*wasChanged = BoolToInt(wasChangedMain);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user