[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