Module: wine Branch: master Commit: 8a46b9e5d198c7cf46508d9ab78f804861ee48e5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a46b9e5d198c7cf46508d9ab7...
Author: Vincent Povirk vincent@codeweavers.com Date: Mon Sep 25 15:35:23 2017 -0500
shell32: Add support for find data in IShellLink:GetPath.
Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/shell32/shelllink.c | 66 ++++++++++++++++++++++++++++++++++++++++-- dlls/shell32/tests/shelllink.c | 33 +++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c index ba33477..40fab4d 100644 --- a/dlls/shell32/shelllink.c +++ b/dlls/shell32/shelllink.c @@ -1270,7 +1270,39 @@ static HRESULT WINAPI IShellLinkA_fnGetPath(IShellLinkA *iface, LPSTR pszFile, I else res = S_FALSE;
- if (pfd) FIXME("(%p): WIN32_FIND_DATA is not yet filled.\n", This); + if (pfd) + { + memset(pfd, 0, sizeof(*pfd)); + + if (res == S_OK) + { + char path[MAX_PATH]; + WIN32_FILE_ATTRIBUTE_DATA fad; + + WideCharToMultiByte(CP_ACP, 0, This->sPath, -1, path, MAX_PATH, NULL, NULL); + + if (GetFileAttributesExW(This->sPath, GetFileExInfoStandard, &fad)) + { + pfd->dwFileAttributes = fad.dwFileAttributes; + pfd->ftCreationTime = fad.ftCreationTime; + pfd->ftLastAccessTime = fad.ftLastAccessTime; + pfd->ftLastWriteTime = fad.ftLastWriteTime; + pfd->nFileSizeHigh = fad.nFileSizeHigh; + pfd->nFileSizeLow = fad.nFileSizeLow; + } + + lstrcpyA(pfd->cFileName, PathFindFileNameA(path)); + + if (GetShortPathNameA(path, path, MAX_PATH)) + { + lstrcpyA(pfd->cAlternateFileName, PathFindFileNameA(path)); + } + } + + TRACE("attr 0x%08x size 0x%08x%08x name %s shortname %s\n", pfd->dwFileAttributes, + pfd->nFileSizeHigh, pfd->nFileSizeLow, wine_dbgstr_a(pfd->cFileName), + wine_dbgstr_a(pfd->cAlternateFileName)); + }
return res; } @@ -1657,7 +1689,37 @@ static HRESULT WINAPI IShellLinkW_fnGetPath(IShellLinkW * iface, LPWSTR pszFile, else res = S_FALSE;
- if (pfd) FIXME("(%p): WIN32_FIND_DATA is not yet filled.\n", This); + if (pfd) + { + memset(pfd, 0, sizeof(*pfd)); + + if (res == S_OK) + { + WCHAR path[MAX_PATH]; + WIN32_FILE_ATTRIBUTE_DATA fad; + + if (GetFileAttributesExW(This->sPath, GetFileExInfoStandard, &fad)) + { + pfd->dwFileAttributes = fad.dwFileAttributes; + pfd->ftCreationTime = fad.ftCreationTime; + pfd->ftLastAccessTime = fad.ftLastAccessTime; + pfd->ftLastWriteTime = fad.ftLastWriteTime; + pfd->nFileSizeHigh = fad.nFileSizeHigh; + pfd->nFileSizeLow = fad.nFileSizeLow; + } + + lstrcpyW(pfd->cFileName, PathFindFileNameW(This->sPath)); + + if (GetShortPathNameW(This->sPath, path, MAX_PATH)) + { + lstrcpyW(pfd->cAlternateFileName, PathFindFileNameW(path)); + } + } + + TRACE("attr 0x%08x size 0x%08x%08x name %s shortname %s\n", pfd->dwFileAttributes, + pfd->nFileSizeHigh, pfd->nFileSizeLow, wine_dbgstr_w(pfd->cFileName), + wine_dbgstr_w(pfd->cAlternateFileName)); + }
return res; } diff --git a/dlls/shell32/tests/shelllink.c b/dlls/shell32/tests/shelllink.c index 461d92b..6f12fb2 100644 --- a/dlls/shell32/tests/shelllink.c +++ b/dlls/shell32/tests/shelllink.c @@ -105,6 +105,7 @@ static void test_get_set(void) IShellLinkW *slW = NULL; char mypath[MAX_PATH]; char buffer[INFOTIPSIZE]; + WIN32_FIND_DATAA finddata; LPITEMIDLIST pidl, tmp_pidl; const char * str; int i; @@ -160,6 +161,14 @@ static void test_get_set(void) ok(r == S_FALSE || broken(r == S_OK) /* NT4/W2K */, "GetPath failed (0x%08x)\n", r); ok(*buffer=='\0', "GetPath returned '%s'\n", buffer);
+ strcpy(buffer,"garbage"); + memset(&finddata, 0xaa, sizeof(finddata)); + r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), &finddata, SLGP_RAWPATH); + ok(r == S_FALSE || broken(r == S_OK) /* NT4/W2K */, "GetPath failed (0x%08x)\n", r); + ok(*buffer=='\0', "GetPath returned '%s'\n", buffer); + ok(finddata.dwFileAttributes == 0, "unexpected attributes %x\n", finddata.dwFileAttributes); + ok(finddata.cFileName[0] == 0, "unexpected filename '%s'\n", finddata.cFileName); + CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID*)&slW); if (!slW /* Win9x */ || !pGetLongPathNameA /* NT4 */) @@ -191,6 +200,14 @@ static void test_get_set(void) ok(r == S_OK, "GetPath failed (0x%08x)\n", r); ok(lstrcmpiA(buffer,str)==0, "GetPath returned '%s'\n", buffer);
+ strcpy(buffer,"garbage"); + memset(&finddata, 0xaa, sizeof(finddata)); + r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), &finddata, SLGP_RAWPATH); + ok(r == S_OK, "GetPath failed (0x%08x)\n", r); + ok(lstrcmpiA(buffer,str)==0, "GetPath returned '%s'\n", buffer); + ok(finddata.dwFileAttributes == 0, "unexpected attributes %x\n", finddata.dwFileAttributes); + ok(lstrcmpiA(finddata.cFileName, "file") == 0, "unexpected filename '%s'\n", finddata.cFileName); + /* Get some real path to play with */ GetWindowsDirectoryA( mypath, sizeof(mypath)-12 ); strcat(mypath, "\regedit.exe"); @@ -241,6 +258,14 @@ static void test_get_set(void) r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), NULL, SLGP_RAWPATH); ok(r == S_OK, "GetPath failed (0x%08x)\n", r); ok(lstrcmpiA(buffer, mypath)==0, "GetPath returned '%s'\n", buffer); + + strcpy(buffer,"garbage"); + memset(&finddata, 0xaa, sizeof(finddata)); + r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), &finddata, SLGP_RAWPATH); + ok(r == S_OK, "GetPath failed (0x%08x)\n", r); + ok(lstrcmpiA(buffer, mypath)==0, "GetPath returned '%s'\n", buffer); + ok(finddata.dwFileAttributes != 0, "unexpected attributes %x\n", finddata.dwFileAttributes); + ok(lstrcmpiA(finddata.cFileName, "regedit.exe") == 0, "unexpected filename '%s'\n", finddata.cFileName); }
if (pSHGetFolderLocation) @@ -258,6 +283,14 @@ static void test_get_set(void) ok(r == S_FALSE, "GetPath failed (0x%08x)\n", r); ok(buffer[0] == 0, "GetPath returned '%s'\n", buffer);
+ strcpy(buffer,"garbage"); + memset(&finddata, 0xaa, sizeof(finddata)); + r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), &finddata, SLGP_RAWPATH); + ok(r == S_FALSE, "GetPath failed (0x%08x)\n", r); + ok(buffer[0] == 0, "GetPath returned '%s'\n", buffer); + ok(finddata.dwFileAttributes == 0, "unexpected attributes %x\n", finddata.dwFileAttributes); + ok(finddata.cFileName[0] == 0, "unexpected filename '%s'\n", finddata.cFileName); + pILFree(pidl_controls); }