diff options
author | Harald Radi <phanto@php.net> | 2001-06-12 16:31:54 +0000 |
---|---|---|
committer | Harald Radi <phanto@php.net> | 2001-06-12 16:31:54 +0000 |
commit | 0f3ab761b6a57d42dd5f78c7c33f979483ec5848 (patch) | |
tree | 3a1a79b1c95d6d3a244cc87a587ee75457167762 /ext | |
parent | 92eb51fde2f152c997f371fa5fcf0e3404a76a08 (diff) | |
download | php-git-0f3ab761b6a57d42dd5f78c7c33f979483ec5848.tar.gz |
added experimetal php->safearray support
Diffstat (limited to 'ext')
-rw-r--r-- | ext/com/conversion.c | 75 | ||||
-rw-r--r-- | ext/rpc/com/conversion.c | 75 |
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); |