X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_requestdatashare_object.c;h=060493556807323dce2e14c4e02f5eb9ca1cc74e;hp=af8e9d49426f0ee0d80b18c8dbb273f748510936;hb=ad5f896b03adaa073134a00108a9cdf00720673a;hpb=7ea5445a6250f29f09d6b97db124cacf457f23c5 diff --git a/http_requestdatashare_object.c b/http_requestdatashare_object.c index af8e9d4..0604935 100644 --- a/http_requestdatashare_object.c +++ b/http_requestdatashare_object.c @@ -6,7 +6,7 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2006, Michael Wallner | + | Copyright (c) 2004-2010, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -47,6 +47,11 @@ HTTP_END_ARGS; HTTP_EMPTY_ARGS(reset); +HTTP_BEGIN_ARGS(factory, 0) + HTTP_ARG_VAL(global, 0) + HTTP_ARG_VAL(class_name, 0) +HTTP_END_ARGS; + #ifndef WONKY HTTP_BEGIN_ARGS(singleton, 0) HTTP_ARG_VAL(global, 0) @@ -55,13 +60,13 @@ HTTP_END_ARGS; #define http_requestdatashare_object_read_prop _http_requestdatashare_object_read_prop -static zval *_http_requestdatashare_object_read_prop(zval *object, zval *member, int type TSRMLS_DC); +static zval *_http_requestdatashare_object_read_prop(zval *object, zval *member, int type ZEND_LITERAL_KEY_DC TSRMLS_DC); #define http_requestdatashare_object_write_prop _http_requestdatashare_object_write_prop -static void _http_requestdatashare_object_write_prop(zval *object, zval *member, zval *value TSRMLS_DC); +static void _http_requestdatashare_object_write_prop(zval *object, zval *member, zval *value ZEND_LITERAL_KEY_DC TSRMLS_DC); #define http_requestdatashare_instantiate(t, g) _http_requestdatashare_instantiate((t), (g) TSRMLS_CC) static inline zval *_http_requestdatashare_instantiate(zval *this_ptr, zend_bool global TSRMLS_DC); -#define OBJ_PROP_CE http_requestdatashare_object_ce +#define THIS_CE http_requestdatashare_object_ce zend_class_entry *http_requestdatashare_object_ce; zend_function_entry http_requestdatashare_object_fe[] = { HTTP_RSHARE_ME(__destruct, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR) @@ -69,6 +74,7 @@ zend_function_entry http_requestdatashare_object_fe[] = { HTTP_RSHARE_ME(attach, ZEND_ACC_PUBLIC) HTTP_RSHARE_ME(detach, ZEND_ACC_PUBLIC) HTTP_RSHARE_ME(reset, ZEND_ACC_PUBLIC) + HTTP_RSHARE_ME(factory, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) #ifndef WONKY HTTP_RSHARE_ME(singleton, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) #endif @@ -87,11 +93,11 @@ PHP_MINIT_FUNCTION(http_requestdatashare_object) zend_class_implements(http_requestdatashare_object_ce TSRMLS_CC, 1, spl_ce_Countable); #endif - DCL_STATIC_PROP_N(PRIVATE, instance); - DCL_PROP(PUBLIC, bool, cookie, 0); - DCL_PROP(PUBLIC, bool, dns, 0); - DCL_PROP(PUBLIC, bool, ssl, 0); - DCL_PROP(PUBLIC, bool, connect, 0); + zend_declare_property_null(THIS_CE, ZEND_STRS("instance")-1, (ZEND_ACC_STATIC|ZEND_ACC_PRIVATE) TSRMLS_CC); + zend_declare_property_bool(THIS_CE, ZEND_STRS("cookie")-1, 0, ZEND_ACC_PUBLIC TSRMLS_CC); + zend_declare_property_bool(THIS_CE, ZEND_STRS("dns")-1, 0, ZEND_ACC_PUBLIC TSRMLS_CC); + zend_declare_property_bool(THIS_CE, ZEND_STRS("ssl")-1, 0, ZEND_ACC_PUBLIC TSRMLS_CC); + zend_declare_property_bool(THIS_CE, ZEND_STRS("connect")-1, 0, ZEND_ACC_PUBLIC TSRMLS_CC); return SUCCESS; } @@ -119,9 +125,13 @@ zend_object_value _http_requestdatashare_object_new_ex(zend_class_entry *ce, htt *ptr = o; } +#if PHP_VERSION_ID < 50399 ALLOC_HASHTABLE(OBJ_PROP(o)); zend_hash_init(OBJ_PROP(o), zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); +#else + object_properties_init(&o->zo, ce); +#endif ov.handle = putObject(http_requestdatashare_object, o); ov.handlers = &http_requestdatashare_object_handlers; @@ -139,41 +149,43 @@ void _http_requestdatashare_object_free(zend_object *object TSRMLS_DC) freeObject(o); } -static zval *_http_requestdatashare_object_read_prop(zval *object, zval *member, int type TSRMLS_DC) +static zval *_http_requestdatashare_object_read_prop(zval *object, zval *member, int type ZEND_LITERAL_KEY_DC TSRMLS_DC) { - if (type == BP_VAR_W && zend_hash_exists(&OBJ_PROP_CE->default_properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1)) { + if (type == BP_VAR_W && +#if PHP_VERSION_ID < 50399 + zend_hash_exists(&THIS_CE->default_properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1) +#else + zend_get_property_info(THIS_CE, member, 1 TSRMLS_CC) +#endif + ) { zend_error(E_ERROR, "Cannot access HttpRequestDataShare default properties by reference or array key/index"); return NULL; } - return zend_get_std_object_handlers()->read_property(object, member, type TSRMLS_CC); + return zend_get_std_object_handlers()->read_property(object, member, type ZEND_LITERAL_KEY_CC TSRMLS_CC); } -static void _http_requestdatashare_object_write_prop(zval *object, zval *member, zval *value TSRMLS_DC) +static void _http_requestdatashare_object_write_prop(zval *object, zval *member, zval *value ZEND_LITERAL_KEY_DC TSRMLS_DC) { - if (zend_hash_exists(&OBJ_PROP_CE->default_properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1)) { +#if PHP_VERSION_ID < 50399 + if (zend_hash_exists(&THIS_CE->default_properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1)) { +#else + if (zend_get_property_info(THIS_CE, member, 1 TSRMLS_CC)) { +#endif int status; - zval *orig = value; getObjectEx(http_requestdatashare_object, obj, object); - SEPARATE_ZVAL_IF_NOT_REF(&value); - status = http_request_datashare_set(obj->share, Z_STRVAL_P(member), Z_STRLEN_P(member), zval_is_true(value)); - if (orig != value) { - zval_ptr_dtor(&value); - value = orig; - } + status = http_request_datashare_set(obj->share, Z_STRVAL_P(member), Z_STRLEN_P(member), (zend_bool) i_zend_is_true(value)); if (SUCCESS != status) { return; } } - zend_get_std_object_handlers()->write_property(object, member, value TSRMLS_CC); + zend_get_std_object_handlers()->write_property(object, member, value ZEND_LITERAL_KEY_CC TSRMLS_CC); } /* {{{ proto void HttpRequestDataShare::__destruct() - * - * Clean up HttpRequestDataShare object. - */ + Clean up HttpRequestDataShare object. */ PHP_METHOD(HttpRequestDataShare, __destruct) { NO_ARGS { @@ -184,9 +196,7 @@ PHP_METHOD(HttpRequestDataShare, __destruct) /* }}} */ /* {{{ proto int HttpRequestDataShare::count() - * - * Implements Countable::count(). - */ + Implements Countable::count(). */ PHP_METHOD(HttpRequestDataShare, count) { getObject(http_requestdatashare_object, obj); @@ -229,15 +239,29 @@ PHP_METHOD(HttpRequestDataShare, reset) } } +PHP_METHOD(HttpRequestDataShare, factory) +{ + zend_bool global = 0; + char *cn = NULL; + int cl = 0; + zend_object_value ov; + + SET_EH_THROW_HTTP(); + if ( SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|bs", &global, &cn, &cl) && + SUCCESS == http_object_new(&ov, cn, cl, _http_requestdatashare_object_new_ex, http_requestdatashare_object_ce, NULL, NULL)) { + RETVAL_OBJVAL(ov, 0); + http_requestdatashare_instantiate(return_value, global); + } + SET_EH_NORMAL(); +} + #ifndef WONKY /* {{{ proto static HttpRequestDataShare HttpRequestDataShare::singleton([bool global = false]) - * - * Get a single instance (differentiates between the global setting). - */ + Get a single instance (differentiates between the global setting). */ PHP_METHOD(HttpRequestDataShare, singleton) { zend_bool global = 0; - zval *instance = GET_STATIC_PROP(instance); + zval *instance = *zend_std_get_static_property(THIS_CE, ZEND_STRS("instance")-1, 0 ZEND_LITERAL_NIL_CC TSRMLS_CC); SET_EH_THROW_HTTP(); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &global)) { @@ -259,13 +283,14 @@ PHP_METHOD(HttpRequestDataShare, singleton) add_index_zval(instance, global, zobj); RETVAL_OBJECT(zobj, 1); - SET_STATIC_PROP(instance, instance); + zend_update_static_property(THIS_CE, ZEND_STRS("instance")-1, instance TSRMLS_CC); zval_ptr_dtor(&instance); } } SET_EH_NORMAL(); } /* }}} */ +#endif /* !WONKY */ static inline zval *_http_requestdatashare_instantiate(zval *this_ptr, zend_bool global TSRMLS_DC) { @@ -276,23 +301,20 @@ static inline zval *_http_requestdatashare_instantiate(zval *this_ptr, zend_bool } if (global) { if (HTTP_G->request.datashare.cookie) { - UPD_PROP(bool, cookie, HTTP_G->request.datashare.cookie); + zend_update_property_bool(THIS_CE, getThis(), ZEND_STRS("cookie")-1, HTTP_G->request.datashare.cookie TSRMLS_CC); } if (HTTP_G->request.datashare.dns) { - UPD_PROP(bool, dns, HTTP_G->request.datashare.dns); + zend_update_property_bool(THIS_CE, getThis(), ZEND_STRS("dns")-1, HTTP_G->request.datashare.dns TSRMLS_CC); } if (HTTP_G->request.datashare.ssl) { - UPD_PROP(bool, ssl, HTTP_G->request.datashare.ssl); + zend_update_property_bool(THIS_CE, getThis(), ZEND_STRS("ssl")-1, HTTP_G->request.datashare.ssl TSRMLS_CC); } if (HTTP_G->request.datashare.connect) { - UPD_PROP(bool, connect, HTTP_G->request.datashare.connect); + zend_update_property_bool(THIS_CE, getThis(), ZEND_STRS("connect")-1, HTTP_G->request.datashare.connect TSRMLS_CC); } } return this_ptr; } -#endif - - #endif /* ZEND_ENGINE_2 && HTTP_HAVE_CURL */