* use the resource factory
[m6w6/ext-http] / php_http_request.h
index b8486123a5d2f48ba7dcb7a6c502c86082115c63..96baa3634440389839f78de9f04f541ffe3c1cfa 100644 (file)
@@ -28,17 +28,39 @@ typedef struct php_http_request_progress_state {
                double now;
                double total;
        } dl;
+       const char *info;
        unsigned started:1;
        unsigned finished:1;
 } php_http_request_progress_state_t;
 
+#define PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER 0
+#define PHP_HTTP_REQUEST_PROGRESS_CALLBACK_INTERN 1
+typedef struct php_http_request_progress_callback {
+       union {
+               zval *user;
+               void (*intern)(php_http_request_progress_state_t* TSRMLS_DC);
+       } func;
+       unsigned type:1;
+       unsigned pass_state:1;
+} php_http_request_progress_callback_t;
+
 typedef struct php_http_request_progress {
        php_http_request_progress_state_t state;
-       zval *callback;
+       php_http_request_progress_callback_t *callback;
        unsigned in_cb:1;
-       unsigned pass_state:1;
 } php_http_request_progress_t;
 
+static inline void php_http_request_progress_dtor(php_http_request_progress_t *progress TSRMLS_DC)
+{
+       if (progress->callback) {
+               if (progress->callback->type == PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER) {
+                       zval_ptr_dtor(&progress->callback->func.user);
+               }
+               efree(progress->callback);
+       }
+       memset(progress, 0, sizeof(*progress));
+}
+
 static inline void php_http_request_progress_notify(php_http_request_progress_t *progress TSRMLS_DC)
 {
        if (progress->callback) {
@@ -48,27 +70,37 @@ static inline void php_http_request_progress_notify(php_http_request_progress_t
                ZVAL_NULL(&retval);
 
                with_error_handling(EH_NORMAL, NULL) {
-                       if (progress->pass_state) {
-                               zval *param;
-
-                               MAKE_STD_ZVAL(param);
-                               array_init(param);
-                               add_assoc_bool(param, "started", progress->state.started);
-                               add_assoc_bool(param, "finished", progress->state.finished);
-                               add_assoc_double(param, "dltotal", progress->state.dl.total);
-                               add_assoc_double(param, "dlnow", progress->state.dl.now);
-                               add_assoc_double(param, "ultotal", progress->state.ul.total);
-                               add_assoc_double(param, "ulnow", progress->state.ul.now);
-
-                               progress->in_cb = 1;
-                               call_user_function(EG(function_table), NULL, progress->callback, &retval, 1, &param TSRMLS_CC);
-                               progress->in_cb = 0;
-
-                               zval_ptr_dtor(&param);
-                       } else {
-                               progress->in_cb = 1;
-                               call_user_function(EG(function_table), NULL, progress->callback, &retval, 0, NULL TSRMLS_CC);
-                               progress->in_cb = 0;
+                       switch (progress->callback->type) {
+                               case PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER:
+                                       if (progress->callback->pass_state) {
+                                               zval *param;
+
+                                               MAKE_STD_ZVAL(param);
+                                               array_init(param);
+                                               add_assoc_bool(param, "started", progress->state.started);
+                                               add_assoc_bool(param, "finished", progress->state.finished);
+                                               add_assoc_string(param, "info", estrdup(progress->state.info), 0);
+                                               add_assoc_double(param, "dltotal", progress->state.dl.total);
+                                               add_assoc_double(param, "dlnow", progress->state.dl.now);
+                                               add_assoc_double(param, "ultotal", progress->state.ul.total);
+                                               add_assoc_double(param, "ulnow", progress->state.ul.now);
+
+                                               progress->in_cb = 1;
+                                               call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 1, &param TSRMLS_CC);
+                                               progress->in_cb = 0;
+
+                                               zval_ptr_dtor(&param);
+                                       } else {
+                                               progress->in_cb = 1;
+                                               call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 0, NULL TSRMLS_CC);
+                                               progress->in_cb = 0;
+                                       }
+                                       break;
+                               case PHP_HTTP_REQUEST_PROGRESS_CALLBACK_INTERN:
+                                       progress->callback->func.intern(progress->callback->pass_state ? &progress->state : NULL TSRMLS_CC);
+                                       break;
+                               default:
+                                       break;
                        }
                } end_error_handling();
 
@@ -78,8 +110,7 @@ static inline void php_http_request_progress_notify(php_http_request_progress_t
 
 typedef enum php_http_request_setopt_opt {
        PHP_HTTP_REQUEST_OPT_SETTINGS,                                          /* HashTable* */
-       PHP_HTTP_REQUEST_OPT_PROGRESS_CALLBACK,                         /* zval* */
-       PHP_HTTP_REQUEST_OPT_PROGRESS_CALLBACK_WANTS_STATE,     /* int* */
+       PHP_HTTP_REQUEST_OPT_PROGRESS_CALLBACK,                         /* php_http_request_progress_callback_t* */
        PHP_HTTP_REQUEST_OPT_COOKIES_ENABLE,                            /* - */
        PHP_HTTP_REQUEST_OPT_COOKIES_RESET,                                     /* - */
        PHP_HTTP_REQUEST_OPT_COOKIES_RESET_SESSION,                     /* - */
@@ -102,6 +133,7 @@ typedef STATUS (*php_http_request_setopt_func_t)(php_http_request_t *h, php_http
 typedef STATUS (*php_http_request_getopt_func_t)(php_http_request_t *h, php_http_request_getopt_opt_t opt, void *arg);
 
 typedef struct php_http_request_ops {
+       php_http_resource_factory_ops_t *rsrc;
        php_http_request_init_func_t init;
        php_http_request_copy_func_t copy;
        php_http_request_dtor_func_t dtor;
@@ -115,16 +147,18 @@ PHP_HTTP_API php_http_request_ops_t *php_http_request_get_default_ops(TSRMLS_D);
 
 struct php_http_request {
        void *ctx;
+       php_http_resource_factory_t *rf;
        php_http_request_ops_t *ops;
        php_http_message_parser_t *parser;
        php_http_message_t *message;
        php_http_buffer_t *buffer;
+       zval *persistent_handle_id;
 #ifdef ZTS
        void ***ts;
 #endif
 };
 
-PHP_HTTP_API php_http_request_t *php_http_request_init(php_http_request_t *h, php_http_request_ops_t *ops, void *init_arg TSRMLS_DC);
+PHP_HTTP_API php_http_request_t *php_http_request_init(php_http_request_t *h, php_http_request_ops_t *ops, php_http_resource_factory_t *rf, void *init_arg TSRMLS_DC);
 PHP_HTTP_API php_http_request_t *php_http_request_copy(php_http_request_t *from, php_http_request_t *to);
 PHP_HTTP_API STATUS php_http_request_exec(php_http_request_t *h, php_http_request_method_t meth, const char *url, php_http_message_body_t *body);
 PHP_HTTP_API STATUS php_http_request_reset(php_http_request_t *h);