diff options
Diffstat (limited to '7zip/FileManager/RootFolder.cpp')
-rwxr-xr-x | 7zip/FileManager/RootFolder.cpp | 65 |
1 files changed, 39 insertions, 26 deletions
diff --git a/7zip/FileManager/RootFolder.cpp b/7zip/FileManager/RootFolder.cpp index ebff83c4..6eed3d1f 100755 --- a/7zip/FileManager/RootFolder.cpp +++ b/7zip/FileManager/RootFolder.cpp @@ -12,6 +12,7 @@ #include "Windows/PropVariant.h" #include "FSDrives.h" +#include "PhysDriveFolder.h" #include "NetFolder.h" #include "SysIconUtils.h" #include "LangUtils.h" @@ -29,8 +30,8 @@ static const STATPROPSTG kProperties[] = void CRootFolder::Init() { - _computerName = LangLoadStringW(IDS_COMPUTER, 0x03020300); - _networkName = LangLoadStringW(IDS_NETWORK, 0x03020301); + _computerName = LangString(IDS_COMPUTER, 0x03020300); + _networkName = LangString(IDS_NETWORK, 0x03020301); }; STDMETHODIMP CRootFolder::LoadItems() @@ -39,13 +40,13 @@ STDMETHODIMP CRootFolder::LoadItems() return S_OK; } -STDMETHODIMP CRootFolder::GetNumberOfItems(UINT32 *numItems) +STDMETHODIMP CRootFolder::GetNumberOfItems(UInt32 *numItems) { *numItems = 2; return S_OK; } -STDMETHODIMP CRootFolder::GetProperty(UINT32 itemIndex, PROPID propID, PROPVARIANT *value) +STDMETHODIMP CRootFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant propVariant; switch(propID) @@ -56,7 +57,7 @@ STDMETHODIMP CRootFolder::GetProperty(UINT32 itemIndex, PROPID propID, PROPVARIA case kpidName: if (itemIndex == 0) propVariant = _computerName; - else + else if (itemIndex == 1) propVariant = _networkName; break; } @@ -64,7 +65,7 @@ STDMETHODIMP CRootFolder::GetProperty(UINT32 itemIndex, PROPID propID, PROPVARIA return S_OK; } -STDMETHODIMP CRootFolder::BindToFolder(UINT32 index, IFolderFolder **resultFolder) +STDMETHODIMP CRootFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder) { if (index == 0) { @@ -73,13 +74,15 @@ STDMETHODIMP CRootFolder::BindToFolder(UINT32 index, IFolderFolder **resultFolde fsDrivesSpec->Init(); *resultFolder = subFolder.Detach(); } - else + else if (index == 1) { CNetFolder *netFolderSpec = new CNetFolder; CMyComPtr<IFolderFolder> subFolder = netFolderSpec; netFolderSpec->Init(0, 0, _networkName + L'\\'); *resultFolder = subFolder.Detach(); } + else + return E_INVALIDARG; return S_OK; } @@ -98,10 +101,10 @@ STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resu } if (name2 == _computerName || name2 == (_computerName + UString(L'\\'))) - return BindToFolder(UINT32(0), resultFolder); + return BindToFolder(UInt32(0), resultFolder); if (name2 == _networkName || name2 == (_networkName + UString(L'\\'))) - return BindToFolder(UINT32(1), resultFolder); + return BindToFolder(UInt32(1), resultFolder); if (name2 == UString(L'\\')) { CMyComPtr<IFolderFolder> subFolder = this; @@ -112,24 +115,34 @@ STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resu if (name2.Length () < 2) return E_INVALIDARG; - if (name2[name2.Length () - 1] != L'\\') - name2 += L'\\'; - CFSFolder *fsFolderSpec = new CFSFolder; - CMyComPtr<IFolderFolder> subFolder = fsFolderSpec; - if (fsFolderSpec->Init(name2, 0) == S_OK) + CMyComPtr<IFolderFolder> subFolder; + + if (name2.Left(4) == L"\\\\.\\") { - *resultFolder = subFolder.Detach(); - return S_OK; + CPhysDriveFolder *folderSpec = new CPhysDriveFolder; + subFolder = folderSpec; + RINOK(folderSpec->Init(name2.Mid(4, 2))); } - if (name2[0] == L'\\') + else { - CNetFolder *netFolderSpec = new CNetFolder; - CMyComPtr<IFolderFolder> subFolder = netFolderSpec; - netFolderSpec->Init(name2); - *resultFolder = subFolder.Detach(); - return S_OK; + if (name2[name2.Length () - 1] != L'\\') + name2 += L'\\'; + CFSFolder *fsFolderSpec = new CFSFolder; + subFolder = fsFolderSpec; + if (fsFolderSpec->Init(name2, 0) != S_OK) + { + if (name2[0] == L'\\') + { + CNetFolder *netFolderSpec = new CNetFolder; + subFolder = netFolderSpec; + netFolderSpec->Init(name2); + } + else + return E_INVALIDARG; + } } - return E_INVALIDARG; + *resultFolder = subFolder.Detach(); + return S_OK; } STDMETHODIMP CRootFolder::BindToParentFolder(IFolderFolder **resultFolder) @@ -143,13 +156,13 @@ STDMETHODIMP CRootFolder::GetName(BSTR *name) return E_NOTIMPL; } -STDMETHODIMP CRootFolder::GetNumberOfProperties(UINT32 *numProperties) +STDMETHODIMP CRootFolder::GetNumberOfProperties(UInt32 *numProperties) { *numProperties = sizeof(kProperties) / sizeof(kProperties[0]); return S_OK; } -STDMETHODIMP CRootFolder::GetPropertyInfo(UINT32 index, +STDMETHODIMP CRootFolder::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) { if (index >= sizeof(kProperties) / sizeof(kProperties[0])) @@ -175,7 +188,7 @@ STDMETHODIMP CRootFolder::GetPath(BSTR *path) return S_OK; } -STDMETHODIMP CRootFolder::GetSystemIconIndex(UINT32 index, INT32 *iconIndex) +STDMETHODIMP CRootFolder::GetSystemIconIndex(UInt32 index, INT32 *iconIndex) { int aCSIDL; if (index == 0) |