[PATCH 4/4] Implement ICreateTypeInfo2::SetVarDocString()

Nikolay Sivov nsivov at codeweavers.com
Thu Dec 30 17:26:30 CST 2010


---
 dlls/oleaut32/tests/typelib.c |   58 +++++++++++++++++++++++++++++++++++++++++
 dlls/oleaut32/typelib2.c      |   26 +++++++++++++++---
 2 files changed, 80 insertions(+), 4 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index a5535f3..9f2257d 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -2998,6 +2998,63 @@ static void test_SetFuncAndParamNames(void)
     DeleteFileA(filenameA);
 }
 
+static void test_SetVarDocString(void)
+{
+    static OLECHAR nameW[] = {'n','a','m','e',0};
+    static OLECHAR doc1W[] = {'d','o','c','1',0};
+    static OLECHAR doc2W[] = {'d','o','c','2',0};
+    CHAR filenameA[MAX_PATH];
+    WCHAR filenameW[MAX_PATH];
+    ICreateTypeLib2 *ctl;
+    ICreateTypeInfo *cti;
+    VARDESC desc;
+    HRESULT hr;
+    VARIANT v;
+
+    GetTempFileNameA(".", "tlb", 0, filenameA);
+    MultiByteToWideChar(CP_ACP, 0, filenameA, -1, filenameW, MAX_PATH);
+
+    hr = CreateTypeLib2(SYS_WIN32, filenameW, &ctl);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ICreateTypeLib2_CreateTypeInfo(ctl, nameW, TKIND_ENUM, &cti);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarDocString(cti, 0, doc1W);
+    ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarDocString(cti, 0, NULL);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+
+    memset(&desc, 0, sizeof(desc));
+    desc.elemdescVar.tdesc.vt = VT_INT;
+    desc.varkind = VAR_CONST;
+
+    V_VT(&v) = VT_INT;
+    V_INT(&v) = 1;
+    U(desc).lpvarValue = &v;
+    hr = ICreateTypeInfo2_AddVarDesc(cti, 0, &desc);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarDocString(cti, 0, NULL);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarDocString(cti, 0, doc1W);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    /* already set */
+    hr = ICreateTypeInfo_SetVarDocString(cti, 0, doc2W);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    /* wrong index now */
+    hr = ICreateTypeInfo2_SetVarDocString(cti, 1, doc1W);
+    ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hr);
+
+    ICreateTypeInfo_Release(cti);
+    ICreateTypeLib2_Release(ctl);
+    DeleteFileA(filenameA);
+}
+
 START_TEST(typelib)
 {
     const char *filename;
@@ -3016,6 +3073,7 @@ START_TEST(typelib)
     test_CreateTypeLib();
     test_SetVarHelpContext();
     test_SetFuncAndParamNames();
+    test_SetVarDocString();
 
     if ((filename = create_test_typelib(2)))
     {
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index 6e36d69..82915a7 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -2496,15 +2496,33 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncDocString(
 static HRESULT WINAPI ICreateTypeInfo2_fnSetVarDocString(
         ICreateTypeInfo2* iface,
         UINT index,
-        LPOLESTR szDocString)
+        LPOLESTR docstring)
 {
     ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
+    CyclicList *iter;
 
-    FIXME("(%p,%d,%s), stub!\n", iface, index, debugstr_w(szDocString));
+    TRACE("(%p,%d,%s)\n", This, index, debugstr_w(docstring));
 
-    ctl2_alloc_string(This->typelib, szDocString);
+    if (!docstring) return E_INVALIDARG;
 
-    return E_OUTOFMEMORY;
+    if (cti2_get_var_count(This->typeinfo) <= index)
+	return TYPE_E_ELEMENTNOTFOUND;
+
+    for (iter = This->typedata->next->next; iter != This->typedata->next; iter = iter->next)
+       if (iter->type == CyclicListVar)
+       {
+           if (index-- == 0)
+           {
+               int offset = ctl2_alloc_string(This->typelib, docstring);
+
+               if (offset == -1) return E_OUTOFMEMORY;
+               ctl2_update_var_size(This, iter, FIELD_OFFSET(MSFT_VarRecord, res9));
+               iter->u.data[6] = offset;
+               return S_OK;
+           }
+       }
+
+    return TYPE_E_ELEMENTNOTFOUND;
 }
 
 /******************************************************************************
-- 
1.5.6.5



--------------010605040504010002030205--



More information about the wine-patches mailing list