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