STDMETHODIMP CRootFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder) { if (index == ROOT_INDEX_COMPUTER) { CFSDrives *fsDrivesSpec = new CFSDrives; CMyComPtr<IFolderFolder> subFolder = fsDrivesSpec; fsDrivesSpec->Init(); *resultFolder = subFolder.Detach(); } else if (index == ROOT_INDEX_NETWORK) { CNetFolder *netFolderSpec = new CNetFolder; CMyComPtr<IFolderFolder> subFolder = netFolderSpec; netFolderSpec->Init(0, 0, _names[ROOT_INDEX_NETWORK] + WCHAR_PATH_SEPARATOR); *resultFolder = subFolder.Detach(); } else if (index == ROOT_INDEX_DOCUMENTS) { UString s = GetMyDocsPath(); if (!s.IsEmpty()) { NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder; CMyComPtr<IFolderFolder> subFolder = fsFolderSpec; RINOK(fsFolderSpec->Init(s, NULL)); *resultFolder = subFolder.Detach(); } } else return E_INVALIDARG; return S_OK; }
HRESULT CFSDrives::BindToFolderSpec(const wchar_t *name, IFolderFolder **resultFolder) { *resultFolder = 0; if (_volumeMode) return S_OK; NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder; CMyComPtr<IFolderFolder> subFolder = fsFolderSpec; RINOK(fsFolderSpec->Init(name, 0)); *resultFolder = subFolder.Detach(); return S_OK; }
void CPanel::OpenDrivesFolder() { CloseOpenFolders(); #ifdef UNDER_CE NFsFolder::CFSFolder *folderSpec = new NFsFolder::CFSFolder; _folder = folderSpec; folderSpec->InitToRoot(); #else CFSDrives *folderSpec = new CFSDrives; _folder = folderSpec; folderSpec->Init(); #endif RefreshListCtrl(); }
STDMETHODIMP CRootFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder) { *resultFolder = NULL; CMyComPtr<IFolderFolder> subFolder; #ifdef USE_WIN_PATHS if (index == ROOT_INDEX_COMPUTER || index == ROOT_INDEX_VOLUMES) { CFSDrives *fsDrivesSpec = new CFSDrives; subFolder = fsDrivesSpec; fsDrivesSpec->Init(index == ROOT_INDEX_VOLUMES); } else if (index == ROOT_INDEX_NETWORK) { CNetFolder *netFolderSpec = new CNetFolder; subFolder = netFolderSpec; netFolderSpec->Init(0, 0, _names[ROOT_INDEX_NETWORK] + WCHAR_PATH_SEPARATOR); } else if (index == ROOT_INDEX_DOCUMENTS) { UString s = GetMyDocsPath(); if (!s.IsEmpty()) { NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder; subFolder = fsFolderSpec; RINOK(fsFolderSpec->Init(us2fs(s))); } } #else if (index == ROOT_INDEX_COMPUTER) { NFsFolder::CFSFolder *fsFolder = new NFsFolder::CFSFolder; subFolder = fsFolder; fsFolder->InitToRoot(); } #endif else return E_INVALIDARG; *resultFolder = subFolder.Detach(); return S_OK; }
STDMETHODIMP CNetFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder) { *resultFolder = 0; const CResourceEx &resource = _items[index]; if (resource.Usage == RESOURCEUSAGE_CONNECTABLE || resource.DisplayType == RESOURCEDISPLAYTYPE_SHARE) { NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder; CMyComPtr<IFolderFolder> subFolder = fsFolderSpec; RINOK(fsFolderSpec->Init(us2fs(resource.RemoteName + WCHAR_PATH_SEPARATOR), this)); *resultFolder = subFolder.Detach(); } else { CNetFolder *netFolder = new CNetFolder; CMyComPtr<IFolderFolder> subFolder = netFolder; netFolder->Init(&resource, this, resource.Name + WCHAR_PATH_SEPARATOR); *resultFolder = subFolder.Detach(); } return S_OK; }
STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder) { *resultFolder = 0; UString name2 = name; name2.Trim(); if (name2.IsEmpty()) { CRootFolder *rootFolderSpec = new CRootFolder; CMyComPtr<IFolderFolder> rootFolder = rootFolderSpec; rootFolderSpec->Init(); *resultFolder = rootFolder.Detach(); return S_OK; } for (int i = 0; i < kNumRootFolderItems; i++) if (AreEqualNames(name2, _names[i])) return BindToFolder((UInt32)i, resultFolder); if (AreEqualNames(name2, L"My Documents") || AreEqualNames(name2, L"Documents")) return BindToFolder((UInt32)ROOT_INDEX_DOCUMENTS, resultFolder); if (AreEqualNames(name2, L"My Computer") || AreEqualNames(name2, L"Computer")) return BindToFolder((UInt32)ROOT_INDEX_COMPUTER, resultFolder); if (name2 == UString(WCHAR_PATH_SEPARATOR)) { CMyComPtr<IFolderFolder> subFolder = this; *resultFolder = subFolder.Detach(); return S_OK; } if (name2.Length () < 2) return E_INVALIDARG; CMyComPtr<IFolderFolder> subFolder; if (name2.Left(4) == L"\\\\.\\") { CPhysDriveFolder *folderSpec = new CPhysDriveFolder; subFolder = folderSpec; RINOK(folderSpec->Init(name2.Mid(4, 2))); } else { if (name2[name2.Length () - 1] != WCHAR_PATH_SEPARATOR) name2 += WCHAR_PATH_SEPARATOR; NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder; subFolder = fsFolderSpec; if (fsFolderSpec->Init(name2, 0) != S_OK) { if (name2[0] == WCHAR_PATH_SEPARATOR) { CNetFolder *netFolderSpec = new CNetFolder; subFolder = netFolderSpec; netFolderSpec->Init(name2); } else return E_INVALIDARG; } } *resultFolder = subFolder.Detach(); return S_OK; }
STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder) { *resultFolder = 0; UString name2 = name; name2.Trim(); if (name2.IsEmpty()) { CRootFolder *rootFolderSpec = new CRootFolder; CMyComPtr<IFolderFolder> rootFolder = rootFolderSpec; rootFolderSpec->Init(); *resultFolder = rootFolder.Detach(); return S_OK; } for (unsigned i = 0; i < kNumRootFolderItems; i++) if (AreEqualNames(name2, _names[i])) return BindToFolder((UInt32)i, resultFolder); #ifdef USE_WIN_PATHS if (AreEqualNames(name2, L"My Documents") || AreEqualNames(name2, L"Documents")) return BindToFolder((UInt32)ROOT_INDEX_DOCUMENTS, resultFolder); #else if (name2 == WSTRING_PATH_SEPARATOR) return BindToFolder((UInt32)ROOT_INDEX_COMPUTER, resultFolder); #endif if (AreEqualNames(name2, L"My Computer") || AreEqualNames(name2, L"Computer")) return BindToFolder((UInt32)ROOT_INDEX_COMPUTER, resultFolder); if (name2 == WSTRING_PATH_SEPARATOR) { CMyComPtr<IFolderFolder> subFolder = this; *resultFolder = subFolder.Detach(); return S_OK; } if (name2.Len() < 2) return E_INVALIDARG; CMyComPtr<IFolderFolder> subFolder; #ifdef USE_WIN_PATHS if (name2.IsPrefixedBy(kVolPrefix)) { CFSDrives *folderSpec = new CFSDrives; subFolder = folderSpec; folderSpec->Init(true); } else if (name2 == NFile::NName::kSuperPathPrefix) { CFSDrives *folderSpec = new CFSDrives; subFolder = folderSpec; folderSpec->Init(false, true); } else if (name2.Back() == ':') { NAltStreamsFolder::CAltStreamsFolder *folderSpec = new NAltStreamsFolder::CAltStreamsFolder; subFolder = folderSpec; if (folderSpec->Init(us2fs(name2)) != S_OK) return E_INVALIDARG; } else #endif { NFile::NName::NormalizeDirPathPrefix(name2); NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder; subFolder = fsFolderSpec; if (fsFolderSpec->Init(us2fs(name2)) != S_OK) { #ifdef USE_WIN_PATHS if (name2[0] == WCHAR_PATH_SEPARATOR) { CNetFolder *netFolderSpec = new CNetFolder; subFolder = netFolderSpec; netFolderSpec->Init(name2); } else #endif return E_INVALIDARG; } } *resultFolder = subFolder.Detach(); return S_OK; }