Robert Shearman : oleaut: Improve SLTG var support.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 6 06:08:47 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 3f97460c2b702eb6d34a707bd62b26c624a1b28f
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=3f97460c2b702eb6d34a707bd62b26c624a1b28f

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Jul  3 13:54:38 2006 +0100

oleaut: Improve SLTG var support.

Pass both the start of the block and the offset to the first item into
SLTG_DoVars as they may be different.
Process 0xfffe offsets for variable names - this means to use the
previous name.
Add support for parsing the optional varflags field.

---

 dlls/oleaut32/typelib.c |   24 +++++++++++++++++-------
 dlls/oleaut32/typelib.h |    2 ++
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index d65fd64..5554205 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -2820,27 +2820,33 @@ static char *SLTG_DoImpls(char *pBlk, IT
     return (char*)info;
 }
 
-static void SLTG_DoVars(char *pBlk, ITypeInfoImpl *pTI, unsigned short cVars, char *pNameTable)
+static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsigned short cVars, char *pNameTable)
 {
   TLBVarDesc **ppVarDesc = &pTI->varlist;
+  BSTR bstrPrevName = NULL;
   SLTG_Variable *pItem;
   unsigned short i;
   WORD *pType;
   char buf[300];
 
-  for(pItem = (SLTG_Variable *)pBlk, i = 0; i < cVars;
+  for(pItem = (SLTG_Variable *)pFirstItem, i = 0; i < cVars;
       pItem = (SLTG_Variable *)(pBlk + pItem->next), i++) {
 
       *ppVarDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
 			     sizeof(**ppVarDesc));
-      (*ppVarDesc)->Name = TLB_MultiByteToBSTR(pItem->name + pNameTable);
       (*ppVarDesc)->vardesc.memid = pItem->memid;
 
-      if(pItem->magic != SLTG_VAR_MAGIC) {
+      if (pItem->magic != SLTG_VAR_MAGIC &&
+          pItem->magic != SLTG_VAR_WITH_FLAGS_MAGIC) {
 	  FIXME_(typelib)("var magic = %02x\n", pItem->magic);
 	  return;
       }
 
+      if (pItem->name == 0xfffe)
+        (*ppVarDesc)->Name = SysAllocString(bstrPrevName);
+      else
+        (*ppVarDesc)->Name = TLB_MultiByteToBSTR(pItem->name + pNameTable);
+
       TRACE_(typelib)("byte_offs = 0x%x\n", pItem->byte_offs);
       TRACE_(typelib)("memid = 0x%lx\n", pItem->memid);
 
@@ -2863,6 +2869,9 @@ static void SLTG_DoVars(char *pBlk, ITyp
         (*ppVarDesc)->vardesc.varkind = VAR_PERINSTANCE;
       }
 
+      if (pItem->magic == SLTG_VAR_WITH_FLAGS_MAGIC)
+        (*ppVarDesc)->vardesc.wVarFlags = pItem->varflags;
+
       if (pItem->flags & 0x80)
         (*ppVarDesc)->vardesc.wVarFlags |= VARFLAG_FREADONLY;
 
@@ -2879,6 +2888,7 @@ static void SLTG_DoVars(char *pBlk, ITyp
 
       dump_TypeDesc(&(*ppVarDesc)->vardesc.elemdescVar.tdesc, buf);
 
+      bstrPrevName = (*ppVarDesc)->Name;
       ppVarDesc = &((*ppVarDesc)->next);
   }
   pTI->TypeAttr.cVars = cVars;
@@ -3032,7 +3042,7 @@ static void SLTG_ProcessRecord(char *pBl
 			       char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
 			       SLTG_TypeInfoTail *pTITail)
 {
-  SLTG_DoVars(pBlk, pTI, pTITail->cVars, pNameTable);
+  SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable);
 }
 
 static void SLTG_ProcessAlias(char *pBlk, ITypeInfoImpl *pTI,
@@ -3067,7 +3077,7 @@ static void SLTG_ProcessDispatch(char *p
                                   pNameTable);
 
   if (pTITail->vars_off != 0xffff)
-    SLTG_DoVars(pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable);
+    SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable);
 
   if (pTITail->funcs_off != 0xffff)
     SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable);
@@ -3085,7 +3095,7 @@ static void SLTG_ProcessEnum(char *pBlk,
 			     char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
                              SLTG_TypeInfoTail *pTITail)
 {
-  SLTG_DoVars(pBlk, pTI, pTITail->cVars, pNameTable);
+  SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable);
 }
 
 /* Because SLTG_OtherTypeInfo is such a painful struct, we make a more
diff --git a/dlls/oleaut32/typelib.h b/dlls/oleaut32/typelib.h
index 4ac98ad..e774800 100644
--- a/dlls/oleaut32/typelib.h
+++ b/dlls/oleaut32/typelib.h
@@ -580,9 +580,11 @@ typedef struct {
   DWORD memid;
   WORD helpcontext; /* ?? */
   WORD helpstring; /* ?? */
+  WORD varflags; /* only present if magic & 0x02 */
 } SLTG_Variable;
 
 #define SLTG_VAR_MAGIC 0x0a
+#define SLTG_VAR_WITH_FLAGS_MAGIC 0x2a
 
 
 /* CARRAYs look like this




More information about the wine-cvs mailing list