oleview: Added functions description to idl generation

Piotr Caban piotr.caban at gmail.com
Sun Aug 20 05:44:49 CDT 2006


Hi,

Changelog:
 - Added functions description to idl generation
 - Added more data types handling

  programs/oleview/typelib.c | 129
+++++++++++++++++++++++++++++++++++++++++++-
  1 files changed, 125 insertions(+), 4 deletions(-)

--
Piotr

-------------- next part --------------
diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index f9b8d28..d3c5109 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -69,6 +69,25 @@ static const WCHAR wszVT_VOID[] = { 'v',
 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 @@ #define VTADDTOSTR(x) case x:\
         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; i<U(tdesc).lpadesc->cDims; i++)
         {
@@ -226,12 +256,16 @@ int EnumVars(ITypeInfo *pTypeInfo, int c
 
 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 
         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; j<pFuncDesc->cParams; 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);
     }


More information about the wine-patches mailing list