Robert Shearman : oleaut: Implement processing of modules for SLTG typelibs .

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


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

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

oleaut: Implement processing of modules for SLTG typelibs.

Set funckind when processing SLTG functions.

---

 dlls/oleaut32/typelib.c |   45 ++++++++++++++++++++++++++++++++++++++-------
 dlls/oleaut32/typelib.h |    7 ++++---
 2 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 5554205..8483aa9 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -2906,14 +2906,25 @@ static void SLTG_DoFuncs(char *pBlk, cha
         int param;
 	WORD *pType, *pArg;
 
-	if(pFunc->magic != SLTG_FUNCTION_MAGIC &&
-	   pFunc->magic != SLTG_FUNCTION_WITH_FLAGS_MAGIC &&
-           pFunc->magic != SLTG_DISPATCH_FUNCTION_MAGIC) {
-	    FIXME("func magic = %02x\n", pFunc->magic);
-	    return;
-	}
 	*ppFuncDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
 				sizeof(**ppFuncDesc));
+
+        switch (pFunc->magic & ~SLTG_FUNCTION_FLAGS_PRESENT) {
+        case SLTG_FUNCTION_MAGIC:
+            (*ppFuncDesc)->funcdesc.funckind = FUNC_PUREVIRTUAL;
+            break;
+        case SLTG_DISPATCH_FUNCTION_MAGIC:
+            (*ppFuncDesc)->funcdesc.funckind = FUNC_DISPATCH;
+            break;
+        case SLTG_STATIC_FUNCTION_MAGIC:
+            (*ppFuncDesc)->funcdesc.funckind = FUNC_STATIC;
+            break;
+        default:
+	    FIXME("unimplemented func magic = %02x\n", pFunc->magic & ~SLTG_FUNCTION_FLAGS_PRESENT);
+            HeapFree(GetProcessHeap(), 0, *ppFuncDesc);
+            *ppFuncDesc = NULL;
+	    return;
+	}
 	(*ppFuncDesc)->Name = TLB_MultiByteToBSTR(pFunc->name + pNameTable);
 
 	(*ppFuncDesc)->funcdesc.memid = pFunc->dispid;
@@ -2923,7 +2934,7 @@ static void SLTG_DoFuncs(char *pBlk, cha
 	(*ppFuncDesc)->funcdesc.cParamsOpt = (pFunc->retnextopt & 0x7e) >> 1;
 	(*ppFuncDesc)->funcdesc.oVft = pFunc->vtblpos;
 
-	if(pFunc->magic == SLTG_FUNCTION_WITH_FLAGS_MAGIC)
+	if(pFunc->magic & SLTG_FUNCTION_FLAGS_PRESENT)
 	    (*ppFuncDesc)->funcdesc.wFuncFlags = pFunc->funcflags;
 
 	if(pFunc->retnextopt & 0x80)
@@ -3098,6 +3109,21 @@ static void SLTG_ProcessEnum(char *pBlk,
   SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable);
 }
 
+static void SLTG_ProcessModule(char *pBlk, ITypeInfoImpl *pTI,
+			       char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
+			       SLTG_TypeInfoTail *pTITail)
+{
+  if (pTIHeader->href_table != 0xffffffff)
+      SLTG_DoRefs((SLTG_RefInfo*)((char *)pTIHeader + pTIHeader->href_table), pTI,
+                                  pNameTable);
+
+  if (pTITail->vars_off != 0xffff)
+    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);
+}
+
 /* Because SLTG_OtherTypeInfo is such a painful struct, we make a more
    managable copy of it into this */
 typedef struct {
@@ -3371,6 +3397,11 @@ static ITypeLib2* ITypeLib2_Constructor_
                              pTIHeader, pTITail);
 	break;
 
+      case TKIND_MODULE:
+	SLTG_ProcessModule((char *)(pMemHeader + 1), *ppTypeInfoImpl, pNameTable,
+                           pTIHeader, pTITail);
+	break;
+
       default:
 	FIXME("Not processing typekind %d\n", pTIHeader->typekind);
 	break;
diff --git a/dlls/oleaut32/typelib.h b/dlls/oleaut32/typelib.h
index e774800..be2e3eb 100644
--- a/dlls/oleaut32/typelib.h
+++ b/dlls/oleaut32/typelib.h
@@ -477,7 +477,7 @@ typedef struct {
 #define SLTG_ENUMITEM_MAGIC 0x120a
 
 typedef struct {
-	BYTE magic;	/* 0x4c or 0x6c */
+	BYTE magic;	/* 0x4c, 0xcb or 0x8b with optional SLTG_FUNCTION_FLAGS_PRESENT flag */
 	BYTE inv;	/* high nibble is INVOKE_KIND, low nibble = 2 */
 	WORD next;	/* byte offset from beginning of group to next fn */
 	WORD name;	/* Offset within name table to name */
@@ -491,7 +491,7 @@ typedef struct {
 			   middle 6 bits */
 	WORD rettype;	/* return type VT_?? or offset to ret type */
 	WORD vtblpos;	/* position in vtbl? */
-	WORD funcflags; /* present if magic == 0x6c */
+	WORD funcflags; /* present if magic & 0x20 */
 /* Param list starts, repeat next two as required */
 #if 0
 	WORD  name;	/* offset to 2nd letter of name */
@@ -499,9 +499,10 @@ #if 0
 #endif
 } SLTG_Function;
 
+#define SLTG_FUNCTION_FLAGS_PRESENT 0x20
 #define SLTG_FUNCTION_MAGIC 0x4c
-#define SLTG_FUNCTION_WITH_FLAGS_MAGIC 0x6c
 #define SLTG_DISPATCH_FUNCTION_MAGIC 0xcb
+#define SLTG_STATIC_FUNCTION_MAGIC 0x8b
 
 typedef struct {
 /*00*/	BYTE magic;		/* 0xdf */




More information about the wine-cvs mailing list