summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorHarald Radi <phanto@php.net>2001-06-12 16:31:54 +0000
committerHarald Radi <phanto@php.net>2001-06-12 16:31:54 +0000
commit0f3ab761b6a57d42dd5f78c7c33f979483ec5848 (patch)
tree3a1a79b1c95d6d3a244cc87a587ee75457167762 /ext
parent92eb51fde2f152c997f371fa5fcf0e3404a76a08 (diff)
downloadphp-git-0f3ab761b6a57d42dd5f78c7c33f979483ec5848.tar.gz
added experimetal php->safearray support
Diffstat (limited to 'ext')
-rw-r--r--ext/com/conversion.c75
-rw-r--r--ext/rpc/com/conversion.c75
2 files changed, 134 insertions, 16 deletions
diff --git a/ext/com/conversion.c b/ext/com/conversion.c
index d892fa71b5..9c29a6e90a 100644
--- a/ext/com/conversion.c
+++ b/ext/com/conversion.c
@@ -91,12 +91,70 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage)
break;
case IS_ARRAY:
- {
- /* TODO: Walk the hash and convert the elements */
- /* into a SafeArray. */
- VariantInit(var_arg);
+ {
+ /* For now we'll just handle single dimension arrays, we'll use the data type of the first element for the
+ output data type */
+ HashTable *ht = Z_ARRVAL(*pval_arg);
+ int numberOfElements = zend_hash_num_elements(ht);
+ SAFEARRAY *safeArray;
+ SAFEARRAYBOUND bounds[1];
+ VARIANT *v;
+ zval **entry; /* An entry in the input array */
+
+ VariantInit(var_arg);
+
+ if(pval_arg->is_ref)
+ {
+ V_VT(var_arg) = VT_VARIANT|VT_BYREF; /* Create a VARIANT to reference */
+ V_VARIANTREF(var_arg) = emalloc(sizeof(VARIANT));
+ var_arg = V_VARIANTREF(var_arg); /* & put the array in that VARIANT */
+ }
+
+ bounds[0].lLbound = 0;
+ bounds[0].cElements = numberOfElements;
+ V_VT(var_arg) = VT_EMPTY; /* until array is created */
+ safeArray = SafeArrayCreate(VT_VARIANT, 1, bounds);
+
+ if(NULL == safeArray)
+ {
+ php_error( E_WARNING,"Unable to convert php array to VARIANT array - %s", numberOfElements ? "" : "(Empty input array)");
+ var_reset(pval_arg);
+ }
+ else
+ {
+ V_ARRAY(var_arg) = safeArray;
+ V_VT(var_arg) = VT_ARRAY|VT_VARIANT; /* Now have a valid safe array allocated */
+ if(SUCCEEDED(SafeArrayLock( safeArray)))
+ {
+ ulong i;
+
+ 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 */
+ {
+ php_pval_to_variant(*entry, v, codepage); /* Do the required conversion */
+ }
+ else
+ {
+ php_error( E_WARNING,"phpArrayToSafeArray() - Unable to retrieve pointer to output element number (%d)", i);
+ }
+ }
+ zend_hash_move_forward(ht);
+ }
+ SafeArrayUnlock( safeArray);
+ }
+ else
+ {
+ php_error( E_WARNING,"phpArrayToSafeArray() - Unable to lock safeArray");
+ }
+ }
+ }
break;
- }
+
case IS_RESOURCE:
case IS_CONSTANT:
case IS_CONSTANT_ARRAY:
@@ -409,10 +467,11 @@ PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent,
var_reset(pval_arg);
return FAILURE;
}
+ SafeArrayLock( array);
/* This call has failed for everything I have tried */
/* But best leave it to be on the safe side */
- if (S_OK != SafeArrayGetVartype(array, &vartype))
+ if (FAILED(SafeArrayGetVartype(array, &vartype)))
{
/* Fall back to what we do know */
/* Mask off the array bit and assume */
@@ -444,7 +503,7 @@ PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent,
V_VT(&vv) = vartype;
hr = SafeArrayGetElement(array, indices, (VOID *) &(vv.lVal));
}
- if (S_OK != hr)
+ if (FAILED(hr))
{
/* Failure to retieve an element probably means the array is sparse */
/* So leave the php array sparse too */
@@ -476,7 +535,7 @@ PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent,
add_index_zval(pval_arg, ii, element);
}
}
-
+ SafeArrayUnlock(array);
/* Clean up the SafeArray since that is our responsibility */
SafeArrayDestroyData(array);
SafeArrayDestroyDescriptor(array);
diff --git a/ext/rpc/com/conversion.c b/ext/rpc/com/conversion.c
index d892fa71b5..9c29a6e90a 100644
--- a/ext/rpc/com/conversion.c
+++ b/ext/rpc/com/conversion.c
@@ -91,12 +91,70 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage)
break;
case IS_ARRAY:
- {
- /* TODO: Walk the hash and convert the elements */
- /* into a SafeArray. */
- VariantInit(var_arg);
+ {
+ /* For now we'll just handle single dimension arrays, we'll use the data type of the first element for the
+ output data type */
+ HashTable *ht = Z_ARRVAL(*pval_arg);
+ int numberOfElements = zend_hash_num_elements(ht);
+ SAFEARRAY *safeArray;
+ SAFEARRAYBOUND bounds[1];
+ VARIANT *v;
+ zval **entry; /* An entry in the input array */
+
+ VariantInit(var_arg);
+
+ if(pval_arg->is_ref)
+ {
+ V_VT(var_arg) = VT_VARIANT|VT_BYREF; /* Create a VARIANT to reference */
+ V_VARIANTREF(var_arg) = emalloc(sizeof(VARIANT));
+ var_arg = V_VARIANTREF(var_arg); /* & put the array in that VARIANT */
+ }
+
+ bounds[0].lLbound = 0;
+ bounds[0].cElements = numberOfElements;
+ V_VT(var_arg) = VT_EMPTY; /* until array is created */
+ safeArray = SafeArrayCreate(VT_VARIANT, 1, bounds);
+
+ if(NULL == safeArray)
+ {
+ php_error( E_WARNING,"Unable to convert php array to VARIANT array - %s", numberOfElements ? "" : "(Empty input array)");
+ var_reset(pval_arg);
+ }
+ else
+ {
+ V_ARRAY(var_arg) = safeArray;
+ V_VT(var_arg) = VT_ARRAY|VT_VARIANT; /* Now have a valid safe array allocated */
+ if(SUCCEEDED(SafeArrayLock( safeArray)))
+ {
+ ulong i;
+
+ 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 */
+ {
+ php_pval_to_variant(*entry, v, codepage); /* Do the required conversion */
+ }
+ else
+ {
+ php_error( E_WARNING,"phpArrayToSafeArray() - Unable to retrieve pointer to output element number (%d)", i);
+ }
+ }
+ zend_hash_move_forward(ht);
+ }
+ SafeArrayUnlock( safeArray);
+ }
+ else
+ {
+ php_error( E_WARNING,"phpArrayToSafeArray() - Unable to lock safeArray");
+ }
+ }
+ }
break;
- }
+
case IS_RESOURCE:
case IS_CONSTANT:
case IS_CONSTANT_ARRAY:
@@ -409,10 +467,11 @@ PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent,
var_reset(pval_arg);
return FAILURE;
}
+ SafeArrayLock( array);
/* This call has failed for everything I have tried */
/* But best leave it to be on the safe side */
- if (S_OK != SafeArrayGetVartype(array, &vartype))
+ if (FAILED(SafeArrayGetVartype(array, &vartype)))
{
/* Fall back to what we do know */
/* Mask off the array bit and assume */
@@ -444,7 +503,7 @@ PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent,
V_VT(&vv) = vartype;
hr = SafeArrayGetElement(array, indices, (VOID *) &(vv.lVal));
}
- if (S_OK != hr)
+ if (FAILED(hr))
{
/* Failure to retieve an element probably means the array is sparse */
/* So leave the php array sparse too */
@@ -476,7 +535,7 @@ PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent,
add_index_zval(pval_arg, ii, element);
}
}
-
+ SafeArrayUnlock(array);
/* Clean up the SafeArray since that is our responsibility */
SafeArrayDestroyData(array);
SafeArrayDestroyDescriptor(array);