Aric Stewart : shlwapi: Implement SHPropertyBag_ReadLONG.
Alexandre Julliard
julliard at winehq.org
Tue Dec 15 09:40:16 CST 2009
Module: wine
Branch: master
Commit: 0a59c65e74038698eb84cbc8f855cf91888e4c7e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0a59c65e74038698eb84cbc8f855cf91888e4c7e
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon Dec 14 12:53:45 2009 -0600
shlwapi: Implement SHPropertyBag_ReadLONG.
---
dlls/shlwapi/ordinal.c | 32 ++++++++++++
dlls/shlwapi/shlwapi.spec | 2 +-
dlls/shlwapi/tests/ordinal.c | 115 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 148 insertions(+), 1 deletions(-)
diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index 223e4a8..3098af4 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -4752,3 +4752,35 @@ HRESULT WINAPI IUnknown_QueryServiceForWebBrowserApp(IUnknown* lpUnknown,
FIXME("%p %s %p semi-STUB\n", lpUnknown, debugstr_guid(riid), lppOut);
return IUnknown_QueryService(lpUnknown,&IID_IWebBrowserApp,riid,lppOut);
}
+
+/**************************************************************************
+ * SHPropertyBag_ReadLONG (SHLWAPI.496)
+ *
+ * This function asks a property bag to read a named property as a LONG.
+ *
+ * PARAMS
+ * ppb: a IPropertyBag interface
+ * pszPropName: Unicode string that names the property
+ * pValue: address to receive the property value as a 32-bit signed integer
+ *
+ * RETURNS
+ * 0 for Success
+ */
+BOOL WINAPI SHPropertyBag_ReadLONG(IPropertyBag *ppb, LPCWSTR pszPropName, LPLONG pValue)
+{
+ VARIANT var;
+ HRESULT hr;
+ TRACE("%p %s %p\n", ppb,debugstr_w(pszPropName),pValue);
+ if (!pszPropName || !ppb || !pValue)
+ return E_INVALIDARG;
+ V_VT(&var) = VT_I4;
+ hr = IPropertyBag_Read(ppb, pszPropName, &var, NULL);
+ if (SUCCEEDED(hr))
+ {
+ if (V_VT(&var) == VT_I4)
+ *pValue = V_I4(&var);
+ else
+ hr = DISP_E_BADVARTYPE;
+ }
+ return hr;
+}
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index 3a962eb..165a50c 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -493,7 +493,7 @@
493 stub -noname SHPropertyBag_ReadType
494 stub -noname SHPropertyBag_ReadStr
495 stub -noname SHPropertyBag_WriteStr
-496 stub -noname SHPropertyBag_ReadLONG
+496 stdcall -noname SHPropertyBag_ReadLONG(ptr wstr ptr)
497 stub -noname SHPropertyBag_WriteLONG
498 stub -noname SHPropertyBag_ReadBOOLOld
499 stub -noname SHPropertyBag_WriteBOOL
diff --git a/dlls/shlwapi/tests/ordinal.c b/dlls/shlwapi/tests/ordinal.c
index 8f95797..ac1a223 100644
--- a/dlls/shlwapi/tests/ordinal.c
+++ b/dlls/shlwapi/tests/ordinal.c
@@ -41,6 +41,7 @@ static HRESULT(WINAPIV *pSHPackDispParams)(DISPPARAMS*,VARIANTARG*,UINT,...);
static HRESULT(WINAPI *pIConnectionPoint_SimpleInvoke)(IConnectionPoint*,DISPID,DISPPARAMS*);
static HRESULT(WINAPI *pIConnectionPoint_InvokeWithCancel)(IConnectionPoint*,DISPID,DISPPARAMS*,DWORD,DWORD);
static HRESULT(WINAPI *pConnectToConnectionPoint)(IUnknown*,REFIID,BOOL,IUnknown*, LPDWORD,IConnectionPoint **);
+static HRESULT(WINAPI *pSHPropertyBag_ReadLONG)(IPropertyBag *,LPCWSTR,LPLONG);
static void test_GetAcceptLanguagesA(void)
{ HRESULT retval;
@@ -1205,6 +1206,118 @@ static void test_IConnectionPoint(void)
ok(ref == 0, "leftover IDispatch reference %i\n",ref);
}
+typedef struct _propbag
+{
+ const IPropertyBagVtbl *vtbl;
+ LONG refCount;
+
+} PropBag;
+
+
+static HRESULT WINAPI Prop_QueryInterface(
+ IPropertyBag* This,
+ REFIID riid,
+ void **ppvObject)
+{
+ trace("\n");
+ *ppvObject = NULL;
+
+ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IPropertyBag))
+ {
+ *ppvObject = This;
+ }
+
+ if (*ppvObject)
+ {
+ IUnknown_AddRef(This);
+ return S_OK;
+ }
+
+ trace("no interface\n");
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI Prop_AddRef(
+ IPropertyBag* This)
+{
+ PropBag *iface = (PropBag*)This;
+ return InterlockedIncrement(&iface->refCount);
+}
+
+static ULONG WINAPI Prop_Release(
+ IPropertyBag* This)
+{
+ PropBag *iface = (PropBag*)This;
+ ULONG ret;
+
+ ret = InterlockedDecrement(&iface->refCount);
+ if (ret == 0)
+ HeapFree(GetProcessHeap(),0,This);
+ return ret;
+}
+
+static HRESULT WINAPI Prop_Read(
+ IPropertyBag* This,
+ LPCOLESTR pszPropName,
+ VARIANT *pVar,
+ IErrorLog *pErrorLog)
+{
+ V_VT(pVar) = VT_BLOB|VT_BYREF;
+ V_BYREF(pVar) = (LPVOID)0xdeadcafe;
+ return S_OK;
+}
+
+static HRESULT WINAPI Prop_Write(
+ IPropertyBag* This,
+ LPCOLESTR pszPropName,
+ VARIANT *pVar)
+{
+ return S_OK;
+}
+
+
+static const IPropertyBagVtbl prop_vtbl = {
+ Prop_QueryInterface,
+ Prop_AddRef,
+ Prop_Release,
+
+ Prop_Read,
+ Prop_Write
+};
+
+static void test_SHPropertyBag_ReadLONG(void)
+{
+ PropBag *pb;
+ HRESULT rc;
+ LONG out;
+ static const WCHAR szName1[] = {'n','a','m','e','1',0};
+
+ if (!pSHPropertyBag_ReadLONG)
+ {
+ win_skip("SHPropertyBag_ReadLONG not present\n");
+ return;
+ }
+
+ pb = HeapAlloc(GetProcessHeap(),0,sizeof(PropBag));
+ pb->refCount = 1;
+ pb->vtbl = &prop_vtbl;
+
+ out = 0xfeedface;
+ rc = pSHPropertyBag_ReadLONG(NULL, szName1, &out);
+ ok(rc == E_INVALIDARG || broken(rc == 0), "incorrect return %x\n",rc);
+ ok(out == 0xfeedface, "value should not have changed\n");
+ rc = pSHPropertyBag_ReadLONG((IPropertyBag*)pb, NULL, &out);
+ ok(rc == E_INVALIDARG || broken(rc == 0) || broken(rc == 1), "incorrect return %x\n",rc);
+ ok(out == 0xfeedface, "value should not have changed\n");
+ rc = pSHPropertyBag_ReadLONG((IPropertyBag*)pb, szName1, NULL);
+ ok(rc == E_INVALIDARG || broken(rc == 0) || broken(rc == 1), "incorrect return %x\n",rc);
+ ok(out == 0xfeedface, "value should not have changed\n");
+ rc = pSHPropertyBag_ReadLONG((IPropertyBag*)pb, szName1, &out);
+ ok(rc == DISP_E_BADVARTYPE || broken(rc == 0) || broken(rc == 1), "incorrect return %x\n",rc);
+ ok(out == 0xfeedface || broken(out == 0xfeedfa00), "value should not have changed %x\n",out);
+ IUnknown_Release((IUnknown*)pb);
+}
+
START_TEST(ordinal)
{
hShlwapi = GetModuleHandleA("shlwapi.dll");
@@ -1219,6 +1332,7 @@ START_TEST(ordinal)
pIConnectionPoint_SimpleInvoke=(void*)GetProcAddress(hShlwapi,(char*)284);
pIConnectionPoint_InvokeWithCancel=(void*)GetProcAddress(hShlwapi,(char*)283);
pConnectToConnectionPoint=(void*)GetProcAddress(hShlwapi,(char*)168);
+ pSHPropertyBag_ReadLONG=(void*)GetProcAddress(hShlwapi,(char*)496);
test_GetAcceptLanguagesA();
test_SHSearchMapInt();
@@ -1227,4 +1341,5 @@ START_TEST(ordinal)
test_GetShellSecurityDescriptor();
test_SHPackDispParams();
test_IConnectionPoint();
+ test_SHPropertyBag_ReadLONG();
}
More information about the wine-cvs
mailing list