Nikolay Sivov : shell32: Forward couple of IKnownFolder methods to regular API equivalents.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 11 07:49:04 CDT 2015


Module: wine
Branch: master
Commit: 594e0b674f997af1d12bf75e67ac5c1dc723f630
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=594e0b674f997af1d12bf75e67ac5c1dc723f630

Author: Nikolay Sivov <nsivov at 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 */




More information about the wine-cvs mailing list