Module: wine Branch: master Commit: b421934ead029328fa3307c09ce2798aea18d263 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b421934ead029328fa3307c09c...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Dec 31 02:26:30 2010 +0300
oleaut32: Implement ICreateTypeInfo2::SetVarDocString().
---
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; }
/******************************************************************************