From 6d59fbdffdfc8ac395565d8a808f36c01302f666 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Sun, 20 Aug 2006 12:44:49 +0200 Subject: [PATCH] oleview: Added functions description to idl generation. --- programs/oleview/typelib.c | 129 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 125 insertions(+), 4 deletions(-) diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c index f9b8d28ab40..d3c51099be6 100644 --- a/programs/oleview/typelib.c +++ b/programs/oleview/typelib.c @@ -69,6 +69,25 @@ static const WCHAR wszVT_VOID[] = { 'v','o','i','d','\0' }; static const WCHAR wszVT_ERROR[] = { 'S','C','O','D','E','\0' }; static const WCHAR wszVT_LPSTR[] = { 'L','P','S','T','R','\0' }; static const WCHAR wszVT_LPWSTR[] = { 'L','P','W','S','T','R','\0' }; +static const WCHAR wszVT_HRESULT[] = { 'H','R','E','S','U','L','T','\0' }; +static const WCHAR wszVT_UNKNOWN[] = { 'I','U','n','k','n','o','w','n','\0' }; +static const WCHAR wszVT_DISPATCH[] = { 'I','D','i','s','p','a','t','c','h','\0' }; +static const WCHAR wszVT_DATE[] = { 'D','A','T','E','\0' }; +static const WCHAR wszVT_R8[] = { 'd','o','u','b','l','e','\0' }; + +static const WCHAR wszStdCall[] = { '_','s','t','d','c','a','l','l','\0' }; +static const WCHAR wszPropPut[] = { 'p','r','o','p','p','u','t','\0' }; +static const WCHAR wszPropGet[] = { 'p','r','o','p','g','e','t','\0' }; +static const WCHAR wszPropPutRef[] = { 'p','r','o','p','p','u','t','r','e','f','\0' }; +static const WCHAR wszPARAMFLAG_FIN[] = { 'i','n','\0' }; +static const WCHAR wszPARAMFLAG_FOUT[] = { 'o','u','t','\0' }; +static const WCHAR wszPARAMFLAG_FLCID[] = { 'c','i','d','\0' }; +static const WCHAR wszPARAMFLAG_FRETVAL[] = { 'r','e','t','v','a','l','\0' }; +static const WCHAR wszPARAMFLAG_FOPT[] = { 'o','p','t','\0' }; +static const WCHAR wszPARAMFLAG_FHASDEFAULT[] + = { 'h','a','s','d','e','f','a','u','l','t','\0' }; +static const WCHAR wszPARAMFLAG_FHASCUSTDATA[] + = { 'h','a','s','c','u','s','t','d','a','t','a','\0' }; void AddToStrW(WCHAR *wszDest, const WCHAR *wszSource) { @@ -99,6 +118,12 @@ LPARAM InitializeTLData(void) return (LPARAM)pTLData; } +void AddSpaces(TYPELIB_DATA *pTLData, int tabSize) +{ + for(; tabSize>0; tabSize--) + AddToTLDataStrW(pTLData, wszSpace); +} + void AddChildrenData(HTREEITEM hParent, TYPELIB_DATA *pData) { HTREEITEM hCur; @@ -153,6 +178,11 @@ void CreateTypeInfo(WCHAR *wszAddTo, WCHAR *wszAddAfter, TYPEDESC tdesc, ITypeIn VTADDTOSTR(VT_ERROR); VTADDTOSTR(VT_LPSTR); VTADDTOSTR(VT_LPWSTR); + VTADDTOSTR(VT_HRESULT); + VTADDTOSTR(VT_UNKNOWN); + VTADDTOSTR(VT_DISPATCH); + VTADDTOSTR(VT_DATE); + VTADDTOSTR(VT_R8); case VT_CARRAY: for(i=0; icDims; i++) { @@ -226,12 +256,16 @@ int EnumVars(ITypeInfo *pTypeInfo, int cVars, HTREEITEM hParent) int EnumFuncs(ITypeInfo *pTypeInfo, int cFuncs, HTREEITEM hParent) { - int i; + int i, j, tabSize; + unsigned namesNo; TVINSERTSTRUCT tvis; FUNCDESC *pFuncDesc; - BSTR bstrName; + BSTR bstrName, *bstrParamNames; + WCHAR wszText[MAX_LOAD_STRING]; + WCHAR wszAfter[MAX_LOAD_STRING]; + BOOL bFirst; - U(tvis).item.mask = TVIF_TEXT; + U(tvis).item.mask = TVIF_TEXT|TVIF_PARAM; tvis.hInsertAfter = (HTREEITEM)TVI_LAST; tvis.hParent = hParent; @@ -241,11 +275,98 @@ int EnumFuncs(ITypeInfo *pTypeInfo, int cFuncs, HTREEITEM hParent) if(FAILED(ITypeInfo_GetDocumentation(pTypeInfo, pFuncDesc->memid, &bstrName, NULL, NULL, NULL))) continue; + bstrParamNames = HeapAlloc(GetProcessHeap(), 0, + sizeof(BSTR*)*(pFuncDesc->cParams+1)); + if(FAILED(ITypeInfo_GetNames(pTypeInfo, pFuncDesc->memid, bstrParamNames, + pFuncDesc->cParams+1, &namesNo))) continue; + SysFreeString(bstrParamNames[0]); + + memset(wszText, 0, sizeof(wszText)); + memset(wszAfter, 0, sizeof(wszAfter)); U(tvis).item.cchTextMax = SysStringLen(bstrName); U(tvis).item.pszText = bstrName; - U(tvis).item.lParam = 0; + U(tvis).item.lParam = InitializeTLData(); + CreateTypeInfo(wszText, wszAfter, pFuncDesc->elemdescFunc.tdesc, pTypeInfo); + switch(pFuncDesc->invkind) + { + case INVOKE_PROPERTYGET: + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets1); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszPropGet); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets1); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine); + break; + case INVOKE_PROPERTYPUT: + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets1); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszPropPut); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets1); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine); + break; + case INVOKE_PROPERTYPUTREF: + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets1); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszPropPutRef); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets1); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine); + break; + default:; + } + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszText); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszAfter); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszSpace); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszStdCall); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszSpace); + tabSize = ((TYPELIB_DATA*)(U(tvis).item.lParam))->idlLen; + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), bstrName); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets2); + + for(j=0; jcParams; j++) + { + if(j != 0) AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszComa); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine); + AddSpaces((TYPELIB_DATA*)(U(tvis).item.lParam), tabSize); + bFirst = TRUE; +#define ENUM_PARAM_FLAG(x)\ + if(pFuncDesc->lprgelemdescParam[j].paramdesc.wParamFlags & x)\ + {\ + if(bFirst) AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam),\ + wszOpenBrackets1);\ + else\ + {\ + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszComa);\ + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszSpace);\ + }\ + bFirst = FALSE;\ + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wsz##x);\ + } + ENUM_PARAM_FLAG(PARAMFLAG_FIN); + ENUM_PARAM_FLAG(PARAMFLAG_FOUT); + ENUM_PARAM_FLAG(PARAMFLAG_FLCID); + ENUM_PARAM_FLAG(PARAMFLAG_FRETVAL); + ENUM_PARAM_FLAG(PARAMFLAG_FOPT); + ENUM_PARAM_FLAG(PARAMFLAG_FHASDEFAULT); + ENUM_PARAM_FLAG(PARAMFLAG_FHASCUSTDATA); + + if(!bFirst) + { + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets1); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszSpace); + } + + memset(wszText, 0, sizeof(wszText)); + memset(wszAfter, 0, sizeof(wszAfter)); + CreateTypeInfo(wszText, wszAfter, pFuncDesc->lprgelemdescParam[j].tdesc, + pTypeInfo); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszText); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszAfter); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszSpace); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), bstrParamNames[j+1]); + SysFreeString(bstrParamNames[j+1]); + } + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets2); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszSemicolon); + AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine); SendMessage(typelib.hTree, TVM_INSERTITEM, 0, (LPARAM)&tvis); + HeapFree(GetProcessHeap(), 0, bstrParamNames); SysFreeString(bstrName); ITypeInfo_ReleaseFuncDesc(pTypeInfo, pFuncDesc); } -- 2.11.4.GIT