oleview: Added skeleton for IDL files generation (1/2)

Piotr Caban piotr.caban at gmail.com
Mon Jul 17 10:38:03 CDT 2006


Hi,

Changelog:
 - Added skeleton for IDL files generation

 programs/oleview/main.h    |    8 ++++
 programs/oleview/pane.c    |    9 ++++
 programs/oleview/typelib.c |   96
+++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 111 insertions(+), 2 deletions(-)

--
Piotr

-------------- next part --------------
diff --git a/programs/oleview/main.h b/programs/oleview/main.h
index 689e01f..33195de 100644
--- a/programs/oleview/main.h
+++ b/programs/oleview/main.h
@@ -39,6 +39,7 @@ #define MAX_WINDOW_WIDTH 30000
 #define STATUS_WINDOW 2000
 #define TREE_WINDOW 2001
 #define TAB_WINDOW 2002
+#define TYPELIB_TREE 2003
 
 /*ItemInfo flags */
 #define REGTOP 1
@@ -111,6 +112,12 @@ typedef struct
     WCHAR wszFileName[MAX_LOAD_STRING];
 }TYPELIB;
 
+typedef struct
+{
+    WCHAR *idl;
+    INT idlLen;
+}TYPELIB_DATA;
+
 extern GLOBALS globals;
 extern TREE tree;
 extern TYPELIB typelib;
@@ -141,6 +148,7 @@ void ReleaseInst(HTREEITEM item);
 /* typelib.c */
 BOOL CreateTypeLibWindow(HINSTANCE hInst, WCHAR *wszFileName);
 BOOL TypeLibRegisterClass(void);
+void UpdateData(HTREEITEM item);
 
 /* interface.c */
 BOOL IsInterface(HTREEITEM item);
