Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '7zip/FileManager/RootFolder.cpp')
-rwxr-xr-x7zip/FileManager/RootFolder.cpp65
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)