Huw Davies : oleaut32: Implement GetTypeAttr_Proxy and friends.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 5 12:10:20 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 32a626fdbdd70a3bbc9c7622317683ddb17aa1e6
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=32a626fdbdd70a3bbc9c7622317683ddb17aa1e6

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Apr 28 14:42:43 2006 +0100

oleaut32: Implement GetTypeAttr_Proxy and friends.

---

 dlls/oleaut32/usrmarshal.c |   68 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 61 insertions(+), 7 deletions(-)

diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index c090186..b9149f9 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -1166,6 +1166,41 @@ HRESULT __RPC_STUB IEnumVARIANT_Next_Stu
   return hr;
 }
 
+/* TypeInfo related freers */
+
+static void free_embedded_typedesc(TYPEDESC *tdesc);
+static void free_embedded_arraydesc(ARRAYDESC *adesc)
+{
+    switch(adesc->tdescElem.vt)
+    {
+    case VT_PTR:
+    case VT_SAFEARRAY:
+        free_embedded_typedesc(adesc->tdescElem.u.lptdesc);
+        CoTaskMemFree(adesc->tdescElem.u.lptdesc);
+        break;
+    case VT_CARRAY:
+        free_embedded_arraydesc(adesc->tdescElem.u.lpadesc);
+        CoTaskMemFree(adesc->tdescElem.u.lpadesc);
+        break;
+    }
+}
+
+static void free_embedded_typedesc(TYPEDESC *tdesc)
+{
+    switch(tdesc->vt)
+    {
+    case VT_PTR:
+    case VT_SAFEARRAY:
+        free_embedded_typedesc(tdesc->u.lptdesc);
+        CoTaskMemFree(tdesc->u.lptdesc);
+        break;
+    case VT_CARRAY:
+        free_embedded_arraydesc(tdesc->u.lpadesc);
+        CoTaskMemFree(tdesc->u.lpadesc);
+        break;
+    }
+}
+
 /* ITypeComp */
 
 HRESULT CALLBACK ITypeComp_Bind_Proxy(
@@ -1223,9 +1258,16 @@ HRESULT __RPC_STUB ITypeComp_BindType_St
 HRESULT CALLBACK ITypeInfo_GetTypeAttr_Proxy(
     ITypeInfo* This,
     TYPEATTR** ppTypeAttr)
+
 {
-  FIXME("not implemented\n");
-  return E_FAIL;
+    CLEANLOCALSTORAGE stg;
+    TRACE("(%p, %p)\n", This, ppTypeAttr);
+
+    stg.flags = 0;
+    stg.pStorage = NULL;
+    stg.pInterface = NULL;
+
+    return ITypeInfo_RemoteGetTypeAttr_Proxy(This, ppTypeAttr, &stg);
 }
 
 HRESULT __RPC_STUB ITypeInfo_GetTypeAttr_Stub(
@@ -1233,8 +1275,18 @@ HRESULT __RPC_STUB ITypeInfo_GetTypeAttr
     LPTYPEATTR* ppTypeAttr,
     CLEANLOCALSTORAGE* pDummy)
 {
-  FIXME("not implemented\n");
-  return E_FAIL;
+    HRESULT hr;
+    TRACE("(%p, %p)\n", This, ppTypeAttr);
+
+    hr = ITypeInfo_GetTypeAttr(This, ppTypeAttr);
+    if(hr != S_OK)
+        return hr;
+
+    pDummy->flags = CLS_TYPEATTR;
+    ITypeInfo_AddRef(This);
+    pDummy->pInterface = (IUnknown*)This;
+    pDummy->pStorage = ppTypeAttr;
+    return hr;
 }
 
 HRESULT CALLBACK ITypeInfo_GetFuncDesc_Proxy(
@@ -1459,14 +1511,16 @@ void CALLBACK ITypeInfo_ReleaseTypeAttr_
     ITypeInfo* This,
     TYPEATTR* pTypeAttr)
 {
-  FIXME("not implemented\n");
+    TRACE("(%p, %p)\n", This, pTypeAttr);
+    free_embedded_typedesc(&pTypeAttr->tdescAlias);
+    CoTaskMemFree(pTypeAttr);
 }
 
 HRESULT __RPC_STUB ITypeInfo_ReleaseTypeAttr_Stub(
     ITypeInfo* This)
 {
-  FIXME("not implemented\n");
-  return E_FAIL;
+    TRACE("nothing to do\n");
+    return S_OK;
 }
 
 void CALLBACK ITypeInfo_ReleaseFuncDesc_Proxy(




More information about the wine-cvs mailing list