58#define SA_FETCH(zv) (php_com_saproxy*)Z_OBJ_P(zv)
64 for (i = 0; i < ndims; i++) {
103 for (i = 1; i < (UINT) proxy->
dimensions; i++) {
108 if (!try_convert_to_string(&proxy->
indices[0])) {
115 DISPATCH_METHOD|DISPATCH_PROPERTYGET, &
v,
123 }
else if (
res == DISP_E_BADPARAMCOUNT) {
130 }
else if (!V_ISARRAY(&proxy->
obj->
v)) {
140 sa = V_ARRAY(&proxy->
obj->
v);
141 dims = SafeArrayGetDim(sa);
150 SafeArrayGetLBound(sa, proxy->
dimensions, &lbound);
151 SafeArrayGetUBound(sa, proxy->
dimensions, &ubound);
169 for (i = 0; i <
dims; i++) {
178 if (FAILED(SafeArrayGetVartype(sa, &
vt)) ||
vt ==
VT_EMPTY) {
183 res = SafeArrayGetElement(sa, indices, &
v);
186 res = SafeArrayGetElement(sa, indices, &
v.lVal);
191 if (SUCCEEDED(
res)) {
220 for (i = 1; i < (UINT) proxy->
dimensions; i++) {
226 if (!try_convert_to_string(&proxy->
indices[0])) {
239 }
else if (V_ISARRAY(&proxy->
obj->
v)) {
243 dims = SafeArrayGetDim(V_ARRAY(&proxy->
obj->
v));
246 for (i = 0; i <
dims; i++) {
255 if (FAILED(SafeArrayGetVartype(V_ARRAY(&proxy->
obj->
v), &
vt)) ||
vt ==
VT_EMPTY) {
262 if (V_VT(&
v) !=
vt) {
263 VariantChangeType(&
v, &
v, 0,
vt);
267 res = SafeArrayPutElement(V_ARRAY(&proxy->
obj->
v), indices, &
v);
269 res = SafeArrayPutElement(V_ARRAY(&proxy->
obj->
v), indices, &
v.lVal);
283static int saproxy_property_exists(
zend_object *
object,
zend_string *member,
int check_empty,
void **cache_slot)
289static int saproxy_dimension_exists(
zend_object *
object,
zval *member,
int check_empty)
329static int saproxy_objects_compare(
zval *object1,
zval *object2)
345 if (!V_ISARRAY(&proxy->
obj->
v)) {
349 SafeArrayGetLBound(V_ARRAY(&proxy->
obj->
v), proxy->
dimensions, &lbound);
350 SafeArrayGetUBound(V_ARRAY(&proxy->
obj->
v), proxy->
dimensions, &ubound);
352 *
count = ubound - lbound + 1;
357static void saproxy_free_storage(
zend_object *
object)
380 cloneproxy =
emalloc(
sizeof(*cloneproxy));
381 memcpy(cloneproxy, proxy,
sizeof(*cloneproxy));
385 clone_indices(cloneproxy, proxy, proxy->
dimensions);
387 return &cloneproxy->
std;
392 saproxy_free_storage,
395 saproxy_property_read,
396 saproxy_property_write,
397 saproxy_read_dimension,
398 saproxy_write_dimension,
400 saproxy_property_exists,
401 saproxy_property_delete,
402 saproxy_dimension_exists,
403 saproxy_dimension_delete,
404 saproxy_properties_get,
406 saproxy_constructor_get,
407 saproxy_class_name_get,
409 saproxy_count_elements,
414 saproxy_objects_compare,
422 proxy =
ecalloc(1,
sizeof(*proxy));
472 I->indices[
I->proxy->dimensions-1] =
I->key;
474 sa = V_ARRAY(&
I->proxy->obj->v);
476 if (FAILED(SafeArrayGetVartype(sa, &
vt)) ||
vt ==
VT_EMPTY) {
482 SafeArrayGetElement(sa,
I->indices, &
v);
485 SafeArrayGetElement(sa,
I->indices, &
v.lVal);
510 if (++
I->key >=
I->imax) {
518 saproxy_iter_get_data,
519 saproxy_iter_get_key,
520 saproxy_iter_move_forwards,
538 I->iter.funcs = &saproxy_iter_funcs;
551 SafeArrayGetLBound(V_ARRAY(&proxy->
obj->
v), proxy->
dimensions, &
I->imin);
552 SafeArrayGetUBound(V_ARRAY(&proxy->
obj->
v), proxy->
dimensions, &
I->imax);
count(Countable|array $value, int $mode=COUNT_NORMAL)
zend_result php_com_do_invoke(php_com_dotnet_object *obj, zend_string *name, WORD flags, VARIANT *v, int nargs, zval *args, bool allow_noarg)
zend_class_entry * php_com_saproxy_class_entry
PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v, int codepage)
void php_com_throw_exception(HRESULT code, char *message)
zend_object_iterator * php_com_saproxy_iter_get(zend_class_entry *ce, zval *object, int by_ref)
zend_object_handlers php_com_saproxy_handlers
void php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index)
PHP_COM_DOTNET_API zend_result php_com_zval_from_variant(zval *z, VARIANT *v, int codepage)
PHP_COM_DOTNET_API void php_com_variant_from_zval(VARIANT *v, zval *z, int codepage)
struct _php_com_dotnet_object php_com_dotnet_object
unsigned char key[REFLECTION_KEY_LEN]
zend_object_iterator iter
php_com_dotnet_object * obj
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
#define ecalloc(nmemb, size)
#define safe_emalloc(nmemb, size, offset)
union _zend_function zend_function
struct _zend_object_iterator zend_object_iterator
struct _zend_object_iterator_funcs zend_object_iterator_funcs
struct _zend_string zend_string
#define ZEND_COMPARE_OBJECTS_FALLBACK(op1, op2)
ZEND_API void zend_objects_destroy_object(zend_object *object)
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
ZEND_API void ZEND_FASTCALL convert_to_long(zval *op)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
struct _zend_array HashTable
ZEND_RESULT_CODE zend_result
struct _zend_object_handlers zend_object_handlers
#define ZVAL_COPY_VALUE(z, v)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)