Piotr Caban : oleview: Improved type handling in TypeLib viewer.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 3 05:22:58 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 221521ca94ac1416dde73d79e8c31f172963bb95
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=221521ca94ac1416dde73d79e8c31f172963bb95
Author: Piotr Caban <piotr.caban at gmail.com>
Date: Sun Jul 2 19:43:30 2006 +0200
oleview: Improved type handling in TypeLib viewer.
---
programs/oleview/typelib.c | 102 +++++++++++++++++++++++++++++---------------
1 files changed, 67 insertions(+), 35 deletions(-)
diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index 3fb8689..3eae6ea 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -20,19 +20,81 @@
#include "main.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(oleview);
+
TYPELIB typelib;
static const WCHAR wszTypeLib[] = { 'T','Y','P','E','L','I','B','\0' };
+static const WCHAR wszFailed[] = { '<','f','a','i','l','e','d','>','\0' };
+static const WCHAR wszSpace[] = { ' ','\0' };
+static const WCHAR wszAsterix[] = { '*','\0' };
+
+static const WCHAR wszVT_BOOL[]
+ = { 'V','A','R','I','A','N','T','_','B','O','O','L','\0' };
+static const WCHAR wszVT_UI1[]
+ = { 'u','n','s','i','g','n','e','d',' ','c','h','a','r','\0' };
+static const WCHAR wszVT_UI4[]
+ = { 'u','n','s','i','g','n','e','d',' ','l','o','n','g','\0' };
+static const WCHAR wszVT_I4[] = { 'l','o','n','g','\0' };
+static const WCHAR wszVT_R4[] = { 's','i','n','g','l','e','\0' };
+static const WCHAR wszVT_INT[] = { 'i','n','t','\0' };
+static const WCHAR wszVT_BSTR[] = { 'B','S','T','R','\0' };
+static const WCHAR wszVT_CY[] = { 'C','U','R','R','E','N','C','Y','\0' };
+
void AddToStrW(WCHAR *wszDest, const WCHAR *wszSource)
{
lstrcpyW(&wszDest[lstrlenW(wszDest)], wszSource);
}
+void CreateTypeInfo(WCHAR *wszAddTo, TYPEDESC tdesc, ITypeInfo *pTypeInfo)
+{
+ BSTR bstrData;
+ HRESULT hRes;
+ ITypeInfo *pRefTypeInfo;
+
+ switch(tdesc.vt&VT_TYPEMASK)
+ {
+#define VTADDTOSTR(x) case x:\
+ AddToStrW(wszAddTo, wsz##x);\
+ break
+ VTADDTOSTR(VT_BOOL);
+ VTADDTOSTR(VT_UI1);
+ VTADDTOSTR(VT_UI4);
+ VTADDTOSTR(VT_I4);
+ VTADDTOSTR(VT_R4);
+ VTADDTOSTR(VT_INT);
+ VTADDTOSTR(VT_BSTR);
+ VTADDTOSTR(VT_CY);
+ case VT_PTR:
+ CreateTypeInfo(wszAddTo, *U(tdesc).lptdesc, pTypeInfo);
+ AddToStrW(wszAddTo, wszAsterix);
+ break;
+ case VT_USERDEFINED:
+ hRes = ITypeInfo_GetRefTypeInfo(pTypeInfo,
+ U(tdesc).hreftype, &pRefTypeInfo);
+ if(SUCCEEDED(hRes))
+ {
+ ITypeInfo_GetDocumentation(pRefTypeInfo, MEMBERID_NIL,
+ &bstrData, NULL, NULL, NULL);
+ AddToStrW(wszAddTo, bstrData);
+ SysFreeString(bstrData);
+ ITypeInfo_Release(pRefTypeInfo);
+ }
+ else AddToStrW(wszAddTo, wszFailed);
+ break;
+ default:
+ WINE_FIXME("tdesc.vt&VT_TYPEMASK == %d not supported\n",
+ tdesc.vt&VT_TYPEMASK);
+ }
+}
+
int PopulateTree(void)
{
TVINSERTSTRUCT tvis;
ITypeLib *pTypeLib;
- ITypeInfo *pTypeInfo, *pRefTypeInfo;
+ ITypeInfo *pTypeInfo;
TYPEATTR *pTypeAttr;
INT count, i;
BSTR bstrName;
@@ -41,7 +103,6 @@ int PopulateTree(void)
HRESULT hRes;
const WCHAR wszFormat[] = { '%','s',' ','(','%','s',')','\0' };
- const WCHAR wszSpace[] = { ' ','\0' };
const WCHAR wszTKIND_ENUM[] = { 't','y','p','e','d','e','f',' ','e','n','u','m',' ','\0' };
const WCHAR wszTKIND_RECORD[]
@@ -55,14 +116,6 @@ int PopulateTree(void)
const WCHAR wszTKIND_UNION[]
= { 't','y','p','e','d','e','f',' ','u','n','i','o','n',' ','\0' };
- const WCHAR wszVT_BOOL[] = { 'V','A','R','I','A','N','T','_','B','O','O','L',' ','\0' };
- const WCHAR wszVT_UI4[] = { 'u','n','s','i','g','n','e','d',' ','l','o','n','g',' ','\0' };
- const WCHAR wszVT_I4[] = { 'l','o','n','g',' ','\0' };
- const WCHAR wszVT_R4[] = { 's','i','n','g','l','e',' ','\0' };
- const WCHAR wszVT_INT[] = { 'i','n','t',' ','\0' };
- const WCHAR wszVT_BSTR[] = { 'B','S','T','R',' ','\0' };
- const WCHAR wszVT_CY[] = { 'C','U','R','R','E','N','C','Y',' ','\0' };
-
U(tvis).item.mask = TVIF_TEXT|TVIF_CHILDREN;
U(tvis).item.cchTextMax = MAX_LOAD_STRING;
U(tvis).item.pszText = wszText;
@@ -81,7 +134,6 @@ int PopulateTree(void)
MessageBox(globals.hMainWnd, wszMessage, NULL, MB_OK|MB_ICONEXCLAMATION);
return 1;
}
-
count = ITypeLib_GetTypeInfoCount(pTypeLib);
ITypeLib_GetDocumentation(pTypeLib, -1, &bstrName, &bstrData, NULL, NULL);
@@ -114,36 +166,16 @@ #define TKINDADDTOSTR(x) case x:\
TKINDADDTOSTR(TKIND_UNION);
case TKIND_ALIAS:
AddToStrW(wszText, wszTKIND_ALIAS);
-
- switch(pTypeAttr->tdescAlias.vt&VT_TYPEMASK)
- {
-#define VTADDTOSTR(x) case x:\
- AddToStrW(wszText, wsz##x);\
- break
- VTADDTOSTR(VT_BOOL);
- VTADDTOSTR(VT_UI4);
- VTADDTOSTR(VT_I4);
- VTADDTOSTR(VT_R4);
- VTADDTOSTR(VT_INT);
- VTADDTOSTR(VT_BSTR);
- VTADDTOSTR(VT_CY);
- case VT_USERDEFINED:
- ITypeInfo_GetRefTypeInfo(pTypeInfo, U(pTypeAttr->tdescAlias).hreftype, &pRefTypeInfo);
- ITypeInfo_GetDocumentation(pRefTypeInfo, MEMBERID_NIL, &bstrData, NULL, NULL, NULL);
- AddToStrW(wszText, bstrData);
- AddToStrW(wszText, wszSpace);
- SysFreeString(bstrData);
- ITypeInfo_Release(pRefTypeInfo);
- break;
- }
-
+ CreateTypeInfo(wszText, pTypeAttr->tdescAlias, pTypeInfo);
+ AddToStrW(wszText, wszSpace);
AddToStrW(wszText, bstrName);
break;
default:
lstrcpyW(wszText, bstrName);
+ WINE_FIXME("pTypeAttr->typekind == %d\n not supported",
+ pTypeAttr->typekind);
}
SendMessage(typelib.hTree, TVM_INSERTITEM, 0, (LPARAM)&tvis);
-
ITypeInfo_ReleaseTypeAttr(pTypeInfo, pTypeAttr);
ITypeInfo_Release(pTypeInfo);
SysFreeString(bstrName);
More information about the wine-cvs
mailing list