cvs: php4 /ext/com VARIANT.c conversion.c conversion.h

From: Date: Wed, 16 Oct 2002 23:56:33 +0000
Subject: cvs: php4 /ext/com VARIANT.c conversion.c conversion.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-14970@lists.php.net to get a copy of this message
phanto Wed Oct 16 19:56:33 2002 EDT Modified files: /php4/ext/com conversion.c conversion.h VARIANT.c Log: @ changed the VARIANT class to be able to create arrays of all types @ and not only VT_VARIANT Index: php4/ext/com/conversion.c diff -u php4/ext/com/conversion.c:1.49 php4/ext/com/conversion.c:1.50 --- php4/ext/com/conversion.c:1.49 Thu May 30 19:07:21 2002 +++ php4/ext/com/conversion.c Wed Oct 16 19:56:33 2002 @@ -42,7 +42,7 @@ /* implementations */ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage TSRMLS_DC) { - int type = VT_EMPTY; /* default variant type */ + VARTYPE type = VT_EMPTY; /* default variant type */ switch (Z_TYPE_P(pval_arg)) { case IS_NULL: @@ -90,11 +90,11 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage TSRMLS_DC) { - php_pval_to_variant_ex2(pval_arg, var_arg, Z_LVAL_P(pval_type), codepage TSRMLS_CC); + php_pval_to_variant_ex2(pval_arg, var_arg, (unsigned short) Z_LVAL_P(pval_type), codepage TSRMLS_CC); } -PHPAPI void php_pval_to_variant_ex2(pval *pval_arg, VARIANT *var_arg, int type, int codepage TSRMLS_DC) +PHPAPI void php_pval_to_variant_ex2(pval *pval_arg, VARIANT *var_arg, VARTYPE type, int codepage TSRMLS_DC) { OLECHAR *unicode_str; @@ -108,7 +108,7 @@ int numberOfElements = zend_hash_num_elements(ht); SAFEARRAY *safeArray; SAFEARRAYBOUND bounds[1]; - VARIANT *v; + VARIANT *v, var; zval **entry; /* An entry in the input array */ type &= ~VT_ARRAY; @@ -118,29 +118,35 @@ ALLOC_VARIANT(V_VARIANTREF(var_arg)); var_arg = V_VARIANTREF(var_arg); /* put the array in that VARIANT */ } + if (!type) { + // if no type is given we take the variant type + type = VT_VARIANT; + } bounds[0].lLbound = 0; bounds[0].cElements = numberOfElements; - safeArray = SafeArrayCreate(VT_VARIANT, 1, bounds); + safeArray = SafeArrayCreate(type, 1, bounds); if (NULL == safeArray) { php_error( E_WARNING,"Unable to convert php array to VARIANT array - %s", numberOfElements ? "" : "(Empty input array)"); ZVAL_FALSE(pval_arg); } else { V_ARRAY(var_arg) = safeArray; - V_VT(var_arg) = VT_ARRAY|VT_VARIANT; /* Now have a valid safe array allocated */ + V_VT(var_arg) = VT_ARRAY|type; /* Now have a valid safe array allocated */ if (SUCCEEDED(SafeArrayLock(safeArray))) { ulong i; + UINT size = SafeArrayGetElemsize(safeArray); zend_hash_internal_pointer_reset(ht); for (i = 0; i < (ulong)numberOfElements; ++i) { if ((zend_hash_get_current_data(ht, (void **)&entry) == SUCCESS) && (entry != NULL)) { /* Get a pointer to the php array element */ /* Add another value to the safe array */ - if (SUCCEEDED(SafeArrayPtrOfIndex( safeArray, &i, &v))) { /* Pointer to output element entry retrieved successfully */ - if (type) { /* explicit type */ - php_pval_to_variant_ex2(*entry, v, type, codepage TSRMLS_CC); /* Do the required conversion */ + if (SUCCEEDED(SafeArrayPtrOfIndex(safeArray, &i, &v))) { /* Pointer to output element entry retrieved successfully */ + if (type == VT_VARIANT) { + php_pval_to_variant(*entry, v, codepage TSRMLS_CC); /* Do the required conversion */ } else { - php_pval_to_variant(*entry, v, codepage TSRMLS_CC); /* Do the required conversion */ + php_pval_to_variant_ex2(*entry, &var, type, codepage TSRMLS_CC); /* Do the required conversion */ + memcpy(v, &(var.byref), size); } } else { php_error( E_WARNING,"phpArrayToSafeArray() - Unable to retrieve pointer to output element number (%d)", i); Index: php4/ext/com/conversion.h diff -u php4/ext/com/conversion.h:1.8 php4/ext/com/conversion.h:1.9 --- php4/ext/com/conversion.h:1.8 Thu Oct 4 14:24:43 2001 +++ php4/ext/com/conversion.h Wed Oct 16 19:56:33 2002 @@ -13,7 +13,7 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage TSRMLS_DC); PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage TSRMLS_DC); -PHPAPI void php_pval_to_variant_ex2(pval *pval_arg, VARIANT *var_arg, int type, int codepage TSRMLS_DC); +PHPAPI void php_pval_to_variant_ex2(pval *pval_arg, VARIANT *var_arg, VARTYPE type, int codepage TSRMLS_DC); PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int codepage TSRMLS_DC); PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage TSRMLS_DC); PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int codepage TSRMLS_DC); Index: php4/ext/com/VARIANT.c diff -u php4/ext/com/VARIANT.c:1.33 php4/ext/com/VARIANT.c:1.34 --- php4/ext/com/VARIANT.c:1.33 Mon Aug 5 19:38:35 2002 +++ php4/ext/com/VARIANT.c Wed Oct 16 19:56:33 2002 @@ -230,7 +230,7 @@ static int do_VARIANT_propset(VARIANT *var_arg, pval *arg_property, pval *value TSRMLS_DC) { - int type; + VARTYPE type; if (!strcmp(Z_STRVAL_P(arg_property), "value")) { php_pval_to_variant(value, var_arg, codepage TSRMLS_CC);

« previous php.cvs (#14970) next »