summaryrefslogtreecommitdiff
path: root/ext/zip
diff options
context:
space:
mode:
authorRemi Collet <remi@php.net>2017-07-10 11:31:55 +0200
committerRemi Collet <remi@php.net>2017-07-10 11:31:55 +0200
commit569d164c4ad37187c3e1e7dc42d736da69f4fdb0 (patch)
tree3d678ab4c9816793eace5323504e7e15e934a9aa /ext/zip
parent161c378cc861fe01ea0034f5a6e8d32ad14f5ccb (diff)
downloadphp-git-569d164c4ad37187c3e1e7dc42d736da69f4fdb0.tar.gz
ZipArchive implements countable, added ZipArchive::count() method
Diffstat (limited to 'ext/zip')
-rw-r--r--ext/zip/php_zip.c28
-rw-r--r--ext/zip/php_zip.h2
-rw-r--r--ext/zip/tests/oo_count.phpt26
3 files changed, 55 insertions, 1 deletions
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index 394819cf34..2353519be4 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -28,6 +28,11 @@
#include "ext/standard/php_string.h"
#include "ext/pcre/php_pcre.h"
#include "ext/standard/php_filestat.h"
+#if PHP_VERSION_ID >= 70200
+#include "zend_interfaces.h"
+#elif defined(HAVE_SPL)
+#include "ext/spl/spl_iterators.h"
+#endif
#include "php_zip.h"
/* zip_open is a macro for renaming libzip zipopen, so we need to use PHP_NAMED_FUNCTION */
@@ -1548,6 +1553,23 @@ static ZIPARCHIVE_METHOD(close)
}
/* }}} */
+/* {{{ proto bool ZipArchive::count()
+close the zip archive */
+static ZIPARCHIVE_METHOD(count)
+{
+ struct zip *intern;
+ zval *self = getThis();
+
+ if (!self) {
+ RETURN_FALSE;
+ }
+
+ ZIP_FROM_OBJECT(intern, self);
+
+ RETVAL_LONG(zip_get_num_files(intern));
+}
+/* }}} */
+
/* {{{ proto string ZipArchive::getStatusString()
* Returns the status error message, system and/or zip messages */
static ZIPARCHIVE_METHOD(getStatusString)
@@ -3069,6 +3091,7 @@ static const zend_function_entry zip_class_functions[] = {
ZIPARCHIVE_ME(open, arginfo_ziparchive_open, ZEND_ACC_PUBLIC)
ZIPARCHIVE_ME(setPassword, arginfo_ziparchive_setpassword, ZEND_ACC_PUBLIC)
ZIPARCHIVE_ME(close, arginfo_ziparchive__void, ZEND_ACC_PUBLIC)
+ ZIPARCHIVE_ME(count, arginfo_ziparchive__void, ZEND_ACC_PUBLIC)
ZIPARCHIVE_ME(getStatusString, arginfo_ziparchive__void, ZEND_ACC_PUBLIC)
ZIPARCHIVE_ME(addEmptyDir, arginfo_ziparchive_addemptydir, ZEND_ACC_PUBLIC)
ZIPARCHIVE_ME(addFromString, arginfo_ziparchive_addfromstring, ZEND_ACC_PUBLIC)
@@ -3141,6 +3164,11 @@ static PHP_MINIT_FUNCTION(zip)
php_zip_register_prop_handler(&zip_prop_handlers, "numFiles", php_zip_get_num_files, NULL, NULL, IS_LONG);
php_zip_register_prop_handler(&zip_prop_handlers, "filename", NULL, NULL, php_zipobj_get_filename, IS_STRING);
php_zip_register_prop_handler(&zip_prop_handlers, "comment", NULL, php_zipobj_get_zip_comment, NULL, IS_STRING);
+#if PHP_VERSION_ID >= 70200
+ zend_class_implements(zip_class_entry, 1, zend_ce_countable);
+#elif defined(HAVE_SPL)
+ zend_class_implements(zip_class_entry, 1, spl_ce_Countable);
+#endif
REGISTER_ZIP_CLASS_CONST_LONG("CREATE", ZIP_CREATE);
REGISTER_ZIP_CLASS_CONST_LONG("EXCL", ZIP_EXCL);
diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h
index 123c064a33..d874c8f691 100644
--- a/ext/zip/php_zip.h
+++ b/ext/zip/php_zip.h
@@ -37,7 +37,7 @@ extern zend_module_entry zip_module_entry;
#define ZIP_OVERWRITE ZIP_TRUNCATE
#endif
-#define PHP_ZIP_VERSION "1.14.0"
+#define PHP_ZIP_VERSION "1.15.0"
#define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename)
diff --git a/ext/zip/tests/oo_count.phpt b/ext/zip/tests/oo_count.phpt
new file mode 100644
index 0000000000..f6d1613a39
--- /dev/null
+++ b/ext/zip/tests/oo_count.phpt
@@ -0,0 +1,26 @@
+--TEST--
+ziparchive::count()
+--SKIPIF--
+<?php
+/* $Id$ */
+if(!extension_loaded('zip')) die('skip');
+?>
+--FILE--
+<?php
+
+$dirname = dirname(__FILE__) . '/';
+$file = $dirname . 'test.zip';
+
+$zip = new ZipArchive;
+if (!$zip->open($file)) {
+ exit('failed');
+}
+
+var_dump($zip->numFiles, count($zip), $zip->numFiles == count($zip));
+?>
+Done
+--EXPECTF--
+int(4)
+int(4)
+bool(true)
+Done