| Author: Zeev Suraski <zeev@zend.com> |
| Harald Radi <h.radi@nme.at> |
| Alan Brown <abrown@pobox.com> |
- | Wez Furlong <wez@thebrainroom.com> |
+ | Wez Furlong <wez@thebrainroom.com> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
}
}
- RETURN_RESOURCE(zend_list_insert(obj, IS_COM));
+ RETVAL_COM(obj);
}
/* }}} */
int current_arg, current_variant;
unsigned long count;
- if (C_HASENUM(obj) && strstr(Z_STRVAL_P(function_name), "next")) {
+ if (C_HASENUM(obj) && strstr(Z_STRVAL_P(function_name), "next")) {
/* Grab one argument off the stack, allocate enough
* VARIANTs
* Get the IEnumVariant interface and call ->Next();
return SUCCESS;
}
+
/* {{{ proto mixed com_invoke_ex(int module, int invokeflags, string handler_name [, mixed arg [, mixed ...]])
Invokes a COM module */
PHP_FUNCTION(com_invoke_ex)
dispflags = (WORD)Z_LVAL_P(invokeflags);
/* obtain IDispatch interface */
- if (Z_TYPE_P(object) == IS_OBJECT && (Z_OBJCE_P(object) == &COM_class_entry || !strcmp(Z_OBJCE_P(object)->name, "COM"))) {
- zval **tmp;
- zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**)&tmp);
- ZEND_FETCH_RESOURCE(obj, comval*, tmp, -1, "comval", IS_COM);
- } else if (Z_TYPE_P(object) == IS_RESOURCE) {
- ZEND_FETCH_RESOURCE(obj, comval*, &object, -1, "comval", IS_COM);
- }
- if (obj == NULL) {
- php_error(E_WARNING, "%d is not a COM object handler", Z_LVAL_P(object));
- RETURN_NULL();
- }
+ FETCH_COM_SAFE(object, obj);
ALLOC_VARIANT(var_result);
function_name = arguments[1];
/* obtain IDispatch interface */
- convert_to_long(object);
- obj = (comval *)zend_list_find(Z_LVAL_P(object), &type);
- if (!obj || (type != IS_COM)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not a COM object handler", Z_STRVAL_P(function_name));
- RETURN_NULL();
- }
+ FETCH_COM_SAFE(object, obj);
/* obtain property/method handler */
convert_to_string_ex(&function_name);
}
/* obtain IDispatch interface */
- convert_to_long_ex(&object);
- obj = (comval *)zend_list_find(Z_LVAL_P(object), &type);
- if (!obj || (type != IS_COM)) {
- php_error(E_WARNING, "%s(): %d is not a COM object handler", get_active_function_name(TSRMLS_C));
- RETURN_FALSE;
- }
+ FETCH_COM_SAFE(object, obj);
RETURN_LONG(php_COM_release(obj TSRMLS_CC))
}
}
/* obtain IDispatch interface */
- convert_to_long_ex(&object);
- obj = (comval *)zend_list_find(Z_LVAL_P(object), &type);
- if (!obj || (type != IS_COM))
- {
- php_error(E_WARNING, "%s(): %d is not a COM object handler", get_active_function_name(TSRMLS_C));
- RETURN_FALSE;
- }
+ FETCH_COM_SAFE(object, obj);
RETURN_LONG(php_COM_addref(obj TSRMLS_CC));
}
RETURN_FALSE;
}
- if (Z_TYPE_P(arg1) == IS_OBJECT && (Z_OBJCE_P(arg1) == &COM_class_entry || !strcmp(Z_OBJCE_P(arg1)->name, "COM"))) {
- zval **tmp;
- zend_hash_index_find(Z_OBJPROP_P(arg1), 0, (void**)&tmp);
- ZEND_FETCH_RESOURCE(obj, comval*, tmp, -1, "comval", IS_COM);
- } else if (Z_TYPE_P(arg1) == IS_RESOURCE) {
- ZEND_FETCH_RESOURCE(obj, comval*, &arg1, -1, "comval", IS_COM);
+ if (Z_TYPE_P(arg1) == IS_OBJECT) {
+ FETCH_COM_SAFE(arg1, obj);
} else {
convert_to_string(arg1);
typelibname = Z_STRVAL_P(arg1);
RETURN_FALSE;
}
- if (Z_TYPE_P(object) == IS_OBJECT && (Z_OBJCE_P(object) == &COM_class_entry || !strcmp(Z_OBJCE_P(object)->name, "COM"))) {
- zval **tmp;
- zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**)&tmp);
- ZEND_FETCH_RESOURCE(obj, comval*, tmp, -1, "comval", IS_COM);
- } else {
- ZEND_FETCH_RESOURCE(obj, comval*, &object, -1, "comval", IS_COM);
- }
-
+ FETCH_COM_SAFE(object, obj);
+
if (sink && Z_TYPE_P(sink) == IS_ARRAY) {
/* 0 => typelibname, 1 => dispname */
zval **tmp;
hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC);
if (SUCCEEDED(hr)) {
- php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
+ RETVAL_VARIANT(var_result);
} else {
+ FREE_VARIANT(var_result);
+
*return_value = *value;
zval_copy_ctor(return_value);
}
if (ErrString) {
pefree(ErrString, 1);
}
+ } else {
+ FREE_VARIANT(var_result);
}
- FREE_VARIANT(var_result);
-
efree(new_value); // FREE_VARIANT does a VariantClear() which is not desired here !
efree(propname);
}
object = arguments[0];
function_name = arguments[1];
- if (Z_TYPE_P(object) == IS_OBJECT && (Z_OBJCE_P(object) == &COM_class_entry || !strcmp(Z_OBJCE_P(object)->name, "COM"))) {
- zval **tmp;
- zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**)&tmp);
- ZEND_FETCH_RESOURCE(obj, comval*, tmp, -1, "comval", IS_COM);
- } else if (Z_TYPE_P(object) == IS_RESOURCE) {
- ZEND_FETCH_RESOURCE(obj, comval*, &object, -1, "comval", IS_COM);
- }
- if (obj == NULL) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "parameter 1 is not a COM object handler");
- RETURN_NULL();
- }
-
+ FETCH_COM_SAFE(object, obj);
+
/* obtain property/method handler */
convert_to_string_ex(&function_name);
object = arguments[0];
function_name = arguments[1];
- if (Z_TYPE_P(object) == IS_OBJECT && (Z_OBJCE_P(object) == &COM_class_entry || !strcmp(Z_OBJCE_P(object)->name, "COM"))) {
- zval **tmp;
- zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**)&tmp);
- ZEND_FETCH_RESOURCE(obj, comval*, tmp, -1, "comval", IS_COM);
- } else if (Z_TYPE_P(object) == IS_RESOURCE) {
- ZEND_FETCH_RESOURCE(obj, comval*, &object, -1, "comval", IS_COM);
- }
- if (obj == NULL) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "parameter 1 is not a COM object handler");
- RETURN_NULL();
- }
-
+ FETCH_COM_SAFE(object, obj);
+
/* obtain property/method handler */
convert_to_string_ex(&function_name);
{
zend_overloaded_element *overloaded_property;
zend_llist_element *element;
- pval return_value;
+ pval retval;
+ pval *return_value = &retval;
pval **comval_handle;
pval *object = property_reference->object;
int type;
VARIANT *var_result;
TSRMLS_FETCH();
- INIT_ZVAL(return_value);
- ZVAL_NULL(&return_value);
+ INIT_ZVAL(retval);
+ ZVAL_NULL(&retval);
/* fetch the IDispatch interface */
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void **) &comval_handle);
obj = (comval *) zend_list_find(Z_LVAL_P(*comval_handle), &type);
if (!obj || (type != IS_COM)) {
- return return_value;
+ return retval;
}
ALLOC_COM(obj_prop);
FREE_VARIANT(var_result);
FREE_COM(obj_prop);
- return return_value;
+ return retval;
}
break;
FREE_VARIANT(var_result);
FREE_COM(obj_prop);
- return return_value;
+ return retval;
}
break;
if (obj != obj_prop) {
FREE_COM(obj_prop);
- return_value = *object;
- ZVAL_ADDREF(&return_value);
+ retval = *object;
+ ZVAL_ADDREF(return_value);
} else {
RETVAL_COM(obj);
}
- return return_value;
+ return retval;
}
if (obj == obj_prop) {
FREE_VARIANT(var_result);
FREE_COM(obj_prop);
- return return_value;
+ return retval;
}
obj = obj_prop;
php_COM_set(obj, &V_DISPATCH(var_result), TRUE TSRMLS_CC);
VariantInit(var_result); // to protect C_DISPATCH(obj) from being freed when var_result is destructed
} else {
- php_variant_to_pval(var_result, &return_value, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
FREE_COM(obj_prop);
obj_prop = NULL;
FREE_VARIANT(var_result);
- return return_value;
+ return retval;
}
if (zend_llist_count(property_reference->elements_list)==1
&& !strcmp(Z_STRVAL(function_name->element), "com")) {
/* constructor */
- pval *object_handle;
-
PHP_FN(com_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
- if (zend_is_true(return_value)) {
- ALLOC_ZVAL(object_handle);
- *object_handle = *return_value;
- pval_copy_constructor(object_handle);
- INIT_PZVAL(object_handle);
- zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
- pval_destructor(&function_name->element);
- } else {
- ZVAL_NULL(object);
- }
-
+ *object = *return_value;
+ pval_copy_constructor(object);
+ pval_destructor(&function_name->element);
return;
}
zend_get_parameters_array(ht, arg_count, arguments);
if (do_COM_invoke(obj , DISPATCH_METHOD|DISPATCH_PROPERTYGET, &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == SUCCESS) {
- php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
+ RETVAL_VARIANT(var_result);
+ } else {
+ FREE_VARIANT(var_result);
}
-
- FREE_VARIANT(var_result);
+
efree(arguments);
}
zend_get_parameters(ht, 1, &object);
/* obtain IDispatch interface */
- zend_hash_index_find(Z_OBJPROP_P(object), 0, (void **) &comval_handle);
- obj = (comval *) zend_list_find(Z_LVAL_PP(comval_handle), &type);
- if (!obj || (type != IS_COM)) {
- php_error(E_WARNING,"%s(): %s is not a COM object handler", get_active_function_name(TSRMLS_C), "");
- RETURN_FALSE;
- }
+ FETCH_COM_SAFE(object, obj);
RETURN_BOOL(C_HASENUM(obj));
}