diff --git a/programs/oleview/pane.c b/programs/oleview/pane.c
index 6943db4..4f5486d 100644
--- a/programs/oleview/pane.c
+++ b/programs/oleview/pane.c
@@ -99,6 +99,15 @@ LRESULT CALLBACK PaneProc(HWND hWnd, UIN
             if(GetCapture() == hWnd)
                 DrawSplitMoving(hWnd, LOWORD(lParam));
             break;
+        case WM_NOTIFY:
+            if((int)wParam != TYPELIB_TREE) break;
+            switch(((LPNMHDR)lParam)->code)
+            {
+                case TVN_SELCHANGED:
+                    UpdateData(((NMTREEVIEW *)lParam)->itemNew.hItem);
+                    break;
+            }
+            break;
         case WM_SIZE:
             if(wParam == SIZE_MINIMIZED) break;
             pane->width = LOWORD(lParam);
diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index 9eab7c4..8a46c1e 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -30,6 +30,15 @@ static const WCHAR wszTypeLib[] = { 'T',
 static const WCHAR wszFailed[] = { '<','f','a','i','l','e','d','>','\0' };
 static const WCHAR wszSpace[] = { ' ','\0' };
 static const WCHAR wszAsterix[] = { '*','\0' };
+static const WCHAR wszComa[] = { ',','\0' };
+static const WCHAR wszSemicolon[] = { ';','\0' };
+static const WCHAR wszNewLine[] = { '\n','\0' };
+static const WCHAR wszOpenBrackets1[] = { '[','\0' };
+static const WCHAR wszCloseBrackets1[] = { ']','\0' };
+static const WCHAR wszOpenBrackets2[] = { '(','\0' };
+static const WCHAR wszCloseBrackets2[] = { ')','\0' };
+
+static const WCHAR wszUUID[] = { 'u','u','i','d','\0' };
 
 static const WCHAR wszVT_BOOL[]
     = { 'V','A','R','I','A','N','T','_','B','O','O','L','\0' };
@@ -61,6 +70,30 @@ void AddToStrW(WCHAR *wszDest, const WCH
     lstrcpyW(&wszDest[lstrlenW(wszDest)], wszSource);
 }
 
+void AddToTLDataStrW(TYPELIB_DATA *pTLData, const WCHAR *wszSource)
+{
+    WCHAR *newIdl;
+    int SourceLen = lstrlenW(wszSource);
+
+    newIdl = HeapAlloc(GetProcessHeap(), 0,
+            sizeof(WCHAR)*(pTLData->idlLen+SourceLen+1));
+    memcpy(newIdl, pTLData->idl, sizeof(WCHAR)*pTLData->idlLen);
+    memcpy(&newIdl[pTLData->idlLen], wszSource, sizeof(WCHAR)*(SourceLen+1));
+    pTLData->idlLen += SourceLen;
+    HeapFree(GetProcessHeap(), 0, pTLData->idl);
+    pTLData->idl = newIdl;
+}
+
+LPARAM InitializeTLData(void)
+{
+    TYPELIB_DATA *pTLData;
+
+    pTLData = HeapAlloc(GetProcessHeap(), 0, sizeof(TYPELIB_DATA));
+    memset(pTLData, 0, sizeof(TYPELIB_DATA));
+
+    return (LPARAM)pTLData;
+}
+
 void CreateTypeInfo(WCHAR *wszAddTo, WCHAR *wszAddAfter, TYPEDESC tdesc, ITypeInfo *pTypeInfo)
 {
     int i;
@@ -241,6 +274,7 @@ int PopulateTree(void)
 {
     TVINSERTSTRUCT tvis;
     ITypeLib *pTypeLib;
+    TLIBATTR *pTLibAttr;
     ITypeInfo *pTypeInfo, *pRefTypeInfo;
     HREFTYPE hRefType;
     TYPEATTR *pTypeAttr;
@@ -252,7 +286,15 @@ int PopulateTree(void)
     HRESULT hRes;
     HTREEITEM hParent;
 
+    const WCHAR wszGeneratedInfo[] = { '/','/',' ','G','e','n','e','r','a','t','e','d',
+        ' ','.','I','D','L',' ','f','i','l','e',' ','(','b','y',' ','t','h','e',' ',
+        'O','L','E','/','C','O','M',' ','O','b','j','e','c','t',' ',
+        'V','i','e','w','e','r',')','\n','/','/','\n','/','/',' ',
+        't','y','p','e','l','i','b',' ','f','i','l','e','n','a','m','e',':',' ','\0'};
+
     const WCHAR wszFormat[] = { '%','s',' ','(','%','s',')','\0' };
+    const WCHAR wszFormat2[] = { 'v','e','r','s','i','o','n',
+        '(','%','l','d','.','%','l','d',')','\0' };
 
     const WCHAR wszTKIND_ENUM[] = { 't','y','p','e','d','e','f',' ','e','n','u','m',' ','\0' };
     const WCHAR wszTKIND_RECORD[]
@@ -266,7 +308,10 @@ int PopulateTree(void)
     const WCHAR wszTKIND_UNION[]
         = { 't','y','p','e','d','e','f',' ','u','n','i','o','n',' ','\0' };
 
-    U(tvis).item.mask = TVIF_TEXT;
+    const WCHAR wszHelpString[] = { 'h','e','l','p','s','t','r','i','n','g','\0' };
+    const WCHAR wszLibrary[] = { 'l','i','b','r','a','r','y',' ','\0' };
+
+    U(tvis).item.mask = TVIF_TEXT|TVIF_PARAM;
     U(tvis).item.cchTextMax = MAX_LOAD_STRING;
     U(tvis).item.pszText = wszText;
     tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
@@ -286,6 +331,38 @@ int PopulateTree(void)
     count = ITypeLib_GetTypeInfoCount(pTypeLib);
 
     ITypeLib_GetDocumentation(pTypeLib, -1, &bstrName, &bstrData, NULL, NULL);
+    ITypeLib_GetLibAttr(pTypeLib, &pTLibAttr);
+    
+    U(tvis).item.lParam = InitializeTLData();
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszGeneratedInfo);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), typelib.wszFileName);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets1);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszUUID);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets2);
+    StringFromGUID2(&(pTLibAttr->guid), wszText, MAX_LOAD_STRING);
+    wszText[lstrlenW(wszText)-1] = '\0';
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), &wszText[1]);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets2);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszComa);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+    wsprintfW(wszText, wszFormat2, pTLibAttr->wMajorVerNum, pTLibAttr->wMinorVerNum);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszText);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszComa);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszHelpString);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszOpenBrackets2);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), bstrData);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets2);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszCloseBrackets1);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszLibrary);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), bstrName);
+    AddToTLDataStrW((TYPELIB_DATA*)(U(tvis).item.lParam), wszNewLine);
+
     wsprintfW(wszText, wszFormat, bstrName, bstrData);
     SysFreeString(bstrName);
     SysFreeString(bstrData);
@@ -358,6 +435,20 @@ #define TKINDADDTOSTR(x) case x:\
     return 0;
 }
 
+void UpdateData(HTREEITEM item)
+{
+    TVITEM tvi;
+
+    memset(&tvi, 0, sizeof(TVITEM));
+    tvi.mask = TVIF_PARAM;
+    tvi.hItem = item;
+
+    SendMessage(typelib.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+    if(!tvi.lParam || !((TYPELIB_DATA*)tvi.lParam)->idlLen) return;
+
+    SetWindowText(typelib.hEdit, ((TYPELIB_DATA*)tvi.lParam)->idl);
+}
+
 void TypeLibResizeChild(void)
 {
     RECT client, stat;
@@ -412,7 +503,8 @@ LRESULT CALLBACK TypeLibProc(HWND hWnd, 
                 DestroyWindow(hWnd);
             typelib.hTree = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL,
                     WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
-                    0, 0, 0, 0, typelib.hPaneWnd, NULL, globals.hMainInst, NULL);
+                    0, 0, 0, 0, typelib.hPaneWnd, (HMENU)TYPELIB_TREE,
+                    globals.hMainInst, NULL);
             typelib.hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, NULL,
                     WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_READONLY|WS_HSCROLL|WS_VSCROLL,
                     0, 0, 0, 0, typelib.hPaneWnd, NULL, globals.hMainInst, NULL);


More information about the wine-patches mailing list