Michael Karcher : oleaut32: Implement IPropertyBag::Read proxying.
Alexandre Julliard
julliard at winehq.org
Sun Jan 4 09:09:01 CST 2009
Module: wine
Branch: master
Commit: a16b79cf725f91ffa76d593cbfd21cac1336016c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a16b79cf725f91ffa76d593cbfd21cac1336016c
Author: Michael Karcher <wine at mkarcher.dialup.fu-berlin.de>
Date: Sun Jan 4 00:20:05 2009 +0100
oleaut32: Implement IPropertyBag::Read proxying.
---
dlls/oleaut32/usrmarshal.c | 72 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 85faac4..2811fcf 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -2017,8 +2017,35 @@ HRESULT CALLBACK IPropertyBag_Read_Proxy(
VARIANT *pVar,
IErrorLog *pErrorLog)
{
- FIXME("not implemented\n");
- return E_FAIL;
+ IUnknown *pUnk = NULL;
+ TRACE("(%p, %s, %p, %p)\n", This, debugstr_w(pszPropName), pVar, pErrorLog);
+
+ if(!pVar)
+ return E_POINTER;
+
+ if(V_VT(pVar) & (VT_BYREF | VT_ARRAY | VT_VECTOR))
+ {
+ FIXME("Variant type %x is byref, array or vector. Not implemented.\n", V_VT(pVar));
+ return E_NOTIMPL;
+ }
+
+ switch(V_VT(pVar))
+ {
+ case VT_DISPATCH:
+ pUnk = (IUnknown*)V_DISPATCH(pVar);
+ break;
+ case VT_UNKNOWN:
+ pUnk = V_UNKNOWN(pVar);
+ break;
+ case VT_SAFEARRAY:
+ FIXME("Safearray support not yet implemented.\n");
+ return E_NOTIMPL;
+ default:
+ break;
+ }
+
+ return IPropertyBag_RemoteRead_Proxy(This, pszPropName, pVar, pErrorLog,
+ V_VT(pVar), pUnk);
}
HRESULT __RPC_STUB IPropertyBag_Read_Stub(
@@ -2029,8 +2056,45 @@ HRESULT __RPC_STUB IPropertyBag_Read_Stub(
DWORD varType,
IUnknown *pUnkObj)
{
- FIXME("not implemented\n");
- return E_FAIL;
+ static const WCHAR emptyWstr[1] = {0};
+ IDispatch *disp;
+ HRESULT hr;
+ TRACE("(%p, %s, %p, %p, %x, %p)\n", This, debugstr_w(pszPropName), pVar,
+ pErrorLog, varType, pUnkObj);
+
+ if(varType & (VT_BYREF | VT_ARRAY | VT_VECTOR))
+ {
+ FIXME("Variant type %x is byref, array or vector. Not implemented.\n", V_VT(pVar));
+ return E_NOTIMPL;
+ }
+
+ V_VT(pVar) = varType;
+ switch(varType)
+ {
+ case VT_DISPATCH:
+ hr = IUnknown_QueryInterface(pUnkObj, &IID_IDispatch, (LPVOID*)&disp);
+ if(FAILED(hr))
+ return hr;
+ IUnknown_Release(pUnkObj);
+ V_DISPATCH(pVar) = disp;
+ break;
+ case VT_UNKNOWN:
+ V_UNKNOWN(pVar) = pUnkObj;
+ break;
+ case VT_BSTR:
+ V_BSTR(pVar) = SysAllocString(emptyWstr);
+ break;
+ case VT_SAFEARRAY:
+ FIXME("Safearray support not yet implemented.\n");
+ return E_NOTIMPL;
+ default:
+ break;
+ }
+ hr = IPropertyBag_Read(This, pszPropName, pVar, pErrorLog);
+ if(FAILED(hr))
+ VariantClear(pVar);
+
+ return hr;
}
/* call_as/local stubs for ocidl.idl */
More information about the wine-cvs
mailing list