Piotr Caban : oleview: Added coclass handling base.

Alexandre Julliard julliard at winehq.org
Fri Apr 11 06:28:21 CDT 2008


Module: wine
Branch: master
Commit: cdc3ee70b3a69b5d24fb6671ed98fb4a48cc0da5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cdc3ee70b3a69b5d24fb6671ed98fb4a48cc0da5

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Fri Apr 11 01:10:27 2008 +0200

oleview: Added coclass handling base.

---

 programs/oleview/typelib.c |  105 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index 922fa11..96e7574 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -763,6 +763,84 @@ static int EnumImplTypes(ITypeInfo *pTypeInfo, int cImplTypes, HTREEITEM hParent
     return 0;
 }
 
+static void EnumCoclassImplTypes(ITypeInfo *pTypeInfo,
+        int cImplTypes, TYPELIB_DATA *pTLData)
+{
+    int i;
+    ITypeInfo *pRefTypeInfo;
+    HREFTYPE hRefType;
+    TYPEATTR *pTypeAttr;
+    BSTR bstrName;
+    BOOL bFirst;
+    INT flags;
+    const WCHAR wszTKIND_INTERFACE[] = { 'i','n','t','e','r','f','a','c','e',' ','\0' };
+    const WCHAR wszTKIND_DISPATCH[]
+        = { 'd','i','s','p','i','n','t','e','r','f','a','c','e',' ','\0' };
+    const WCHAR wszIMPLTYPEFLAG_FDEFAULT[]
+        = { 'd','e','f','a','u','l','t','\0' };
+    const WCHAR wszIMPLTYPEFLAG_FSOURCE[]
+        = { 's','o','u','r','c','e','\0' };
+    const WCHAR wszIMPLTYPEFLAG_FRESTRICTED[]
+        = { 'r','e','s','t','r','i','c','t','e','d','\0' };
+
+    for(i=0; i<cImplTypes; i++)
+    {
+        if(FAILED(ITypeInfo_GetRefTypeOfImplType(pTypeInfo, i, &hRefType))) continue;
+        if(FAILED(ITypeInfo_GetRefTypeInfo(pTypeInfo, hRefType, &pRefTypeInfo)))
+            continue;
+        if(FAILED(ITypeInfo_GetDocumentation(pRefTypeInfo, MEMBERID_NIL, &bstrName,
+                        NULL, NULL, NULL)))
+        {
+            ITypeInfo_Release(pRefTypeInfo);
+            continue;
+        }
+        if(FAILED(ITypeInfo_GetTypeAttr(pRefTypeInfo, &pTypeAttr)))
+        {
+            ITypeInfo_Release(pRefTypeInfo);
+            continue;
+        }
+
+        AddSpaces(pTLData, 4);
+        ITypeInfo_GetImplTypeFlags(pTypeInfo, i, &flags);
+        bFirst = TRUE;
+#define ENUM_IMPLTYPEFLAG(x)\
+        if(flags & x) \
+        {\
+            if(bFirst) AddToTLDataStrW(pTLData,\
+                    wszOpenBrackets1);\
+            else\
+            {\
+                AddToTLDataStrW(pTLData, wszComa);\
+                AddToTLDataStrW(pTLData, wszSpace);\
+            }\
+            bFirst = FALSE;\
+            AddToTLDataStrW(pTLData, wsz##x);\
+        }
+        ENUM_IMPLTYPEFLAG(IMPLTYPEFLAG_FDEFAULT);
+        ENUM_IMPLTYPEFLAG(IMPLTYPEFLAG_FSOURCE);
+        ENUM_IMPLTYPEFLAG(IMPLTYPEFLAG_FRESTRICTED);
+        if(!bFirst)
+        {
+            AddToTLDataStrW(pTLData, wszCloseBrackets1);
+            AddToTLDataStrW(pTLData, wszSpace);
+        }
+
+        if(pTypeAttr->typekind == TKIND_INTERFACE)
+            AddToTLDataStrW(pTLData, wszTKIND_INTERFACE);
+        else if(pTypeAttr->typekind == TKIND_DISPATCH)
+            AddToTLDataStrW(pTLData, wszTKIND_DISPATCH);
+        AddToTLDataStrW(pTLData, wszSpace);
+
+        AddToTLDataStrW(pTLData, bstrName);
+        AddToTLDataStrW(pTLData, wszSemicolon);
+        AddToTLDataStrW(pTLData, wszNewLine);
+
+        SysFreeString(bstrName);
+        ITypeInfo_ReleaseTypeAttr(pRefTypeInfo, pTypeAttr);
+        ITypeInfo_Release(pRefTypeInfo);
+    }
+}
+
 static void AddIdlData(HTREEITEM hCur, TYPELIB_DATA *pTLData)
 {
     TVITEM tvi;
@@ -989,6 +1067,16 @@ static void CreateTypedefHeader(ITypeInfo *pTypeInfo,
     }
 }
 
+static void CreateCoclassHeader(ITypeInfo *pTypeInfo,
+        TYPEATTR *pTypeAttr, TYPELIB_DATA *pTLData)
+{
+    AddToTLDataStrW(pTLData, wszOpenBrackets1);
+    AddToTLDataStrW(pTLData, wszNewLine);
+
+    AddToTLDataStrW(pTLData, wszCloseBrackets1);
+    AddToTLDataStrW(pTLData, wszNewLine);
+}
+
 static int PopulateTree(void)
 {
     TVINSERTSTRUCT tvis;
@@ -1175,6 +1263,23 @@ static int PopulateTree(void)
             case TKIND_COCLASS:
                 AddToStrW(wszText, wszTKIND_COCLASS);
                 AddToStrW(wszText, bstrName);
+
+                CreateCoclassHeader(pTypeInfo, pTypeAttr, tld);
+                AddToTLDataStrW(tld, wszTKIND_COCLASS);
+                AddToTLDataStrW(tld, bstrName);
+                AddToTLDataStrW(tld, wszSpace);
+                AddToTLDataStrW(tld, wszOpenBrackets3);
+                AddToTLDataStrW(tld, wszNewLine);
+
+                EnumCoclassImplTypes(pTypeInfo, pTypeAttr->cImplTypes, tld);
+
+                AddToStrW(tld->wszInsertAfter, wszCloseBrackets3);
+                AddToStrW(tld->wszInsertAfter, wszSemicolon);
+                AddToStrW(tld->wszInsertAfter, wszNewLine);
+
+                bInsert = FALSE;
+                hParent = TreeView_InsertItem(typelib.hTree, &tvis);
+                AddToTLDataStrW(tld, tld->wszInsertAfter);
                 break;
             case TKIND_UNION:
                 AddToStrW(wszText, wszTKIND_UNION);




More information about the wine-cvs mailing list