[PATCH 6/6] oleaut32: Implement ICreateTypeInfo::SetVarName

Andrew Eikum aeikum at codeweavers.com
Fri Aug 16 14:40:34 CDT 2013


---
 dlls/oleaut32/tests/typelib.c | 44 +++++++++++++++++++++++++++++++++++++++++--
 dlls/oleaut32/typelib.c       | 17 +++++++++++++++--
 2 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index a1569f8..372f4f9 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -4206,13 +4206,15 @@ 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};
+    static OLECHAR varW[] = {'v','a','r',0};
+    static OLECHAR var2W[] = {'v','a','r','2',0};
     CHAR filenameA[MAX_PATH];
     WCHAR filenameW[MAX_PATH];
     ICreateTypeLib2 *ctl;
     ICreateTypeInfo *cti;
     ITypeLib *tl;
     ITypeInfo *ti;
-    BSTR docstr;
+    BSTR docstr, name;
     VARDESC desc, *pdesc;
     HRESULT hr;
     VARIANT v;
@@ -4257,6 +4259,25 @@ static void test_SetVarDocString(void)
     hr = ICreateTypeInfo_SetVarDocString(cti, 1, doc1W);
     ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hr);
 
+    hr = ICreateTypeInfo_SetVarName(cti, 0, NULL);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarName(cti, 0, varW);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarName(cti, 1, varW);
+    ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hr);
+
+    V_INT(&v) = 2;
+    hr = ICreateTypeInfo_AddVarDesc(cti, 1, &desc);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarName(cti, 1, varW);
+    ok(hr == TYPE_E_AMBIGUOUSNAME, "got %08x\n", hr);
+
+    hr = ICreateTypeInfo_SetVarName(cti, 1, var2W);
+    ok(hr == S_OK, "got %08x\n", hr);
+
     ICreateTypeInfo_Release(cti);
 
     hr = ICreateTypeLib2_SaveAllChanges(ctl);
@@ -4278,11 +4299,30 @@ static void test_SetVarDocString(void)
     ok(V_VT(U(pdesc)->lpvarValue) == VT_INT, "got wrong value type: %u\n", V_VT(U(pdesc)->lpvarValue));
     ok(V_INT(U(pdesc)->lpvarValue) == 1, "got wrong value: 0x%x\n", V_INT(U(pdesc)->lpvarValue));
 
-    hr = ITypeInfo_GetDocumentation(ti, pdesc->memid, NULL, &docstr, NULL, NULL);
+    hr = ITypeInfo_GetDocumentation(ti, pdesc->memid, &name, &docstr, NULL, NULL);
     ok(hr == S_OK, "got %08x\n", hr);
     ok(memcmp(docstr, doc2W, sizeof(doc2W)) == 0, "got wrong docstring: %s\n", wine_dbgstr_w(docstr));
+    ok(memcmp(name, varW, sizeof(varW)) == 0, "got wrong name: %s\n", wine_dbgstr_w(name));
 
     SysFreeString(docstr);
+    SysFreeString(name);
+    ITypeInfo_ReleaseVarDesc(ti, pdesc);
+
+    hr = ITypeInfo_GetVarDesc(ti, 1, &pdesc);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(pdesc->memid == 0x40000001, "got wrong memid: %x\n", pdesc->memid);
+    ok(pdesc->elemdescVar.tdesc.vt == VT_INT, "got wrong vardesc type: %u\n", pdesc->elemdescVar.tdesc.vt);
+    ok(pdesc->varkind == VAR_CONST, "got wrong varkind: %u\n", pdesc->varkind);
+    ok(V_VT(U(pdesc)->lpvarValue) == VT_INT, "got wrong value type: %u\n", V_VT(U(pdesc)->lpvarValue));
+    ok(V_INT(U(pdesc)->lpvarValue) == 2, "got wrong value: 0x%x\n", V_INT(U(pdesc)->lpvarValue));
+
+    hr = ITypeInfo_GetDocumentation(ti, pdesc->memid, &name, &docstr, NULL, NULL);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(docstr == NULL, "got wrong docstring: %s\n", wine_dbgstr_w(docstr));
+    ok(memcmp(name, var2W, sizeof(varW)) == 0, "got wrong name: %s\n", wine_dbgstr_w(name));
+
+    SysFreeString(docstr);
+    SysFreeString(name);
 
     ITypeInfo_ReleaseVarDesc(ti, pdesc);
     ITypeInfo_Release(ti);
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 2caa0ec..c8ae3e7 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -10533,8 +10533,21 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetVarName(ICreateTypeInfo2 *iface,
         UINT index, LPOLESTR name)
 {
     ITypeInfoImpl *This = info_impl_from_ICreateTypeInfo2(iface);
-    FIXME("%p %u %s - stub\n", This, index, wine_dbgstr_w(name));
-    return E_NOTIMPL;
+
+    TRACE("%p %u %s\n", This, index, wine_dbgstr_w(name));
+
+    if(!name)
+        return E_INVALIDARG;
+
+    if(index >= This->cVars)
+        return TYPE_E_ELEMENTNOTFOUND;
+
+    if(TLB_get_vardesc_by_name(This->vardescs, This->cVars, name))
+        return TYPE_E_AMBIGUOUSNAME;
+
+    This->vardescs[index].Name = TLB_append_str(&This->pTypeLib->name_list, name);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI ICreateTypeInfo2_fnSetTypeDescAlias(ICreateTypeInfo2 *iface,
-- 
1.8.3.4




More information about the wine-patches mailing list