oleview: Improved type handling in TypeLib viewer [1/2]

Piotr Caban piotr.caban at gmail.com
Sun Jul 2 12:43:30 CDT 2006


Hi,

Changelog:
 - Improved type handling in TypeLib viewer

 programs/oleview/main.h    |    3 +
 programs/oleview/typelib.c |   98
++++++++++++++++++++++++++++----------------
 2 files changed, 66 insertions(+), 35 deletions(-)

--
Piotr

-------------- next part --------------
diff --git a/programs/oleview/main.h b/programs/oleview/main.h
index 689e01f..d26aa3e 100644
--- a/programs/oleview/main.h
+++ b/programs/oleview/main.h
@@ -31,6 +31,9 @@ #include <winreg.h>
 #include <commctrl.h>
 #include <unknwn.h>
 
+#include <wine/debug.h>
+WINE_DEFAULT_DEBUG_CHANNEL(oleview);
+
 #include "resource.h"
 
 #define MAX_LOAD_STRING 256
diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index 205ddcf..67d8633 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -23,16 +23,74 @@ #include "main.h"
 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 +99,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 +112,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 +130,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 +162,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-patches mailing list