Vincent Povirk : shell32: Add IPersistIDList interface to ShellItem objects .

Alexandre Julliard julliard at winehq.org
Tue Feb 24 10:21:42 CST 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Fri Feb 13 16:34:42 2009 -0600

shell32: Add IPersistIDList interface to ShellItem objects.

---

 dlls/shell32/shellitem.c |   76 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/dlls/shell32/shellitem.c b/dlls/shell32/shellitem.c
index d16b35d..d65513d 100644
--- a/dlls/shell32/shellitem.c
+++ b/dlls/shell32/shellitem.c
@@ -42,9 +42,16 @@ typedef struct _ShellItem {
     const IShellItemVtbl    *lpIShellItemVtbl;
     LONG                    ref;
     LPITEMIDLIST            pidl;
+    const IPersistIDListVtbl *lpIPersistIDListVtbl;
 } ShellItem;
 
 
+static inline ShellItem *impl_from_IPersistIDList( IPersistIDList *iface )
+{
+    return (ShellItem*)((char*)iface - FIELD_OFFSET(ShellItem, lpIPersistIDListVtbl));
+}
+
+
 static HRESULT WINAPI ShellItem_QueryInterface(IShellItem *iface, REFIID riid,
     void **ppv)
 {
@@ -58,6 +65,10 @@ static HRESULT WINAPI ShellItem_QueryInterface(IShellItem *iface, REFIID riid,
     {
         *ppv = This;
     }
+    else if (IsEqualIID(&IID_IPersist, riid) || IsEqualIID(&IID_IPersistIDList, riid))
+    {
+        *ppv = &(This->lpIPersistIDListVtbl);
+    }
     else {
         FIXME("not implemented for %s\n", shdebugstr_guid(riid));
         *ppv = NULL;
@@ -153,6 +164,70 @@ static const IShellItemVtbl ShellItem_Vtbl = {
 };
 
 
+static HRESULT WINAPI ShellItem_GetClassID(ShellItem* This, CLSID *pClassID)
+{
+    TRACE("(%p,%p)\n", This, pClassID);
+
+    *pClassID = CLSID_ShellItem;
+    return S_OK;
+}
+
+
+static HRESULT WINAPI ShellItem_IPersistIDList_QueryInterface(IPersistIDList *iface,
+    REFIID riid, void **ppv)
+{
+    ShellItem *This = impl_from_IPersistIDList(iface);
+    return ShellItem_QueryInterface((IShellItem*)This, riid, ppv);
+}
+
+static ULONG WINAPI ShellItem_IPersistIDList_AddRef(IPersistIDList *iface)
+{
+    ShellItem *This = impl_from_IPersistIDList(iface);
+    return ShellItem_AddRef((IShellItem*)This);
+}
+
+static ULONG WINAPI ShellItem_IPersistIDList_Release(IPersistIDList *iface)
+{
+    ShellItem *This = impl_from_IPersistIDList(iface);
+    return ShellItem_Release((IShellItem*)This);
+}
+
+static HRESULT WINAPI ShellItem_IPersistIDList_GetClassID(IPersistIDList* iface,
+    CLSID *pClassID)
+{
+    ShellItem *This = impl_from_IPersistIDList(iface);
+
+    return ShellItem_GetClassID(This, pClassID);
+}
+
+static HRESULT WINAPI ShellItem_IPersistIDList_SetIDList(IPersistIDList* iface,
+    LPCITEMIDLIST pidl)
+{
+    ShellItem *This = impl_from_IPersistIDList(iface);
+
+    FIXME("(%p,%p)\n", This, pidl);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ShellItem_IPersistIDList_GetIDList(IPersistIDList* iface,
+    LPITEMIDLIST *ppidl)
+{
+    ShellItem *This = impl_from_IPersistIDList(iface);
+
+    FIXME("(%p,%p)\n", This, ppidl);
+    return E_NOTIMPL;
+}
+
+static const IPersistIDListVtbl ShellItem_IPersistIDList_Vtbl = {
+    ShellItem_IPersistIDList_QueryInterface,
+    ShellItem_IPersistIDList_AddRef,
+    ShellItem_IPersistIDList_Release,
+    ShellItem_IPersistIDList_GetClassID,
+    ShellItem_IPersistIDList_SetIDList,
+    ShellItem_IPersistIDList_GetIDList
+};
+
+
 HRESULT WINAPI IShellItem_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv)
 {
     ShellItem *This;
@@ -168,6 +243,7 @@ HRESULT WINAPI IShellItem_Constructor(IUnknown *pUnkOuter, REFIID riid, void **p
     This->lpIShellItemVtbl = &ShellItem_Vtbl;
     This->ref = 1;
     This->pidl = NULL;
+    This->lpIPersistIDListVtbl = &ShellItem_IPersistIDList_Vtbl;
 
     ret = ShellItem_QueryInterface((IShellItem*)This, riid, ppv);
     ShellItem_Release((IShellItem*)This);




More information about the wine-cvs mailing list