+ for (i = 0; i < argc; ++i) {
+ if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), http_request_object_ce TSRMLS_CC)) {
+ http_request_pool_attach(&obj->pool, *(argv[i]));
+ }
+ }
+ }
+ efree(argv);
+ SET_EH_NORMAL();
+ http_final(HTTP_EX_CE(request_pool));
+}
+/* }}} */
+
+/* {{{ proto void HttpRequestPool::__destruct()
+ Clean up HttpRequestPool object. */
+PHP_METHOD(HttpRequestPool, __destruct)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ http_request_pool_detach_all(&obj->pool);
+}
+/* }}} */
+
+/* {{{ proto void HttpRequestPool::reset()
+ Detach all attached HttpRequest objects. */
+PHP_METHOD(HttpRequestPool, reset)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ obj->iterator.pos = 0;
+ http_request_pool_detach_all(&obj->pool);
+}
+
+/* {{{ proto bool HttpRequestPool::attach(HttpRequest request)
+ Attach an HttpRequest object to this HttpRequestPool. WARNING: set all options prior attaching! */
+PHP_METHOD(HttpRequestPool, attach)
+{
+ zval *request;
+ STATUS status = FAILURE;
+ getObject(http_requestpool_object, obj);
+
+ SET_EH_THROW_HTTP();
+ if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) {
+ if (obj->iterator.pos > 0 && obj->iterator.pos < zend_llist_count(&obj->pool.handles)) {
+ http_error(HE_THROW, HTTP_E_REQUEST_POOL, "Cannot attach to the HttpRequestPool while the iterator is active");
+ } else {
+ status = http_request_pool_attach(&obj->pool, request);
+ }
+ }
+ SET_EH_NORMAL();
+ RETURN_SUCCESS(status);
+}
+/* }}} */
+
+/* {{{ proto bool HttpRequestPool::detach(HttpRequest request)
+ Detach an HttpRequest object from this HttpRequestPool. */
+PHP_METHOD(HttpRequestPool, detach)
+{
+ zval *request;
+ STATUS status = FAILURE;
+ getObject(http_requestpool_object, obj);
+
+ SET_EH_THROW_HTTP();
+ if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) {
+ obj->iterator.pos = -1;
+ status = http_request_pool_detach(&obj->pool, request);
+ }
+ SET_EH_NORMAL();
+ RETURN_SUCCESS(status);
+}
+/* }}} */
+
+/* {{{ proto bool HttpRequestPool::send()
+ Send all attached HttpRequest objects in parallel. */
+PHP_METHOD(HttpRequestPool, send)
+{
+ STATUS status;
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ SET_EH_THROW_HTTP();
+ status = http_request_pool_send(&obj->pool);
+ SET_EH_NORMAL();
+
+ /* rethrow as HttpRequestPoolException */
+ http_final(HTTP_EX_CE(request_pool));
+
+ RETURN_SUCCESS(status);
+}
+/* }}} */
+
+/* {{{ proto protected bool HttpRequestPool::socketPerform()
+ Returns TRUE until each request has finished its transaction. */
+PHP_METHOD(HttpRequestPool, socketPerform)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ if (0 < http_request_pool_perform(&obj->pool)) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto protected bool HttpRequestPool::socketSelect() */
+PHP_METHOD(HttpRequestPool, socketSelect)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ RETURN_SUCCESS(http_request_pool_select(&obj->pool));
+}
+/* }}} */
+
+/* {{{ proto bool HttpRequestPool::valid()
+ Implements Iterator::valid(). */
+PHP_METHOD(HttpRequestPool, valid)
+{
+ NO_ARGS;
+
+ if (return_value_used) {
+ getObject(http_requestpool_object, obj);
+ RETURN_BOOL(obj->iterator.pos >= 0 && obj->iterator.pos < zend_llist_count(&obj->pool.handles));
+ }
+}
+/* }}} */
+
+/* {{{ proto HttpRequest HttpRequestPool::current()
+ Implements Iterator::current(). */
+PHP_METHOD(HttpRequestPool, current)
+{
+ NO_ARGS;
+
+ if (return_value_used) {
+ long pos = 0;
+ zval **current = NULL;
+ zend_llist_position lpos;
+ getObject(http_requestpool_object, obj);
+
+ if (obj->iterator.pos < zend_llist_count(&obj->pool.handles)) {
+ for ( current = zend_llist_get_first_ex(&obj->pool.handles, &lpos);
+ current && obj->iterator.pos != pos++;
+ current = zend_llist_get_next_ex(&obj->pool.handles, &lpos));
+ if (current) {
+ RETURN_OBJECT(*current, 1);
+ }
+ }
+ RETURN_NULL();
+ }
+}
+/* }}} */
+
+/* {{{ proto int HttpRequestPool::key()
+ Implements Iterator::key(). */
+PHP_METHOD(HttpRequestPool, key)
+{
+ NO_ARGS;
+
+ if (return_value_used) {
+ getObject(http_requestpool_object, obj);
+ RETURN_LONG(obj->iterator.pos);
+ }
+}
+/* }}} */
+
+/* {{{ proto void HttpRequestPool::next()
+ Implements Iterator::next(). */
+PHP_METHOD(HttpRequestPool, next)
+{
+ NO_ARGS {
+ getObject(http_requestpool_object, obj);
+ ++(obj->iterator.pos);
+ }
+}
+/* }}} */
+
+/* {{{ proto void HttpRequestPool::rewind()
+ Implements Iterator::rewind(). */
+PHP_METHOD(HttpRequestPool, rewind)
+{
+ NO_ARGS {
+ getObject(http_requestpool_object, obj);
+ obj->iterator.pos = 0;
+ }
+}
+/* }}} */
+
+/* {{{ proto int HttpRequestPool::count()
+ Implements Countable::count(). */
+PHP_METHOD(HttpRequestPool, count)
+{
+ NO_ARGS {
+ getObject(http_requestpool_object, obj);
+ RETURN_LONG((long) zend_llist_count(&obj->pool.handles));