Andrew Bogott : shdocvw: Add the IPropertySet interface to an internet shortcut, and partially implement it.
Alexandre Julliard
julliard at winehq.org
Thu Dec 2 12:23:59 CST 2010
Module: wine
Branch: master
Commit: cc34ca4c5122b47a4d528e5a79352195f8666adb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cc34ca4c5122b47a4d528e5a79352195f8666adb
Author: Andrew Bogott <andrew at CodeWeavers.com>
Date: Fri Nov 19 21:54:26 2010 -0600
shdocvw: Add the IPropertySet interface to an internet shortcut, and partially implement it.
---
dlls/shdocvw/intshcut.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 111 insertions(+), 0 deletions(-)
diff --git a/dlls/shdocvw/intshcut.c b/dlls/shdocvw/intshcut.c
index a5ad1b7..8f55a20 100644
--- a/dlls/shdocvw/intshcut.c
+++ b/dlls/shdocvw/intshcut.c
@@ -46,9 +46,11 @@ typedef struct
IUniformResourceLocatorA uniformResourceLocatorA;
IUniformResourceLocatorW uniformResourceLocatorW;
IPersistFile persistFile;
+ IPropertySetStorage IPropertySetStorage_iface;
LONG refCount;
+ IPropertySetStorage *property_set_storage;
WCHAR *url;
BOOLEAN isDirty;
LPOLESTR currentFile;
@@ -71,6 +73,11 @@ static inline InternetShortcut* impl_from_IPersistFile(IPersistFile *iface)
return CONTAINING_RECORD(iface, InternetShortcut, persistFile);
}
+static inline InternetShortcut* impl_from_IPropertySetStorage(IPropertySetStorage *iface)
+{
+ return (InternetShortcut*)((char*)iface - FIELD_OFFSET(InternetShortcut, IPropertySetStorage_iface));
+}
+
static BOOL run_winemenubuilder( const WCHAR *args )
{
static const WCHAR menubuilder[] = {'\\','w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e',0};
@@ -145,6 +152,8 @@ static HRESULT Unknown_QueryInterface(InternetShortcut *This, REFIID riid, PVOID
*ppvObject = &This->uniformResourceLocatorW;
else if (IsEqualGUID(&IID_IPersistFile, riid))
*ppvObject = &This->persistFile;
+ else if (IsEqualGUID(&IID_IPropertySetStorage, riid))
+ *ppvObject = &This->IPropertySetStorage_iface;
else if (IsEqualGUID(&IID_IShellLinkA, riid))
{
FIXME("The IShellLinkA interface is not yet supported by InternetShortcut\n");
@@ -179,6 +188,7 @@ static ULONG Unknown_Release(InternetShortcut *This)
{
CoTaskMemFree(This->url);
CoTaskMemFree(This->currentFile);
+ IPropertySetStorage_Release(This->property_set_storage);
heap_free(This);
SHDOCVW_UnlockModule();
}
@@ -537,8 +547,78 @@ static HRESULT WINAPI PersistFile_GetCurFile(IPersistFile *pFile, LPOLESTR *ppsz
return hr;
}
+static HRESULT WINAPI PropertySetStorage_QueryInterface(IPropertySetStorage *iface, REFIID riid, PVOID *ppvObject)
+{
+ InternetShortcut *This = impl_from_IPropertySetStorage(iface);
+ TRACE("(%p)\n", iface);
+ return Unknown_QueryInterface(This, riid, ppvObject);
+}
+
+static ULONG WINAPI PropertySetStorage_AddRef(IPropertySetStorage *iface)
+{
+ InternetShortcut *This = impl_from_IPropertySetStorage(iface);
+ TRACE("(%p)\n", iface);
+ return Unknown_AddRef(This);
+}
+
+static ULONG WINAPI PropertySetStorage_Release(IPropertySetStorage *iface)
+{
+ InternetShortcut *This = impl_from_IPropertySetStorage(iface);
+ TRACE("(%p)\n", iface);
+ return Unknown_Release(This);
+}
+
+static HRESULT WINAPI PropertySetStorage_Create(
+ IPropertySetStorage* iface,
+ REFFMTID rfmtid,
+ const CLSID *pclsid,
+ DWORD grfFlags,
+ DWORD grfMode,
+ IPropertyStorage **ppprstg)
+{
+ InternetShortcut *This = impl_from_IPropertySetStorage(iface);
+ TRACE("(%s, %p, 0x%x, 0x%x, %p)\n", debugstr_guid(rfmtid), pclsid, grfFlags, grfMode, ppprstg);
+
+ return IPropertySetStorage_Create(This->property_set_storage,
+ rfmtid,
+ pclsid,
+ grfFlags,
+ grfMode,
+ ppprstg);
+}
+
+static HRESULT WINAPI PropertySetStorage_Open(
+ IPropertySetStorage* iface,
+ REFFMTID rfmtid,
+ DWORD grfMode,
+ IPropertyStorage **ppprstg)
+{
+ InternetShortcut *This = impl_from_IPropertySetStorage(iface);
+ TRACE("(%s, 0x%x, %p)\n", debugstr_guid(rfmtid), grfMode, ppprstg);
+
+ /* Note: The |STGM_SHARE_EXCLUSIVE is to cope with a bug in the implementation. Should be fixed in ole32. */
+ return IPropertySetStorage_Open(This->property_set_storage,
+ rfmtid,
+ grfMode|STGM_SHARE_EXCLUSIVE,
+ ppprstg);
+}
+
+static HRESULT WINAPI PropertySetStorage_Delete(IPropertySetStorage *iface, REFFMTID rfmtid)
+{
+ InternetShortcut *This = impl_from_IPropertySetStorage(iface);
+ TRACE("(%s)\n", debugstr_guid(rfmtid));
+ return IPropertySetStorage_Delete(This->property_set_storage,
+ rfmtid);
+}
+
+static HRESULT WINAPI PropertySetStorage_Enum(IPropertySetStorage *iface, IEnumSTATPROPSETSTG **ppenum)
+{
+ FIXME("(%p): stub\n", ppenum);
+ return E_NOTIMPL;
+}
+
static const IUniformResourceLocatorWVtbl uniformResourceLocatorWVtbl = {
UniformResourceLocatorW_QueryInterface,
UniformResourceLocatorW_AddRef,
@@ -569,6 +649,16 @@ static const IPersistFileVtbl persistFileVtbl = {
PersistFile_GetCurFile
};
+static const IPropertySetStorageVtbl propertySetStorageVtbl = {
+ PropertySetStorage_QueryInterface,
+ PropertySetStorage_AddRef,
+ PropertySetStorage_Release,
+ PropertySetStorage_Create,
+ PropertySetStorage_Open,
+ PropertySetStorage_Delete,
+ PropertySetStorage_Enum
+};
+
static InternetShortcut *create_shortcut(void)
{
InternetShortcut *newshortcut;
@@ -576,10 +666,31 @@ static InternetShortcut *create_shortcut(void)
newshortcut = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(InternetShortcut));
if (newshortcut)
{
+ HRESULT hr;
+ IPropertyStorage *dummy;
+
newshortcut->uniformResourceLocatorA.lpVtbl = &uniformResourceLocatorAVtbl;
newshortcut->uniformResourceLocatorW.lpVtbl = &uniformResourceLocatorWVtbl;
newshortcut->persistFile.lpVtbl = &persistFileVtbl;
+ newshortcut->IPropertySetStorage_iface.lpVtbl = &propertySetStorageVtbl;
newshortcut->refCount = 0;
+ hr = StgCreateStorageEx(NULL, STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, STGFMT_STORAGE, 0, NULL, NULL, &IID_IPropertySetStorage, (void **) &newshortcut->property_set_storage);
+ if FAILED(hr)
+ {
+ TRACE("Failed to create the storage object needed for the shortcut.\n");
+ heap_free(newshortcut);
+ return NULL;
+ }
+
+ hr = IPropertySetStorage_Create(newshortcut->property_set_storage, &FMTID_Intshcut, NULL, PROPSETFLAG_DEFAULT, STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, &dummy);
+ if FAILED(hr)
+ {
+ TRACE("Failed to create the property object needed for the shortcut.\n");
+ IPropertySetStorage_Release(newshortcut->property_set_storage);
+ heap_free(newshortcut);
+ return NULL;
+ }
+ IPropertySetStorage_Release(dummy);
}
return newshortcut;
More information about the wine-cvs
mailing list