Andrew Eikum : oleaut32: Implement ICreateTypeInfo::AddVarDesc.

Alexandre Julliard julliard at winehq.org
Mon Jun 3 16:06:31 CDT 2013


Module: wine
Branch: master
Commit: 205671f355ccb33914fa48a5d247b438f44d8677
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=205671f355ccb33914fa48a5d247b438f44d8677

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Fri May 31 15:06:34 2013 -0500

oleaut32: Implement ICreateTypeInfo::AddVarDesc.

---

 dlls/oleaut32/typelib.c |   56 +++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index d52d461..77c68ab 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1734,7 +1734,12 @@ static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeInfoImpl **typeinfos,
     return NULL;
 }
 
-static TLBVarDesc *TLBVarDesc_Constructor(UINT n)
+static void TLBVarDesc_Constructor(TLBVarDesc *var_desc)
+{
+    list_init(&var_desc->custdata_list);
+}
+
+static TLBVarDesc *TLBVarDesc_Alloc(UINT n)
 {
     TLBVarDesc *ret;
 
@@ -1743,7 +1748,7 @@ static TLBVarDesc *TLBVarDesc_Constructor(UINT n)
         return NULL;
 
     while(n){
-        list_init(&ret[n-1].custdata_list);
+        TLBVarDesc_Constructor(&ret[n-1]);
         --n;
     }
 
@@ -2451,7 +2456,7 @@ static void MSFT_DoVars(TLBContext *pcx, ITypeInfoImpl *pTI, int cFuncs,
 
     TRACE_(typelib)("\n");
 
-    ptvd = *pptvd = TLBVarDesc_Constructor(cVars);
+    ptvd = *pptvd = TLBVarDesc_Alloc(cVars);
     MSFT_ReadLEDWords(&infolen,sizeof(INT), pcx, offset);
     MSFT_ReadLEDWords(&recoffset,sizeof(INT), pcx, offset + infolen +
                       ((cFuncs+cVars)*2+cFuncs + 1)*sizeof(INT));
@@ -3876,7 +3881,7 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
   unsigned short i;
   WORD *pType;
 
-  pVarDesc = pTI->vardescs = TLBVarDesc_Constructor(cVars);
+  pVarDesc = pTI->vardescs = TLBVarDesc_Alloc(cVars);
 
   for(pItem = (SLTG_Variable *)pFirstItem, i = 0; i < cVars;
       pItem = (SLTG_Variable *)(pBlk + pItem->next), i++, ++pVarDesc) {
@@ -9113,8 +9118,47 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(ICreateTypeInfo2 *iface,
         UINT index, VARDESC *varDesc)
 {
     ITypeInfoImpl *This = info_impl_from_ICreateTypeInfo2(iface);
-    FIXME("%p %u %p - stub\n", This, index, varDesc);
-    return E_NOTIMPL;
+    TLBVarDesc *var_desc;
+
+    TRACE("%p %u %p\n", This, index, varDesc);
+
+    if (This->vardescs){
+        UINT i;
+
+        This->vardescs = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->vardescs,
+                sizeof(TLBVarDesc) * (This->cVars + 1));
+
+        if (index < This->cVars) {
+            memmove(This->vardescs + index + 1, This->vardescs + index,
+                    (This->cVars - index) * sizeof(TLBVarDesc));
+            var_desc = This->vardescs + index;
+        } else
+            var_desc = This->vardescs + This->cVars;
+
+        /* move custdata lists to the new memory location */
+        for(i = 0; i < This->cVars + 1; ++i){
+            if(index != i){
+                TLBVarDesc *var = &This->vardescs[i];
+                if(var->custdata_list.prev == var->custdata_list.next)
+                    list_init(&var->custdata_list);
+                else{
+                    var->custdata_list.prev->next = &var->custdata_list;
+                    var->custdata_list.next->prev = &var->custdata_list;
+                }
+            }
+        }
+    } else
+        var_desc = This->vardescs = heap_alloc(sizeof(TLBVarDesc));
+
+    memset(var_desc, 0, sizeof(TLBVarDesc));
+    TLBVarDesc_Constructor(var_desc);
+    var_desc->vardesc = *varDesc;
+
+    ++This->cVars;
+
+    This->needs_layout = TRUE;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(ICreateTypeInfo2 *iface,




More information about the wine-cvs mailing list