cvs: php4 /ext/com VARIANT.c conversion.c conversion.h
| From: | Harald Radi | 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);