Piotr Caban : oleaut32: Improved ICreateTypeInfo2_SetFuncAndParamNames implementation.

Alexandre Julliard julliard at winehq.org
Tue Feb 23 11:17:21 CST 2010


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Feb 22 23:13:42 2010 +0100

oleaut32: Improved ICreateTypeInfo2_SetFuncAndParamNames implementation.

---

 dlls/oleaut32/tests/typelib.c |   27 +++++++++++++++++++++++
 dlls/oleaut32/typelib2.c      |   48 ++++++++++++++++++++++++++++------------
 2 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 523f33c..b391866 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -971,6 +971,12 @@ if(use_midl_tlb) {
 static void test_CreateTypeLib(void) {
     static OLECHAR interface1W[] = {'i','n','t','e','r','f','a','c','e','1',0};
     static WCHAR defaultW[] = {'d','e','f','a','u','l','t',0x3213,0};
+    static OLECHAR func1W[] = {'f','u','n','c','1',0};
+    static OLECHAR func2W[] = {'f','u','n','c','2',0};
+    static OLECHAR param1W[] = {'p','a','r','a','m','1',0};
+    static OLECHAR param2W[] = {'p','a','r','a','m','2',0};
+    static OLECHAR *names1[] = {func1W, param1W, param2W};
+    static OLECHAR *names2[] = {func2W, param1W, param2W};
 
     char filename[MAX_PATH];
     WCHAR filenameW[MAX_PATH];
@@ -1083,6 +1089,27 @@ static void test_CreateTypeLib(void) {
     hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
     ok(hres == S_OK, "got %08x\n", hres);
 
+    hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1000, NULL, 1);
+    ok(hres == E_INVALIDARG, "got %08x\n", hres);
+
+    hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1000, names1, 1);
+    ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
+
+    hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 2);
+    ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
+
+    hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names2, 1);
+    ok(hres == S_OK, "got %08x\n", hres);
+
+    hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 1);
+    ok(hres == S_OK, "got %08x\n", hres);
+
+    hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 3, names2, 3);
+    ok(hres == S_OK, "got %08x\n", hres);
+
+    hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 3, names1, 3);
+    ok(hres == TYPE_E_AMBIGUOUSNAME, "got %08x\n", hres);
+
     ICreateTypeInfo_Release(createti);
 
     hres = ICreateTypeLib_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index f392c1d..907eae1 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -1914,32 +1914,50 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(
         UINT cNames)
 {
     ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
-
-    CyclicList *iter;
-    UINT i;
-    int offset;
+    CyclicList *iter = NULL, *iter2;
+    int offset, len, i=0;
     char *namedata;
 
-    FIXME("(%p,%d,%s,%d), stub!\n", iface, index, debugstr_w(*rgszNames), cNames);
+    TRACE("(%p %d %p %d)\n", iface, index, rgszNames, cNames);
 
-    offset = ctl2_alloc_name(This->typelib, rgszNames[0]);
+    if(!rgszNames)
+        return E_INVALIDARG;
 
-    namedata = This->typelib->typelib_segment_data[MSFT_SEG_NAME] + offset;
-    namedata[9] &= ~0x10;
-    if (*((INT *)namedata) == -1) {
-	*((INT *)namedata) = This->typelib->typelib_typeinfo_offsets[This->typeinfo->typekind >> 16];
+    if(index >= This->typeinfo->cElement || !cNames)
+        return TYPE_E_ELEMENTNOTFOUND;
+
+    len = ctl2_encode_name(This->typelib, rgszNames[0], &namedata);
+    for(iter2=This->typedata->next->next; iter2!=This->typedata->next; iter2=iter2->next) {
+        if(i == index)
+            iter = iter2;
+        else if(iter2->name!=-1 && !memcmp(namedata,
+                    This->typelib->typelib_segment_data[MSFT_SEG_NAME]+iter2->name+8, len))
+            return TYPE_E_AMBIGUOUSNAME;
+
+        i++;
     }
 
-    iter = This->typedata->next->next;
-    for(i=0; i<index; i++)
-        iter = iter->next;
+    /* cNames == cParams for put or putref accessor, cParams+1 otherwise */
+    if(cNames != iter->u.data[5] + ((iter->u.data[4]>>3)&(INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF) ? 0 : 1))
+        return TYPE_E_ELEMENTNOTFOUND;
+
+    offset = ctl2_alloc_name(This->typelib, rgszNames[0]);
+    if(offset == -1)
+        return E_OUTOFMEMORY;
 
     iter->name = offset;
 
+    namedata = This->typelib->typelib_segment_data[MSFT_SEG_NAME] + offset;
+    *((INT *)namedata) = This->typelib->typelib_typeinfo_offsets[This->typeinfo->typekind >> 16];
+
+    if(iter->u.data[4]&0x1000)
+        len = iter->u.data[5];
+    else
+        len = 0;
+
     for (i = 1; i < cNames; i++) {
-	/* FIXME: Almost certainly easy to break */
 	offset = ctl2_alloc_name(This->typelib, rgszNames[i]);
-	iter->u.data[(i * 3) + 5] = offset;
+	iter->u.data[(i*3) + 4 + len] = offset;
     }
 
     return S_OK;




More information about the wine-cvs mailing list