[PATCH 1/4] shell32: Add IQueryInfo in ShellFolder2_GetUIObjectOf

Detlef Riekenberg wine.dev at web.de
Fri May 18 06:06:16 CDT 2012


--
By by ... Detlef
---
 dlls/shell32/folders.c       |  109 ++++++++++++++++++++++++++++++++++++++++++
 dlls/shell32/shell32_main.h  |    6 +-
 dlls/shell32/shfldr_unixfs.c |   11 ++++-
 3 files changed, 121 insertions(+), 5 deletions(-)

diff --git a/dlls/shell32/folders.c b/dlls/shell32/folders.c
index 4848644..9f9f1cc 100644
--- a/dlls/shell32/folders.c
+++ b/dlls/shell32/folders.c
@@ -44,6 +44,21 @@
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
 /***********************************************************************
+ * IQueryInfo implementation
+ */
+typedef struct
+{
+    IQueryInfo IQueryInfo_iface;
+    LONG ref;
+    LPITEMIDLIST    pidl;
+} IQueryInfoImpl;
+
+static inline IQueryInfoImpl *impl_from_IQueryInfo(IQueryInfo *iface)
+{
+    return CONTAINING_RECORD(iface, IQueryInfoImpl, IQueryInfo_iface);
+}
+
+/***********************************************************************
 *   IExtractIconW implementation
 */
 typedef struct
@@ -561,3 +576,97 @@ IExtractIconA *IExtractIconA_Constructor(LPCITEMIDLIST pidl)
 
     return &ei->IExtractIconA_iface;
 }
+
+/***********************************************************************
+ * IQueryInfo implementation
+ */
+
+static HRESULT WINAPI QueryInfo_fnQueryInterface(IQueryInfo* iface, REFIID riid, LPVOID *ppv)
+{
+    IQueryInfoImpl *This = impl_from_IQueryInfo(iface);
+
+    TRACE("(%p, %s, %p)\n",This, debugstr_guid(riid), ppv);
+
+    if (ppv == NULL)
+        return E_POINTER;
+
+    if (IsEqualGUID(&IID_IUnknown, riid) ||
+        IsEqualGUID(&IID_IQueryInfo, riid)) {
+        *ppv = &This->IQueryInfo_iface;
+        IUnknown_AddRef((IUnknown*)*ppv);
+        TRACE("returning IQueryInfo: %p\n", *ppv);
+        return S_OK;
+    }
+
+    *ppv = NULL;
+    FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI QueryInfo_fnAddRef(IQueryInfo *iface)
+{
+    IQueryInfoImpl *This = impl_from_IQueryInfo(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI QueryInfo_fnRelease(IQueryInfo *iface)
+{
+    IQueryInfoImpl *This = impl_from_IQueryInfo(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if (!ref) {
+        SHFree(This->pidl);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+    return ref;
+}
+
+static HRESULT WINAPI QueryInfo_fnGetInfoTip(IQueryInfo *iface, DWORD flags, PWSTR *result)
+{
+    IQueryInfoImpl *This = impl_from_IQueryInfo(iface);
+
+    FIXME("(%p)->(0x%x, %p)\n", This, flags, result);
+
+    *result = NULL;
+    return S_OK;
+}
+
+static HRESULT WINAPI QueryInfo_fnGetFlags(IQueryInfo *iface, DWORD *flags)
+{
+    IQueryInfoImpl *This = impl_from_IQueryInfo(iface);
+
+    FIXME("(%p)->(%p)\n", This, flags);
+
+    *flags = 0;
+    return S_OK;
+}
+
+static const IQueryInfoVtbl IQueryInfo_vtbl =
+{
+    QueryInfo_fnQueryInterface,
+    QueryInfo_fnAddRef,
+    QueryInfo_fnRelease,
+    QueryInfo_fnGetInfoTip,
+    QueryInfo_fnGetFlags
+};
+
+
+IQueryInfo *IQueryInfo_Constructor(LPCITEMIDLIST pidl)
+{
+    IQueryInfoImpl *qi;
+
+    TRACE("(%p)\n", pidl);
+
+    qi = HeapAlloc(GetProcessHeap(), 0, sizeof(IQueryInfoImpl));
+    qi->IQueryInfo_iface.lpVtbl = &IQueryInfo_vtbl;
+    qi->ref=1;
+    qi->pidl=ILClone(pidl);
+
+    TRACE("==> %p (pidl: %p)\n", qi, qi->pidl);
+    return &qi->IQueryInfo_iface;
+}
diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h
index ece1863..353d916 100644
--- a/dlls/shell32/shell32_main.h
+++ b/dlls/shell32/shell32_main.h
@@ -109,9 +109,9 @@ HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIco
 HRESULT WINAPI IAutoComplete_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) DECLSPEC_HIDDEN;
 HRESULT WINAPI ApplicationAssociationRegistration_Constructor(IUnknown *outer, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
 
-
-LPEXTRACTICONA	IExtractIconA_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN;
-LPEXTRACTICONW	IExtractIconW_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN;
+IQueryInfo *IQueryInfo_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN;
+LPEXTRACTICONA IExtractIconA_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN;
+LPEXTRACTICONW IExtractIconW_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN;
 
 /* initialisation for FORMATETC */
 #define InitFormatEtc(fe, cf, med) \
diff --git a/dlls/shell32/shfldr_unixfs.c b/dlls/shell32/shfldr_unixfs.c
index b90fdfa..5a6478a 100644
--- a/dlls/shell32/shfldr_unixfs.c
+++ b/dlls/shell32/shfldr_unixfs.c
@@ -1220,8 +1220,15 @@ static HRESULT WINAPI ShellFolder2_GetUIObjectOf(IShellFolder2* iface, HWND hwnd
     } else if (IsEqualIID(&IID_IShellLinkA, riid)) {
         FIXME("IShellLinkA\n");
         return E_FAIL;
-    } else {
-        FIXME("Unknown interface %s in GetUIObjectOf\n", debugstr_guid(riid));
+    } else if (IsEqualIID(&IID_IQueryInfo, riid)) {
+        LPITEMIDLIST pidl;
+        if (cidl != 1) return E_INVALIDARG;
+        pidl = ILCombine(This->m_pidlLocation, apidl[0]);
+        *ppvOut = IQueryInfo_Constructor(pidl);
+        SHFree(pidl);
+        return S_OK;
+     } else {
+        FIXME("Unknown interface %s\n", debugstr_guid(riid));
         return E_NOINTERFACE;
     }
 }
-- 
1.7.5.4




More information about the wine-patches mailing list