int CPlugin::SetDirectory(const char *aszDir, int /* opMode */) { UString path = MultiByteToUnicodeString(aszDir, CP_OEMCP); if (path == WSTRING_PATH_SEPARATOR) { _folder.Release(); m_ArchiveHandler->BindToRootFolder(&_folder); } else if (path == L"..") { CMyComPtr<IFolderFolder> newFolder; _folder->BindToParentFolder(&newFolder); if (!newFolder) throw 40312; _folder = newFolder; } else if (path.IsEmpty()) EnterToDirectory(path); else { if (path[0] == WCHAR_PATH_SEPARATOR) { _folder.Release(); m_ArchiveHandler->BindToRootFolder(&_folder); path.DeleteFrontal(1); } UStringVector pathParts; SplitPathToParts(path, pathParts); FOR_VECTOR (i, pathParts) EnterToDirectory(pathParts[i]); } SetCurrentDirVar(); return TRUE; }
void CPanel::OpenParentFolder() { LoadFullPath(); // Maybe we don't need it ?? UString focucedName; if (!_currentFolderPrefix.IsEmpty() && _currentFolderPrefix.Back() == WCHAR_PATH_SEPARATOR) { focucedName = _currentFolderPrefix; focucedName.DeleteBack(); if (focucedName != L"\\\\.") { int pos = focucedName.ReverseFind(WCHAR_PATH_SEPARATOR); if (pos >= 0) focucedName.DeleteFrontal(pos + 1); } } CDisableTimerProcessing disableTimerProcessing(*this); CDisableNotify disableNotify(*this); CMyComPtr<IFolderFolder> newFolder; _folder->BindToParentFolder(&newFolder); if (newFolder) SetNewFolder(newFolder); else { if (_parentFolders.IsEmpty()) { SetToRootFolder(); if (focucedName.IsEmpty()) focucedName = GetItemName(0); } else { ReleaseFolder(); _library.Free(); CFolderLink &link = _parentFolders.Back(); SetNewFolder(link.ParentFolder); _library.Attach(link.Library.Detach()); focucedName = link.RelPath; if (_parentFolders.Size() > 1) OpenParentArchiveFolder(); _parentFolders.DeleteBack(); if (_parentFolders.IsEmpty()) _flatMode = _flatModeForDisk; } } UStringVector selectedItems; /* if (!focucedName.IsEmpty()) selectedItems.Add(focucedName); */ LoadFullPath(); // ::SetCurrentDirectory(::_currentFolderPrefix); RefreshListCtrl(focucedName, -1, true, selectedItems); // _listView.EnsureVisible(_listView.GetFocusedItem(), false); }
UString CReparseAttr::GetPath() const { UString s = SubsName; if (IsLinkPrefix(s)) { s.ReplaceOneCharAtPos(1, '\\'); if (IsDrivePath(s.Ptr(k_LinkPrefix_Size))) s.DeleteFrontal(k_LinkPrefix_Size); } return s; }
void CMessagesDialog::AddMessage(LPCWSTR message) { UString s = message; while (!s.IsEmpty()) { int pos = s.Find(L'\n'); if (pos < 0) break; AddMessageDirect(s.Left(pos)); s.DeleteFrontal(pos + 1); } AddMessageDirect(s); }
HRESULT CPanel::BindToPath(const UString &fullPath, const UString &arcFormat, bool &archiveIsOpened, bool &encrypted) { UString path = fullPath; #ifdef _WIN32 path.Replace(L'/', WCHAR_PATH_SEPARATOR); #endif archiveIsOpened = false; encrypted = false; CDisableTimerProcessing disableTimerProcessing(*this); CDisableNotify disableNotify(*this); for (; !_parentFolders.IsEmpty(); CloseOneLevel()) { // ---------- we try to use open archive ---------- const CFolderLink &link = _parentFolders.Back(); const UString &virtPath = link.VirtualPath; if (!path.IsPrefixedBy(virtPath)) continue; UString relatPath = path.Ptr(virtPath.Len()); if (!relatPath.IsEmpty()) { if (!IS_PATH_SEPAR(relatPath[0])) continue; else relatPath.Delete(0); } UString relatPath2 = relatPath; if (!relatPath2.IsEmpty() && !IS_PATH_SEPAR(relatPath2.Back())) relatPath2.Add_PathSepar(); for (;;) { const UString foldPath = GetFolderPath(_folder); if (relatPath2 == foldPath) break; if (relatPath.IsPrefixedBy(foldPath)) { path = relatPath.Ptr(foldPath.Len()); break; } CMyComPtr<IFolderFolder> newFolder; if (_folder->BindToParentFolder(&newFolder) != S_OK) throw 20140918; if (!newFolder) // we exit from loop above if (relatPath.IsPrefixedBy(empty path for root folder) throw 20140918; SetNewFolder(newFolder); } break; } if (_parentFolders.IsEmpty()) { // ---------- we open file or folder from file system ---------- CloseOpenFolders(); UString sysPath = path; unsigned prefixSize = NName::GetRootPrefixSize(sysPath); if (prefixSize == 0 || sysPath[prefixSize] == 0) sysPath.Empty(); #if defined(_WIN32) && !defined(UNDER_CE) if (!sysPath.IsEmpty() && sysPath.Back() == ':' && (sysPath.Len() != 2 || !NName::IsDrivePath2(sysPath))) { UString baseFile = sysPath; baseFile.DeleteBack(); if (NFind::DoesFileOrDirExist(us2fs(baseFile))) sysPath.Empty(); } #endif CFileInfo fileInfo; while (!sysPath.IsEmpty()) { if (fileInfo.Find(us2fs(sysPath))) break; int pos = sysPath.ReverseFind_PathSepar(); if (pos < 0) sysPath.Empty(); else { /* if (reducedParts.Size() > 0 || pos < (int)sysPath.Len() - 1) reducedParts.Add(sysPath.Ptr(pos + 1)); */ #if defined(_WIN32) && !defined(UNDER_CE) if (pos == 2 && NName::IsDrivePath2(sysPath) && sysPath.Len() > 3) pos++; #endif sysPath.DeleteFrom(pos); } } SetToRootFolder(); CMyComPtr<IFolderFolder> newFolder; if (sysPath.IsEmpty()) { _folder->BindToFolder(path, &newFolder); } else if (fileInfo.IsDir()) { NName::NormalizeDirPathPrefix(sysPath); _folder->BindToFolder(sysPath, &newFolder); } else { FString dirPrefix, fileName; NDir::GetFullPathAndSplit(us2fs(sysPath), dirPrefix, fileName); HRESULT res; // = OpenAsArc(fs2us(fileName), arcFormat, encrypted); { CTempFileInfo tfi; tfi.RelPath = fs2us(fileName); tfi.FolderPath = dirPrefix; tfi.FilePath = us2fs(sysPath); res = OpenAsArc(NULL, tfi, sysPath, arcFormat, encrypted); } if (res == S_FALSE) _folder->BindToFolder(fs2us(dirPrefix), &newFolder); else { RINOK(res); archiveIsOpened = true; _parentFolders.Back().ParentFolderPath = fs2us(dirPrefix); path.DeleteFrontal(sysPath.Len()); if (!path.IsEmpty() && IS_PATH_SEPAR(path[0])) path.Delete(0); } } if (newFolder) { SetNewFolder(newFolder); // LoadFullPath(); return S_OK; } } { // ---------- we open folder remPath in archive and sub archives ---------- for (unsigned curPos = 0; curPos != path.Len();) { UString s = path.Ptr(curPos); int slashPos = NName::FindSepar(s); unsigned skipLen = s.Len(); if (slashPos >= 0) { s.DeleteFrom(slashPos); skipLen = slashPos + 1; } CMyComPtr<IFolderFolder> newFolder; _folder->BindToFolder(s, &newFolder); if (newFolder) curPos += skipLen; else if (_folderAltStreams) { int pos = s.Find(L':'); if (pos >= 0) { UString baseName = s; baseName.DeleteFrom(pos); if (_folderAltStreams->BindToAltStreams(baseName, &newFolder) == S_OK && newFolder) curPos += pos + 1; } } if (!newFolder) break; SetNewFolder(newFolder); } } return S_OK; }
void CPanel::OpenParentFolder() { LoadFullPath(); // Maybe we don't need it ?? UString parentFolderPrefix; UString focusedName; if (!_currentFolderPrefix.IsEmpty()) { wchar_t c = _currentFolderPrefix.Back(); if (c == WCHAR_PATH_SEPARATOR || c == ':') { focusedName = _currentFolderPrefix; focusedName.DeleteBack(); /* if (c == ':' && !focusedName.IsEmpty() && focusedName.Back() == WCHAR_PATH_SEPARATOR) { focusedName.DeleteBack(); } else */ if (focusedName != L"\\\\." && focusedName != L"\\\\?") { int pos = focusedName.ReverseFind_PathSepar(); if (pos >= 0) { parentFolderPrefix = focusedName; parentFolderPrefix.DeleteFrom(pos + 1); focusedName.DeleteFrontal(pos + 1); } } } } CDisableTimerProcessing disableTimerProcessing(*this); CDisableNotify disableNotify(*this); CMyComPtr<IFolderFolder> newFolder; _folder->BindToParentFolder(&newFolder); // newFolder.Release(); // for test if (newFolder) SetNewFolder(newFolder); else { bool needSetFolder = true; if (!_parentFolders.IsEmpty()) { { const CFolderLink &link = _parentFolders.Back(); parentFolderPrefix = link.ParentFolderPath; focusedName = link.RelPath; } CloseOneLevel(); needSetFolder = (!_folder); } if (needSetFolder) { { bool archiveIsOpened; bool encrypted; BindToPath(parentFolderPrefix, UString(), archiveIsOpened, encrypted); } } } UStringVector selectedItems; /* if (!focusedName.IsEmpty()) selectedItems.Add(focusedName); */ LoadFullPath(); // ::SetCurrentDirectory(::_currentFolderPrefix); RefreshListCtrl(focusedName, -1, true, selectedItems); // _listView.EnsureVisible(_listView.GetFocusedItem(), false); }