Andrey Turkin : oleaut32: Implement ITypeInfo::GetDocumentation.
Alexandre Julliard
julliard at winehq.org
Mon May 17 09:39:31 CDT 2010
Module: wine
Branch: master
Commit: 57c784e205609343dba274c9f123da9c414a0c20
URL: http://source.winehq.org/git/wine.git/?a=commit;h=57c784e205609343dba274c9f123da9c414a0c20
Author: Andrey Turkin <andrey.turkin at gmail.com>
Date: Mon May 17 02:27:14 2010 +0400
oleaut32: Implement ITypeInfo::GetDocumentation.
---
dlls/oleaut32/tests/typelib.c | 49 +++++++++++++++++++++++--
dlls/oleaut32/typelib2.c | 81 +++++++++++++++++++++++++++++++++++++++--
2 files changed, 124 insertions(+), 6 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index f0f577a..a081163 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -973,6 +973,7 @@ if(use_midl_tlb) {
static void test_CreateTypeLib(void) {
static const WCHAR stdoleW[] = {'s','t','d','o','l','e','2','.','t','l','b',0};
static OLECHAR typelibW[] = {'t','y','p','e','l','i','b',0};
+ static OLECHAR helpfileW[] = {'C',':','\\','b','o','g','u','s','.','h','l','p',0};
static OLECHAR interface1W[] = {'i','n','t','e','r','f','a','c','e','1',0};
static OLECHAR interface2W[] = {'i','n','t','e','r','f','a','c','e','2',0};
static OLECHAR interface3W[] = {'i','n','t','e','r','f','a','c','e','3',0};
@@ -1052,16 +1053,19 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeLib_SetName(createtl, typelibW);
ok(hres == S_OK, "got %08x\n", hres);
+ hres = ICreateTypeLib_SetHelpFileName(createtl, helpfileW);
+ ok(hres == S_OK, "got %08x\n", hres);
+
hres = ITypeLib_GetDocumentation(tl, -1, NULL, NULL, NULL, NULL);
ok(hres == S_OK, "got %08x\n", hres);
- hres = ITypeLib_GetDocumentation(tl, -1, &name, NULL, NULL, NULL);
+ hres = ITypeLib_GetDocumentation(tl, -1, &name, NULL, NULL, &helpfile);
ok(hres == S_OK, "got %08x\n", hres);
ok(!memcmp(name, typelibW, sizeof(typelibW)), "name = %s\n", wine_dbgstr_w(name));
+ ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
SysFreeString(name);
-
- ITypeLib_Release(tl);
+ SysFreeString(helpfile);
hres = ICreateTypeLib_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
ok(hres == S_OK, "got %08x\n", hres);
@@ -1069,9 +1073,33 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface1);
ok(hres == S_OK, "got %08x\n", hres);
+ hres = ITypeLib_GetDocumentation(tl, 0, &name, NULL, NULL, NULL);
+ ok(hres == S_OK, "got %08x\n", hres);
+ ok(!memcmp(name, interface1W, sizeof(interface1W)), "name = %s\n", wine_dbgstr_w(name));
+
+ SysFreeString(name);
+
+ ITypeLib_Release(tl);
+
+ name = (BSTR)0xdeadbeef;
+ helpfile = (BSTR)0xdeadbeef;
+ hres = ITypeInfo_GetDocumentation(interface1, -1, &name, &docstring, &helpcontext, &helpfile);
+ ok(hres == S_OK, "got %08x\n", hres);
+ ok(!memcmp(name, interface1W, sizeof(interface1W)), "name = %s\n", wine_dbgstr_w(name));
+ ok(docstring == NULL, "docstring != NULL\n");
+ ok(helpcontext == 0, "helpcontext != 0\n");
+ ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
+
+ SysFreeString(name);
+ SysFreeString(helpfile);
+
+ hres = ITypeInfo_GetDocumentation(interface1, 0, &name, NULL, NULL, NULL);
+ ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
+
hres = ITypeInfo_GetRefTypeInfo(interface1, 0, NULL);
ok(hres == E_INVALIDARG, "got %08x\n", hres);
+
hres = ICreateTypeInfo_LayOut(createti);
ok(hres == S_OK, "got %08x\n", hres);
@@ -1212,6 +1240,15 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
ok(hres == S_OK, "got %08x\n", hres);
+ hres = ITypeInfo_GetDocumentation(interface1, 0, &name, &docstring, &helpcontext, &helpfile);
+ ok(hres == S_OK, "got %08x\n", hres);
+ ok(name == NULL, "name != NULL\n");
+ ok(docstring == NULL, "docstring != NULL\n");
+ ok(helpcontext == 0x201, "helpcontext != 0x201\n");
+ ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
+
+ SysFreeString(helpfile);
+
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1000, NULL, 1);
ok(hres == E_INVALIDARG, "got %08x\n", hres);
@@ -1227,6 +1264,12 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 1);
ok(hres == S_OK, "got %08x\n", hres);
+ hres = ITypeInfo_GetDocumentation(interface1, 0, &name, NULL, NULL, NULL);
+ ok(hres == S_OK, "got %08x\n", hres);
+ ok(!memcmp(name, func1W, sizeof(func1W)), "name = %s\n", wine_dbgstr_w(name));
+
+ SysFreeString(name);
+
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 3, names2, 3);
ok(hres == S_OK, "got %08x\n", hres);
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index 22a3a23..c870b4f 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -3163,8 +3163,83 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation(
DWORD* pdwHelpContext,
BSTR* pBstrHelpFile)
{
- FIXME("(%p,%d,%p,%p,%p,%p), stub!\n", iface, memid, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile);
- return E_OUTOFMEMORY;
+ ICreateTypeInfo2Impl *This = impl_from_ITypeInfo2(iface);
+ HRESULT status = TYPE_E_ELEMENTNOTFOUND;
+ INT nameoffset, docstringoffset, helpcontext;
+
+ TRACE("(%p,%d,%p,%p,%p,%p)\n", iface, memid, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile);
+
+ if (memid == -1)
+ {
+ nameoffset = This->typeinfo->NameOffset;
+ docstringoffset = This->typeinfo->docstringoffs;
+ helpcontext = This->typeinfo->helpcontext;
+ status = S_OK;
+ } else {
+ CyclicList *iter;
+ if (This->typedata) {
+ for(iter=This->typedata->next->next; iter!=This->typedata->next; iter=iter->next) {
+ if (iter->indice == memid) {
+ const int *typedata = iter->u.data;
+ int size = typedata[0] - typedata[5]*(typedata[4]&0x1000?16:12);
+
+ nameoffset = iter->name;
+ /* FIXME implement this once SetFuncDocString is implemented */
+ docstringoffset = -1;
+ helpcontext = (size < 7*sizeof(int)) ? 0 : typedata[6];
+
+ status = S_OK;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!status) {
+ WCHAR *string;
+ if (pBstrName) {
+ if (nameoffset == -1)
+ *pBstrName = NULL;
+ else {
+ MSFT_NameIntro *name = (MSFT_NameIntro*)&This->typelib->
+ typelib_segment_data[MSFT_SEG_NAME][nameoffset];
+ ctl2_decode_name((char*)&name->namelen, &string);
+ *pBstrName = SysAllocString(string);
+ if(!*pBstrName)
+ return E_OUTOFMEMORY;
+ }
+ }
+
+ if (pBstrDocString) {
+ if (docstringoffset == -1)
+ *pBstrDocString = NULL;
+ else {
+ MSFT_NameIntro *name = (MSFT_NameIntro*)&This->typelib->
+ typelib_segment_data[MSFT_SEG_NAME][docstringoffset];
+ ctl2_decode_name((char*)&name->namelen, &string);
+ *pBstrDocString = SysAllocString(string);
+ if(!*pBstrDocString) {
+ if (pBstrName) SysFreeString(*pBstrName);
+ return E_OUTOFMEMORY;
+ }
+ }
+ }
+
+ if (pdwHelpContext) {
+ *pdwHelpContext = helpcontext;
+ }
+
+ if (pBstrHelpFile) {
+ status = ITypeLib_GetDocumentation((ITypeLib*)&This->typelib->lpVtblTypeLib2,
+ -1, NULL, NULL, NULL, pBstrHelpFile);
+ if (status) {
+ if (pBstrName) SysFreeString(*pBstrName);
+ if (pBstrDocString) SysFreeString(*pBstrDocString);
+ }
+ }
+ }
+
+ return status;
}
/******************************************************************************
@@ -4549,7 +4624,7 @@ static HRESULT WINAPI ITypeLib2_fnGetDocumentation(
if(!iter)
return TYPE_E_ELEMENTNOTFOUND;
- return ITypeInfo_GetDocumentation((ITypeInfo*)iter->lpVtblTypeInfo2,
+ return ITypeInfo_GetDocumentation((ITypeInfo*)&iter->lpVtblTypeInfo2,
-1, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile);
}
More information about the wine-cvs
mailing list