Alexandre Julliard : shell32: Use wine_get_dos_file_name instead of duplicating knowledge about the drive symlinks .
Alexandre Julliard
julliard at winehq.org
Thu Oct 18 07:59:41 CDT 2007
Module: wine
Branch: master
Commit: 7f092818f057ce02d0f8c4628cbf7e93c1d69040
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f092818f057ce02d0f8c4628cbf7e93c1d69040
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Oct 18 14:11:43 2007 +0200
shell32: Use wine_get_dos_file_name instead of duplicating knowledge about the drive symlinks.
---
dlls/shell32/shfldr_unixfs.c | 59 ++++++++++--------------------------------
1 files changed, 14 insertions(+), 45 deletions(-)
diff --git a/dlls/shell32/shfldr_unixfs.c b/dlls/shell32/shfldr_unixfs.c
index a4f4ade..f780037 100644
--- a/dlls/shell32/shfldr_unixfs.c
+++ b/dlls/shell32/shfldr_unixfs.c
@@ -369,36 +369,6 @@ static inline BOOL UNIXFS_is_pidl_of_type(LPITEMIDLIST pIDL, SHCONTF fFilter) {
}
/******************************************************************************
- * UNIXFS_is_dos_device [Internal]
- *
- * Determines if a unix directory corresponds to any dos device.
- *
- * PARAMS
- * statPath [I] The stat struct of the directory, as returned by stat(2).
- *
- * RETURNS
- * TRUE, if statPath corresponds to any dos drive letter
- * FALSE, otherwise
- */
-static BOOL UNIXFS_is_dos_device(const struct stat *statPath) {
- struct stat statDrive;
- char *pszDrivePath;
- DWORD dwDriveMap;
- WCHAR wszDosDevice[4] = { 'A', ':', '\\', 0 };
-
- for (dwDriveMap = GetLogicalDrives(); dwDriveMap; dwDriveMap >>= 1, wszDosDevice[0]++) {
- if (!(dwDriveMap & 0x1)) continue;
- pszDrivePath = wine_get_unix_file_name(wszDosDevice);
- if (pszDrivePath && !stat(pszDrivePath, &statDrive)) {
- HeapFree(GetProcessHeap(), 0, pszDrivePath);
- if ((statPath->st_dev == statDrive.st_dev) && (statPath->st_ino == statDrive.st_ino))
- return TRUE;
- }
- }
- return FALSE;
-}
-
-/******************************************************************************
* UNIXFS_get_unix_path [Internal]
*
* Convert an absolute dos path to an absolute unix path.
@@ -733,9 +703,9 @@ static HRESULT UNIXFS_initialize_target_folder(UnixFolder *This, const char *szB
{
LPCITEMIDLIST current = pidlSubFolder;
DWORD dwPathLen = strlen(szBasePath)+1;
- struct stat statPrefix;
char *pNextDir;
-
+ WCHAR *dos_name;
+
/* Determine the path's length bytes */
while (current && current->mkid.cb) {
dwPathLen += UNIXFS_filename_from_shitemid(current, NULL) + 1; /* For the '/' */
@@ -755,23 +725,20 @@ static HRESULT UNIXFS_initialize_target_folder(UnixFolder *This, const char *szB
pNextDir += strlen(szBasePath);
if (This->m_dwPathMode == PATHMODE_UNIX || IsEqualCLSID(&CLSID_MyDocuments, This->m_pCLSID))
This->m_dwAttributes |= SFGAO_FILESYSTEM;
- if (!(This->m_dwAttributes & SFGAO_FILESYSTEM)) {
- *pNextDir = '\0';
- if (!stat(This->m_pszPath, &statPrefix) && UNIXFS_is_dos_device(&statPrefix))
- This->m_dwAttributes |= SFGAO_FILESYSTEM;
- }
while (current && current->mkid.cb) {
pNextDir += UNIXFS_filename_from_shitemid(current, pNextDir);
- if (!(This->m_dwAttributes & SFGAO_FILESYSTEM)) {
- *pNextDir = '\0';
- if (!stat(This->m_pszPath, &statPrefix) && UNIXFS_is_dos_device(&statPrefix))
- This->m_dwAttributes |= SFGAO_FILESYSTEM;
- }
*pNextDir++ = '/';
current = ILGetNext(current);
}
*pNextDir='\0';
-
+
+ if (!(This->m_dwAttributes & SFGAO_FILESYSTEM) &&
+ ((dos_name = wine_get_dos_file_name(This->m_pszPath))))
+ {
+ This->m_dwAttributes |= SFGAO_FILESYSTEM;
+ HeapFree( GetProcessHeap(), 0, dos_name );
+ }
+
return S_OK;
}
@@ -1050,11 +1017,13 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_GetAttributesOf(IShellFolder2* if
pszRelativePath = szAbsolutePath + lstrlenA(szAbsolutePath);
for (i=0; i<cidl; i++) {
if (!(This->m_dwAttributes & SFGAO_FILESYSTEM)) {
- struct stat fileStat;
+ WCHAR *dos_name;
if (!UNIXFS_filename_from_shitemid(apidl[i], pszRelativePath))
return E_INVALIDARG;
- if (stat(szAbsolutePath, &fileStat) || !UNIXFS_is_dos_device(&fileStat))
+ if (!(dos_name = wine_get_dos_file_name( szAbsolutePath )))
*rgfInOut &= ~SFGAO_FILESYSTEM;
+ else
+ HeapFree( GetProcessHeap(), 0, dos_name );
}
if (_ILIsFolder(apidl[i]))
*rgfInOut |= SFGAO_FOLDER|SFGAO_HASSUBFOLDER|SFGAO_FILESYSANCESTOR;
More information about the wine-cvs
mailing list