[shell32]

- define STR_FILE_SYS_BIND_DATA in the public headers and use it in IFileSystemBindDataImpl and CFSFolder. Now we use the same string to store the IFileSystemBindDataImpl in the bind context. 
- Fix CFSFolder::ParseDisplayName to properly parse paths with a IBindCtx
- Should fix creating pidls that represent files that don't exist and fix SHChangeNotify tests that hanged for a whole minute in our test suite

svn path=/trunk/; revision=61094
This commit is contained in:
Giannis Adamopoulos 2013-11-24 21:42:28 +00:00
parent c61dbc2626
commit a24db78920
3 changed files with 22 additions and 17 deletions

View file

@ -110,7 +110,6 @@ static const shvheader GenericSFHeader[] = {
*/
LPITEMIDLIST SHELL32_CreatePidlFromBindCtx(IBindCtx *pbc, LPCWSTR path)
{
static WCHAR szfsbc[] = L"File System Bind Data";
IFileSystemBindData *fsbd = NULL;
LPITEMIDLIST pidl = NULL;
IUnknown *param = NULL;
@ -123,7 +122,7 @@ LPITEMIDLIST SHELL32_CreatePidlFromBindCtx(IBindCtx *pbc, LPCWSTR path)
return NULL;
/* see if the caller bound File System Bind Data */
r = pbc->GetObjectParam((LPOLESTR)szfsbc, &param);
r = pbc->GetObjectParam((LPOLESTR)STR_FILE_SYS_BIND_DATA, &param);
if (FAILED(r))
return NULL;
@ -198,20 +197,27 @@ HRESULT WINAPI CFSFolder::ParseDisplayName(HWND hwndOwner,
if (pchEaten)
*pchEaten = 0; /* strange but like the original */
pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, lpszDisplayName);
if (!pidlTemp && *lpszDisplayName)
if (*lpszDisplayName)
{
/* get the next element */
szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH);
/* build the full pathname to the element */
lstrcpynW(szPath, sPathTarget, MAX_PATH - 1);
PathAddBackslashW(szPath);
len = wcslen(szPath);
lstrcpynW(szPath + len, szElement, MAX_PATH - len);
pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, szElement);
if (pidlTemp != NULL)
{
hr = S_OK;
}
else
{
/* build the full pathname to the element */
lstrcpynW(szPath, sPathTarget, MAX_PATH - 1);
PathAddBackslashW(szPath);
len = wcslen(szPath);
lstrcpynW(szPath + len, szElement, MAX_PATH - len);
/* get the pidl */
hr = _ILCreateFromPathW(szPath, &pidlTemp);
/* get the pidl */
hr = _ILCreateFromPathW(szPath, &pidlTemp);
}
if (SUCCEEDED(hr))
{

View file

@ -49,9 +49,6 @@ BEGIN_COM_MAP(IFileSystemBindDataImpl)
END_COM_MAP()
};
static const WCHAR wFileSystemBindData[] = {
'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d','D','a','t','a',0};
HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV)
{
CComPtr<IFileSystemBindData> fileSystemBindData;
@ -83,7 +80,7 @@ HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC
hResult = bindContext->SetBindOptions(&bindOpts);
if (FAILED(hResult))
return hResult;
hResult = bindContext->RegisterObjectParam((LPOLESTR)wFileSystemBindData, fileSystemBindData);
hResult = bindContext->RegisterObjectParam((LPOLESTR)STR_FILE_SYS_BIND_DATA, fileSystemBindData);
if (FAILED(hResult))
return hResult;
@ -103,7 +100,7 @@ HRESULT WINAPI FileSystemBindData_GetFindData(LPBC pbc, WIN32_FIND_DATAW *pfd)
if (!pfd)
return E_INVALIDARG;
ret = pbc->GetObjectParam((LPOLESTR)wFileSystemBindData, &pUnk);
ret = pbc->GetObjectParam((LPOLESTR)STR_FILE_SYS_BIND_DATA, &pUnk);
if (SUCCEEDED(ret))
{
ret = pUnk->QueryInterface(IID_PPV_ARG(IFileSystemBindData, &pfsbd));
@ -121,7 +118,7 @@ HRESULT WINAPI FileSystemBindData_SetFindData(LPBC pbc, const WIN32_FIND_DATAW *
TRACE("%p, %p\n", pbc, pfd);
ret = pbc->GetObjectParam((LPOLESTR)wFileSystemBindData, &pUnk);
ret = pbc->GetObjectParam((LPOLESTR)STR_FILE_SYS_BIND_DATA, &pUnk);
if (SUCCEEDED(ret))
{
ret = pUnk->QueryInterface(IID_PPV_ARG(IFileSystemBindData, &pfsbd));

View file

@ -1833,6 +1833,8 @@ interface IShellChangeNotify : IUnknown
[in] LPCITEMIDLIST pidl2);
}
cpp_quote("#define STR_FILE_SYS_BIND_DATA L\"File System Bind Data\"")
/*****************************************************************************
* IFileSystemBindData interface
*/