Commit 3d9ba614 authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Cleanup, create unicode versions of _ILCreateFromPath,

_ILCreateGuidFromStr, and _ILCreateFromFindData.
parent 19b78a0e
...@@ -387,22 +387,14 @@ HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl) ...@@ -387,22 +387,14 @@ HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl)
*/ */
HRESULT WINAPI SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) HRESULT WINAPI SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes)
{ {
LPSHELLFOLDER sf;
WCHAR lpszDisplayName[MAX_PATH]; WCHAR lpszDisplayName[MAX_PATH];
DWORD pchEaten;
HRESULT ret = E_FAIL;
TRACE_(shell)("%s %p 0x%08lx\n", path, ppidl, attributes ? *attributes : 0); TRACE_(shell)("%s %p 0x%08lx\n", path, ppidl, attributes ? *attributes : 0);
if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH)) if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH))
lpszDisplayName[MAX_PATH-1] = 0; lpszDisplayName[MAX_PATH-1] = 0;
if (SUCCEEDED (SHGetDesktopFolder(&sf))) return SHILCreateFromPathW(lpszDisplayName, ppidl, attributes);
{
ret = IShellFolder_ParseDisplayName(sf, 0, NULL, lpszDisplayName, &pchEaten, ppidl, attributes);
IShellFolder_Release(sf);
}
return ret;
} }
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes)
...@@ -435,8 +427,8 @@ HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * ...@@ -435,8 +427,8 @@ HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD *
* PARAMS * PARAMS
* hwndOwner [in] * hwndOwner [in]
* nFolder [in] CSIDL_xxxxx * nFolder [in] CSIDL_xxxxx
* fCreate [in] Create folder if it does not exist * fCreate [in] Create folder if it does not exist
* *
* RETURNS * RETURNS
* Success: The newly created pidl * Success: The newly created pidl
...@@ -510,13 +502,13 @@ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) ...@@ -510,13 +502,13 @@ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
* Explorer reads from registry directly (StreamMRU), * Explorer reads from registry directly (StreamMRU),
* so we can only check here * so we can only check here
*/ */
if ((!pcheck (pidl1)) || (!pcheck (pidl2))) if (!pcheck(pidl1) || !pcheck (pidl2))
return FALSE; return FALSE;
pdump (pidl1); pdump (pidl1);
pdump (pidl2); pdump (pidl2);
if ( (!pidl1) || (!pidl2) ) if (!pidl1 || !pidl2)
return FALSE; return FALSE;
while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) while (pidltemp1->mkid.cb && pidltemp2->mkid.cb)
...@@ -524,7 +516,7 @@ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) ...@@ -524,7 +516,7 @@ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
_ILSimpleGetText(pidltemp1, szData1, MAX_PATH); _ILSimpleGetText(pidltemp1, szData1, MAX_PATH);
_ILSimpleGetText(pidltemp2, szData2, MAX_PATH); _ILSimpleGetText(pidltemp2, szData2, MAX_PATH);
if (strcasecmp ( szData1, szData2 )!=0 ) if (strcasecmp( szData1, szData2 ))
return FALSE; return FALSE;
pidltemp1 = ILGetNext(pidltemp1); pidltemp1 = ILGetNext(pidltemp1);
...@@ -574,7 +566,7 @@ BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL b ...@@ -574,7 +566,7 @@ BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL b
_ILSimpleGetText(pParent, szData1, MAX_PATH); _ILSimpleGetText(pParent, szData1, MAX_PATH);
_ILSimpleGetText(pChild, szData2, MAX_PATH); _ILSimpleGetText(pChild, szData2, MAX_PATH);
if (strcasecmp ( szData1, szData2 )!=0 ) if (strcasecmp( szData1, szData2 ))
return FALSE; return FALSE;
pParent = ILGetNext(pParent); pParent = ILGetNext(pParent);
...@@ -582,7 +574,7 @@ BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL b ...@@ -582,7 +574,7 @@ BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL b
} }
/* child shorter or has equal length to parent */ /* child shorter or has equal length to parent */
if ( pParent->mkid.cb || ! pChild->mkid.cb) if (pParent->mkid.cb || !pChild->mkid.cb)
return FALSE; return FALSE;
/* not immediate descent */ /* not immediate descent */
...@@ -630,7 +622,7 @@ LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) ...@@ -630,7 +622,7 @@ LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
pdump (pidl1); pdump (pidl1);
pdump (pidl2); pdump (pidl2);
if ( _ILIsDesktop(pidl1) ) if (_ILIsDesktop(pidl1))
{ {
ret = pidl2; ret = pidl2;
} }
...@@ -682,18 +674,18 @@ LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) ...@@ -682,18 +674,18 @@ LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
TRACE("pidl=%p pidl=%p\n",pidl1,pidl2); TRACE("pidl=%p pidl=%p\n",pidl1,pidl2);
if(!pidl1 && !pidl2) return NULL; if (!pidl1 && !pidl2) return NULL;
pdump (pidl1); pdump (pidl1);
pdump (pidl2); pdump (pidl2);
if(!pidl1) if (!pidl1)
{ {
pidlNew = ILClone(pidl2); pidlNew = ILClone(pidl2);
return pidlNew; return pidlNew;
} }
if(!pidl2) if (!pidl2)
{ {
pidlNew = ILClone(pidl1); pidlNew = ILClone(pidl1);
return pidlNew; return pidlNew;
...@@ -766,7 +758,7 @@ HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEM ...@@ -766,7 +758,7 @@ HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEM
* *
* NOTES * NOTES
* pild = CSIDL_DESKTOP ret = 0 * pild = CSIDL_DESKTOP ret = 0
* pild = CSIDL_DRIVES ret = 0 * pild = CSIDL_DRIVES ret = 0
*/ */
LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl) LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl)
{ {
...@@ -831,7 +823,7 @@ LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl) ...@@ -831,7 +823,7 @@ LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
TRACE("%p\n", pidl); TRACE("%p\n", pidl);
if(pidl) if (pidl)
{ {
len = pidl->mkid.cb; len = pidl->mkid.cb;
if (len) if (len)
...@@ -899,7 +891,7 @@ LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd) ...@@ -899,7 +891,7 @@ LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd)
void WINAPI ILFree(LPITEMIDLIST pidl) void WINAPI ILFree(LPITEMIDLIST pidl)
{ {
TRACE("(pidl=%p)\n",pidl); TRACE("(pidl=%p)\n",pidl);
if(pidl) if (pidl)
SHFree(pidl); SHFree(pidl);
} }
...@@ -918,7 +910,7 @@ void WINAPI ILGlobalFree( LPITEMIDLIST pidl) ...@@ -918,7 +910,7 @@ void WINAPI ILGlobalFree( LPITEMIDLIST pidl)
{ {
TRACE("%p\n", pidl); TRACE("%p\n", pidl);
if(pidl) if (pidl)
Free(pidl); Free(pidl);
} }
...@@ -1093,7 +1085,7 @@ LPITEMIDLIST WINAPI SHSimpleIDListFromPathW(LPCWSTR lpszPath) ...@@ -1093,7 +1085,7 @@ LPITEMIDLIST WINAPI SHSimpleIDListFromPathW(LPCWSTR lpszPath)
LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW(LPCVOID lpszPath) LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW(LPCVOID lpszPath)
{ {
if ( SHELL_OsIsUnicode()) if ( SHELL_OsIsUnicode())
return SHSimpleIDListFromPathW (lpszPath); return SHSimpleIDListFromPathW (lpszPath);
return SHSimpleIDListFromPathA (lpszPath); return SHSimpleIDListFromPathA (lpszPath);
} }
...@@ -1261,7 +1253,7 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz ...@@ -1261,7 +1253,7 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz
ERR("pidl %p is borked\n",pidl); ERR("pidl %p is borked\n",pidl);
/* make sure there's enough space for the next segment */ /* make sure there's enough space for the next segment */
if ( (lstrlenA(txt) + lstrlenA(pszPath)) > uOutSize) if ((lstrlenA(txt) + lstrlenA(pszPath)) > uOutSize)
{ {
hr = E_INVALIDARG; hr = E_INVALIDARG;
break; break;
...@@ -1279,7 +1271,7 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz ...@@ -1279,7 +1271,7 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz
if (!pidl->mkid.cb) if (!pidl->mkid.cb)
break; break;
if( (lstrlenA(pszPath) + 1) > uOutSize) if ((lstrlenA(pszPath) + 1) > uOutSize)
{ {
hr = E_INVALIDARG; hr = E_INVALIDARG;
break; break;
...@@ -1336,7 +1328,7 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi ...@@ -1336,7 +1328,7 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi
HRESULT hr = S_OK; HRESULT hr = S_OK;
UINT len; UINT len;
pszPath[0]=0; pszPath[0]=0;
/* One case is a PIDL rooted at desktop level */ /* One case is a PIDL rooted at desktop level */
if (_ILIsValue(pidl) || _ILIsFolder(pidl)) if (_ILIsValue(pidl) || _ILIsFolder(pidl))
...@@ -1379,7 +1371,7 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi ...@@ -1379,7 +1371,7 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi
} }
MultiByteToWideChar(CP_ACP, 0, txt, -1, MultiByteToWideChar(CP_ACP, 0, txt, -1,
&pszPath[lstrlenW(pszPath)], len); &pszPath[lstrlenW(pszPath)], len);
pidl = ILGetNext(pidl); pidl = ILGetNext(pidl);
if (!pidl) if (!pidl)
...@@ -1392,7 +1384,7 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi ...@@ -1392,7 +1384,7 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi
if (!pidl->mkid.cb) if (!pidl->mkid.cb)
break; break;
if ( (lstrlenW(pszPath) + 1) > uOutSize ) if ((lstrlenW(pszPath) + 1) > uOutSize )
{ {
hr = E_INVALIDARG; hr = E_INVALIDARG;
break; break;
...@@ -1585,14 +1577,14 @@ LPITEMIDLIST _ILCreatePrinters() ...@@ -1585,14 +1577,14 @@ LPITEMIDLIST _ILCreatePrinters()
LPITEMIDLIST _ILCreateNetwork() LPITEMIDLIST _ILCreateNetwork()
{ {
TRACE("()\n"); TRACE("()\n");
return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces); return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces);
} }
LPITEMIDLIST _ILCreateBitBucket() LPITEMIDLIST _ILCreateBitBucket()
{ {
TRACE("()\n"); TRACE("()\n");
return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin); return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin);
} }
LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid) LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
...@@ -1631,6 +1623,37 @@ LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID) ...@@ -1631,6 +1623,37 @@ LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID)
return _ILCreateGuid(PT_GUID, &iid); return _ILCreateGuid(PT_GUID, &iid);
} }
LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID)
{
IID iid;
if (!SUCCEEDED(SHCLSIDFromStringW(szGUID, &iid)))
{
ERR("%s is not a GUID\n", debugstr_w(szGUID));
return NULL;
}
return _ILCreateGuid(PT_GUID, &iid);
}
LPITEMIDLIST _ILCreateFromFindDataW( WIN32_FIND_DATAW *wfd )
{
/* FIXME: should make unicode PIDLs */
WIN32_FIND_DATAA fda;
memset( &fda, 0, sizeof fda );
fda.dwFileAttributes = wfd->dwFileAttributes;
fda.ftCreationTime = wfd->ftCreationTime;
fda.ftLastAccessTime = wfd->ftLastAccessTime;
fda.ftLastWriteTime = wfd->ftLastWriteTime;
fda.nFileSizeHigh = wfd->nFileSizeHigh;
fda.nFileSizeLow = wfd->nFileSizeLow;
fda.dwReserved0 = wfd->dwReserved0;
fda.dwReserved1 = wfd->dwReserved1;
WideCharToMultiByte( CP_ACP, 0, wfd->cFileName, -1,
fda.cFileName, MAX_PATH, NULL, NULL );
return _ILCreateFromFindDataA( &fda );
}
LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA * stffile ) LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA * stffile )
{ {
char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */
...@@ -1703,25 +1726,41 @@ HRESULT _ILCreateFromPathA(LPCSTR szPath, LPITEMIDLIST* ppidl) ...@@ -1703,25 +1726,41 @@ HRESULT _ILCreateFromPathA(LPCSTR szPath, LPITEMIDLIST* ppidl)
return *ppidl ? S_OK : E_OUTOFMEMORY; return *ppidl ? S_OK : E_OUTOFMEMORY;
} }
HRESULT _ILCreateFromPathW(LPCWSTR szPath, LPITEMIDLIST* ppidl)
{
HANDLE hFile;
WIN32_FIND_DATAW stffile;
if (!ppidl)
return E_INVALIDARG;
hFile = FindFirstFileW(szPath, &stffile);
if (hFile == INVALID_HANDLE_VALUE)
return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
FindClose(hFile);
*ppidl = _ILCreateFromFindDataW(&stffile);
return *ppidl ? S_OK : E_OUTOFMEMORY;
}
LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew) LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
{ {
WCHAR sTemp[4];
LPITEMIDLIST pidlOut; LPITEMIDLIST pidlOut;
sTemp[0]=toupperW(lpszNew[0]); TRACE("(%s)\n",debugstr_w(lpszNew));
sTemp[1]=':';
sTemp[2]='\\';
sTemp[3]=0x00;
TRACE("(%s)\n",debugstr_w(sTemp));
if ((pidlOut = _ILAlloc(PT_DRIVE, sizeof(DriveStruct)))) pidlOut = _ILAlloc(PT_DRIVE, sizeof(DriveStruct));
if (pidlOut)
{ {
LPSTR pszDest; LPSTR pszDest;
if ((pszDest = _ILGetTextPointer(pidlOut))) pszDest = _ILGetTextPointer(pidlOut);
if (pszDest)
{ {
WideCharToMultiByte(CP_ACP, 0, sTemp, sizeof(sTemp)/sizeof(WCHAR), strcpy(pszDest, "x:\\");
pszDest, sizeof(sTemp)/sizeof(WCHAR), NULL, NULL); pszDest[0]=toupperW(lpszNew[0]);
TRACE("-- create Drive: %s\n", debugstr_a(pszDest)); TRACE("-- create Drive: %s\n", debugstr_a(pszDest));
} }
} }
...@@ -1833,7 +1872,7 @@ BOOL _ILIsCPanelStruct(LPCITEMIDLIST pidl) ...@@ -1833,7 +1872,7 @@ BOOL _ILIsCPanelStruct(LPCITEMIDLIST pidl)
/************************************************************************** /**************************************************************************
* _ILIsPidlSimple * _ILIsPidlSimple
*/ */
BOOL _ILIsPidlSimple ( LPCITEMIDLIST pidl) BOOL _ILIsPidlSimple(LPCITEMIDLIST pidl)
{ {
BOOL ret = TRUE; BOOL ret = TRUE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment