From a16b79cf725f91ffa76d593cbfd21cac1336016c Mon Sep 17 00:00:00 2001 From: Michael Karcher Date: Sun, 4 Jan 2009 00:20:05 +0100 Subject: [PATCH] oleaut32: Implement IPropertyBag::Read proxying. --- dlls/oleaut32/usrmarshal.c | 72 +++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c index 85faac4646..2811fcfb87 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 */ -- 2.32.0.93.g670b81a890