Andrey Turkin : oleaut32: Add support for const variables.

Alexandre Julliard julliard at winehq.org
Tue Jul 20 11:20:32 CDT 2010


Module: wine
Branch: master
Commit: fe7e384e07020a5e6c51b5ba1f928da857928a35
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fe7e384e07020a5e6c51b5ba1f928da857928a35

Author: Andrey Turkin <andrey.turkin at gmail.com>
Date:   Sat Jul 17 11:40:10 2010 +0400

oleaut32: Add support for const variables.

---

 dlls/oleaut32/typelib2.c |   71 ++++++++++++++++++++++++++--------------------
 1 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index df060c0..10e26fb 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -2026,6 +2026,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
 {
     ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
 
+    HRESULT status = S_OK;
     CyclicList *insert;
     INT *typedata;
     int var_datawidth;
@@ -2079,7 +2080,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
     /* fill out the basic type information */
     typedata[0] = 0x14 | (index << 16);
     typedata[2] = pVarDesc->wVarFlags;
-    typedata[3] = (sizeof(VARDESC) << 16) | 0;
+    typedata[3] = (sizeof(VARDESC) << 16) | pVarDesc->varkind;
 
     /* update the index data */
     insert->indice = 0x40000000 + index;
@@ -2091,44 +2092,52 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
 			 &typedata[1], &var_datawidth, &var_alignment,
 			 &var_type_size);
 
-    /* pad out starting position to data width */
-    This->datawidth += var_alignment - 1;
-    This->datawidth &= ~(var_alignment - 1);
-    typedata[4] = This->datawidth;
-    
-    /* add the new variable to the total data width */
-    This->datawidth += var_datawidth;
-    if(This->dual)
-        This->dual->datawidth = This->datawidth;
+    if (pVarDesc->varkind != VAR_CONST)
+    {
+	/* pad out starting position to data width */
+	This->datawidth += var_alignment - 1;
+	This->datawidth &= ~(var_alignment - 1);
+	typedata[4] = This->datawidth;
+
+	/* add the new variable to the total data width */
+	This->datawidth += var_datawidth;
+	if(This->dual)
+	    This->dual->datawidth = This->datawidth;
+
+	/* add type description size to total required allocation */
+	typedata[3] += var_type_size << 16;
+
+	/* fix type alignment */
+	alignment = (This->typeinfo->typekind >> 11) & 0x1f;
+	if (alignment < var_alignment) {
+	    alignment = var_alignment;
+	    This->typeinfo->typekind &= ~0xf800;
+	    This->typeinfo->typekind |= alignment << 11;
+	}
 
-    /* add type description size to total required allocation */
-    typedata[3] += var_type_size << 16;
+	/* ??? */
+	if (!This->typeinfo->res2) This->typeinfo->res2 = 0x1a;
+	if ((index == 0) || (index == 1) || (index == 2) || (index == 4) || (index == 9)) {
+	    This->typeinfo->res2 <<= 1;
+	}
 
-    /* fix type alignment */
-    alignment = (This->typeinfo->typekind >> 11) & 0x1f;
-    if (alignment < var_alignment) {
-	alignment = var_alignment;
-	This->typeinfo->typekind &= ~0xf800;
-	This->typeinfo->typekind |= alignment << 11;
-    }
+	/* ??? */
+	if (This->typeinfo->res3 == -1) This->typeinfo->res3 = 0;
+	This->typeinfo->res3 += 0x2c;
 
-    /* ??? */
-    if (!This->typeinfo->res2) This->typeinfo->res2 = 0x1a;
-    if ((index == 0) || (index == 1) || (index == 2) || (index == 4) || (index == 9)) {
-	This->typeinfo->res2 <<= 1;
+	/* pad data width to alignment */
+	This->typeinfo->size = (This->datawidth + (alignment - 1)) & ~(alignment - 1);
+    } else {
+	VARIANT *value = pVarDesc->DUMMYUNIONNAME.lpvarValue;
+	status = ctl2_encode_variant(This->typelib, typedata+4, value, V_VT(value));
+        /* ??? native sets size 0x34 */
+	typedata[3] += 0x10 << 16;
     }
 
-    /* ??? */
-    if (This->typeinfo->res3 == -1) This->typeinfo->res3 = 0;
-    This->typeinfo->res3 += 0x2c;
-
     /* increment the number of variable elements */
     This->typeinfo->cElement += 0x10000;
 
-    /* pad data width to alignment */
-    This->typeinfo->size = (This->datawidth + (alignment - 1)) & ~(alignment - 1);
-
-    return S_OK;
+    return status;
 }
 
 /******************************************************************************




More information about the wine-cvs mailing list