mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
oleaut32: Implement ITypeInfo::GetDocumentation.
This commit is contained in:
parent
636e35d8ad
commit
57c784e205
2 changed files with 124 additions and 6 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue