Nikolay Sivov : shell32: Added stub IPropertyStore for a shell link object.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 22 16:20:52 CST 2014


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Dec 22 15:18:20 2014 +0300

shell32: Added stub IPropertyStore for a shell link object.

---

 dlls/shell32/shelllink.c       | 164 ++++++++++++++++++++++++++++-------------
 dlls/shell32/tests/shelllink.c |  36 +++++++++
 2 files changed, 149 insertions(+), 51 deletions(-)

diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c
index b9c9e75..ebcaa25 100644
--- a/dlls/shell32/shelllink.c
+++ b/dlls/shell32/shelllink.c
@@ -115,15 +115,6 @@ typedef struct volume_info_t
 
 #include "poppack.h"
 
-static const IShellLinkAVtbl slvt;
-static const IShellLinkWVtbl slvtw;
-static const IPersistFileVtbl pfvt;
-static const IPersistStreamVtbl psvt;
-static const IShellLinkDataListVtbl dlvt;
-static const IShellExtInitVtbl eivt;
-static const IContextMenuVtbl cmvt;
-static const IObjectWithSiteVtbl owsvt;
-
 /* IShellLink Implementation */
 
 typedef struct
@@ -136,6 +127,7 @@ typedef struct
         IShellExtInit IShellExtInit_iface;
         IContextMenu IContextMenu_iface;
         IObjectWithSite IObjectWithSite_iface;
+        IPropertyStore IPropertyStore_iface;
 
 	LONG            ref;
 
@@ -205,6 +197,11 @@ static inline IShellLinkImpl *impl_from_IObjectWithSite(IObjectWithSite *iface)
     return CONTAINING_RECORD(iface, IShellLinkImpl, IObjectWithSite_iface);
 }
 
+static inline IShellLinkImpl *impl_from_IPropertyStore(IPropertyStore *iface)
+{
+    return CONTAINING_RECORD(iface, IShellLinkImpl, IPropertyStore_iface);
+}
+
 static HRESULT ShellLink_UpdatePath(LPCWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath);
 
 /* strdup on the process heap */
@@ -1140,48 +1137,6 @@ static const IPersistStreamVtbl psvt =
 	IPersistStream_fnGetSizeMax
 };
 
-/**************************************************************************
- *	  IShellLink_Constructor
- */
-HRESULT WINAPI IShellLink_Constructor( IUnknown *pUnkOuter,
-               REFIID riid, LPVOID *ppv )
-{
-	IShellLinkImpl * sl;
-	HRESULT r;
-
-	TRACE("unkOut=%p riid=%s\n",pUnkOuter, debugstr_guid(riid));
-
-	*ppv = NULL;
-
-	if (pUnkOuter)
-            return CLASS_E_NOAGGREGATION;
-	sl = LocalAlloc(LMEM_ZEROINIT,sizeof(IShellLinkImpl));
-	if (!sl)
-            return E_OUTOFMEMORY;
-
-	sl->ref = 1;
-        sl->IShellLinkA_iface.lpVtbl = &slvt;
-        sl->IShellLinkW_iface.lpVtbl = &slvtw;
-        sl->IPersistFile_iface.lpVtbl = &pfvt;
-        sl->IPersistStream_iface.lpVtbl = &psvt;
-        sl->IShellLinkDataList_iface.lpVtbl = &dlvt;
-        sl->IShellExtInit_iface.lpVtbl = &eivt;
-        sl->IContextMenu_iface.lpVtbl = &cmvt;
-        sl->IObjectWithSite_iface.lpVtbl = &owsvt;
-	sl->iShowCmd = SW_SHOWNORMAL;
-	sl->bDirty = FALSE;
-	sl->iIdOpen = -1;
-	sl->site = NULL;
-	sl->filepath = NULL;
-
-	TRACE("(%p)->()\n",sl);
-
-        r = IShellLinkW_QueryInterface( &sl->IShellLinkW_iface, riid, ppv );
-        IShellLinkW_Release( &sl->IShellLinkW_iface );
-        return r;
-}
-
-
 static BOOL SHELL_ExistsFileW(LPCWSTR path)
 {
     if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(path))
