Module: wine Branch: refs/heads/master Commit: 3f97460c2b702eb6d34a707bd62b26c624a1b28f URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3f97460c2b702eb6d34a707b...
Author: Robert Shearman rob@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