Module: wine Branch: master Commit: 594e0b674f997af1d12bf75e67ac5c1dc723f630 URL: http://source.winehq.org/git/wine.git/?a=commit;h=594e0b674f997af1d12bf75e67...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat May 9 13:31:34 2015 +0300
shell32: Forward couple of IKnownFolder methods to regular API equivalents.
---
dlls/shell32/shell32.spec | 1 + dlls/shell32/shellpath.c | 34 ++++++++++++++++++++++++++++------ include/shlobj.h | 26 +++++++++++++++++--------- 3 files changed, 46 insertions(+), 15 deletions(-)
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec index f168ed7..ed34919 100644 --- a/dlls/shell32/shell32.spec +++ b/dlls/shell32/shell32.spec @@ -379,6 +379,7 @@ @ stdcall SHGetItemFromDataObject(ptr long ptr ptr) @ stdcall SHGetItemFromObject(ptr ptr ptr) @ stdcall SHGetKnownFolderIDList(ptr long ptr ptr) +@ stdcall SHGetKnownFolderItem(ptr long long ptr ptr) @ stdcall SHGetKnownFolderPath(ptr long ptr ptr) @ stdcall SHGetLocalizedName(wstr ptr long ptr) @ stdcall SHGetMalloc(ptr) diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index 354b23a..5753bb6 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -5103,12 +5103,13 @@ static HRESULT WINAPI knownfolder_GetCategory(
static HRESULT WINAPI knownfolder_GetShellItem( IKnownFolder *iface, - DWORD dwFlags, + DWORD flags, REFIID riid, void **ppv) { - FIXME("0x%08x, %s, %p\n", dwFlags, debugstr_guid(riid), ppv); - return E_NOTIMPL; + struct knownfolder *knownfolder = impl_from_IKnownFolder(iface); + TRACE("(%p, 0x%08x, %s, %p)\n", knownfolder, flags, debugstr_guid(riid), ppv); + return SHGetKnownFolderItem(&knownfolder->id, flags, NULL, riid, ppv); }
static HRESULT get_known_folder_path( @@ -5275,11 +5276,12 @@ static HRESULT WINAPI knownfolder_SetPath(
static HRESULT WINAPI knownfolder_GetIDList( IKnownFolder *iface, - DWORD dwFlags, + DWORD flags, PIDLIST_ABSOLUTE *ppidl) { - FIXME("0x%08x, %p\n", dwFlags, ppidl); - return E_NOTIMPL; + struct knownfolder *knownfolder = impl_from_IKnownFolder( iface ); + TRACE("(%p, 0x%08x, %p)\n", knownfolder, flags, ppidl); + return SHGetKnownFolderIDList(&knownfolder->id, flags, NULL, ppidl); }
static HRESULT WINAPI knownfolder_GetFolderType( @@ -5717,6 +5719,26 @@ HRESULT WINAPI SHGetKnownFolderIDList(REFKNOWNFOLDERID rfid, DWORD flags, HANDLE return E_NOTIMPL; }
+HRESULT WINAPI SHGetKnownFolderItem(REFKNOWNFOLDERID rfid, KNOWN_FOLDER_FLAG flags, HANDLE hToken, + REFIID riid, void **ppv) +{ + PIDLIST_ABSOLUTE pidl; + HRESULT hr; + + TRACE("%s, 0x%08x, %p, %s, %p\n", debugstr_guid(rfid), flags, hToken, debugstr_guid(riid), ppv); + + hr = SHGetKnownFolderIDList(rfid, flags, hToken, &pidl); + if (FAILED(hr)) + { + *ppv = NULL; + return hr; + } + + hr = SHCreateItemFromIDList(pidl, riid, ppv); + CoTaskMemFree(pidl); + return hr; +} + static void register_system_knownfolders(void) { int i; diff --git a/include/shlobj.h b/include/shlobj.h index 9025a73..c40be95 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -42,6 +42,21 @@ extern "C" { DECLARE_HANDLE(HPSXA); #endif
+typedef enum +{ + KF_FLAG_DEFAULT = 0x00000000, + KF_FLAG_SIMPLE_IDLIST = 0x00000100, + KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200, + KF_FLAG_DEFAULT_PATH = 0x00000400, + KF_FLAG_INIT = 0x00000800, + KF_FLAG_NO_ALIAS = 0x00001000, + KF_FLAG_DONT_UNEXPAND = 0x00002000, + KF_FLAG_DONT_VERIFY = 0x00004000, + KF_FLAG_CREATE = 0x00008000, + KF_FLAG_NO_APPCONTAINER_REDIRECTION = 0x00010000, + KF_FLAG_ALIAS_ONLY = 0x80000000 +} KNOWN_FOLDER_FLAG; + UINT WINAPI SHAddFromPropSheetExtArray(HPSXA,LPFNADDPROPSHEETPAGE,LPARAM); LPVOID WINAPI SHAlloc(ULONG) __WINE_ALLOC_SIZE(1); HRESULT WINAPI SHCoCreateInstance(LPCWSTR,const CLSID*,IUnknown*,REFIID,LPVOID*); @@ -62,6 +77,8 @@ HRESULT WINAPI SHGetInstanceExplorer(IUnknown**); HRESULT WINAPI SHGetFolderPathAndSubDirA(HWND,int,HANDLE,DWORD,LPCSTR,LPSTR); HRESULT WINAPI SHGetFolderPathAndSubDirW(HWND,int,HANDLE,DWORD,LPCWSTR,LPWSTR); #define SHGetFolderPathAndSubDir WINELIB_NAME_AW(SHGetFolderPathAndSubDir) +HRESULT WINAPI SHGetKnownFolderIDList(REFKNOWNFOLDERID,DWORD,HANDLE,PIDLIST_ABSOLUTE*); +HRESULT WINAPI SHGetKnownFolderItem(REFKNOWNFOLDERID,KNOWN_FOLDER_FLAG,HANDLE,REFIID,void**); HRESULT WINAPI SHGetKnownFolderPath(REFKNOWNFOLDERID,DWORD,HANDLE,PWSTR*); BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST,LPSTR); BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR); @@ -92,15 +109,6 @@ BOOL WINAPI Shell_GetImageLists(HIMAGELIST*,HIMAGELIST*); BOOL WINAPI SignalFileOpen(PCIDLIST_ABSOLUTE); BOOL WINAPI ImportPrivacySettings(LPCWSTR, BOOL*, BOOL*);
-#define KF_FLAG_SIMPLE_IDLIST 0x00000100 -#define KF_FLAG_NOT_PARENT_RELATIVE 0x00000200 -#define KF_FLAG_DEFAULT_PATH 0x00000400 -#define KF_FLAG_INIT 0x00000800 -#define KF_FLAG_NO_ALIAS 0x00001000 -#define KF_FLAG_DONT_UNEXPAND 0x00002000 -#define KF_FLAG_DONT_VERIFY 0x00004000 -#define KF_FLAG_CREATE 0x00008000 - #define SHFMT_ERROR __MSABI_LONG(0xFFFFFFFF) /* Error on last format, drive may be formattable */ #define SHFMT_CANCEL __MSABI_LONG(0xFFFFFFFE) /* Last format was cancelled */ #define SHFMT_NOFORMAT __MSABI_LONG(0xFFFFFFFD) /* Drive is not formattable */