@@ -1627,6 +1582,10 @@ static HRESULT WINAPI IShellLinkW_fnQueryInterface(
     {
         *ppvObj = &This->IObjectWithSite_iface;
     }
+    else if(IsEqualIID(riid, &IID_IPropertyStore))
+    {
+        *ppvObj = &This->IPropertyStore_iface;
+    }
 
     if(*ppvObj)
     {
@@ -2600,3 +2559,106 @@ static const IObjectWithSiteVtbl owsvt =
     ShellLink_SetSite,
     ShellLink_GetSite,
 };
+
+static HRESULT WINAPI propertystore_QueryInterface(IPropertyStore *iface, REFIID riid, void **obj)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    return IShellLinkW_QueryInterface(&This->IShellLinkW_iface, riid, obj);
+}
+
+static ULONG WINAPI propertystore_AddRef(IPropertyStore *iface)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    return IShellLinkW_AddRef(&This->IShellLinkW_iface);
+}
+
+static ULONG WINAPI propertystore_Release(IPropertyStore *iface)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    return IShellLinkW_Release(&This->IShellLinkW_iface);
+}
+
+static HRESULT WINAPI propertystore_GetCount(IPropertyStore *iface, DWORD *props)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    FIXME("(%p)->(%p): stub\n", This, props);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI propertystore_GetAt(IPropertyStore *iface, DWORD propid, PROPERTYKEY *key)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    FIXME("(%p)->(%d %p): stub\n", This, propid, key);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI propertystore_GetValue(IPropertyStore *iface, REFPROPERTYKEY key, PROPVARIANT *value)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    FIXME("(%p)->(%p %p): stub\n", This, key, value);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI propertystore_SetValue(IPropertyStore *iface, REFPROPERTYKEY key, REFPROPVARIANT value)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    FIXME("(%p)->(%p %p): stub\n", This, key, value);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI propertystore_Commit(IPropertyStore *iface)
+{
+    IShellLinkImpl *This = impl_from_IPropertyStore(iface);
+    FIXME("(%p): stub\n", This);
+    return E_NOTIMPL;
+}
+
+static const IPropertyStoreVtbl propertystorevtbl = {
+    propertystore_QueryInterface,
+    propertystore_AddRef,
+    propertystore_Release,
+    propertystore_GetCount,
+    propertystore_GetAt,
+    propertystore_GetValue,
+    propertystore_SetValue,
+    propertystore_Commit
+};
+
+HRESULT WINAPI IShellLink_Constructor(IUnknown *outer, REFIID riid, void **obj)
+{
+    IShellLinkImpl * sl;
+    HRESULT r;
+
+    TRACE("outer=%p riid=%s\n", outer, debugstr_guid(riid));
+
+    *obj = NULL;
+
+    if (outer)
+        return CLASS_E_NOAGGREGATION;
+
+    sl = LocalAlloc(LMEM_ZEROINIT,sizeof(IShellLinkImpl));
+    if (!sl)
+        return E_OUTOFMEMORY;
+
+    sl->ref = 1;
+    sl->IShellLinkA_iface.lpVtbl = &slvt;
+    sl->IShellLinkW_iface.lpVtbl = &slvtw;
+    sl->IPersistFile_iface.lpVtbl = &pfvt;
+    sl->IPersistStream_iface.lpVtbl = &psvt;
+    sl->IShellLinkDataList_iface.lpVtbl = &dlvt;
+    sl->IShellExtInit_iface.lpVtbl = &eivt;
+    sl->IContextMenu_iface.lpVtbl = &cmvt;
+    sl->IObjectWithSite_iface.lpVtbl = &owsvt;
+    sl->IPropertyStore_iface.lpVtbl = &propertystorevtbl;
+    sl->iShowCmd = SW_SHOWNORMAL;
+    sl->bDirty = FALSE;
+    sl->iIdOpen = -1;
+    sl->site = NULL;
+    sl->filepath = NULL;
+
+    TRACE("(%p)\n", sl);
+
+    r = IShellLinkW_QueryInterface( &sl->IShellLinkW_iface, riid, obj );
+    IShellLinkW_Release( &sl->IShellLinkW_iface );
+    return r;
+}
diff --git a/dlls/shell32/tests/shelllink.c b/dlls/shell32/tests/shelllink.c
index ba9d1eb..b258052 100644
--- a/dlls/shell32/tests/shelllink.c
+++ b/dlls/shell32/tests/shelllink.c
@@ -1151,6 +1151,41 @@ static void test_SHExtractIcons(void)
     for (i = 0; i < ret; i++) DestroyIcon(icons[i]);
 }
 
+static void test_propertystore(void)
+{
+    IShellLinkA *linkA;
+    IShellLinkW *linkW;
+    IPropertyStore *ps;
+    HRESULT hr;
+
+    hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+                         &IID_IShellLinkA, (void**)&linkA);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IShellLinkA_QueryInterface(linkA, &IID_IShellLinkW, (void**)&linkW);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IShellLinkA_QueryInterface(linkA, &IID_IPropertyStore, (void**)&ps);
+    if (hr == S_OK) {
+        IPropertyStoreCache *pscache;
+
+        IPropertyStore_Release(ps);
+
+        hr = IShellLinkW_QueryInterface(linkW, &IID_IPropertyStore, (void**)&ps);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        hr = IPropertyStore_QueryInterface(ps, &IID_IPropertyStoreCache, (void**)&pscache);
+        ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
+        IPropertyStore_Release(ps);
+    }
+    else
+        win_skip("IShellLink doesn't support IPropertyStore.\n");
+
+    IShellLinkA_Release(linkA);
+    IShellLinkW_Release(linkW);
+}
+
 START_TEST(shelllink)
 {
     HRESULT r;
@@ -1178,6 +1213,7 @@ START_TEST(shelllink)
     test_GetIconLocation();
     test_SHGetStockIconInfo();
     test_SHExtractIcons();
+    test_propertystore();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list