]> granicus.if.org Git - php/commitdiff
- MFH Allow pecl/phar and alike too hook into spl_filesystem_object's
authorMarcus Boerger <helly@php.net>
Wed, 8 Mar 2006 21:54:48 +0000 (21:54 +0000)
committerMarcus Boerger <helly@php.net>
Wed, 8 Mar 2006 21:54:48 +0000 (21:54 +0000)
ext/spl/spl_directory.c
ext/spl/spl_directory.h

index dfe56e8df615f3528b8275f37fb685f3826dd9ca..c3fd193dc73b89f7962018dd76cc92f2e2cab986 100755 (executable)
@@ -70,6 +70,9 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */
 {
        spl_filesystem_object *intern = (spl_filesystem_object*)object;
 
+       if (intern->oth_handler && intern->oth_handler->dtor) {
+               intern->oth_handler->dtor(intern TSRMLS_CC);
+       }
        zend_hash_destroy(intern->std.properties);
        FREE_HASHTABLE(intern->std.properties);
 
@@ -130,7 +133,7 @@ static zend_object_value spl_filesystem_object_new_ex(zend_class_entry *class_ty
        intern = emalloc(sizeof(spl_filesystem_object));
        memset(intern, 0, sizeof(spl_filesystem_object));
        intern->std.ce = class_type;
-       /* intern->type = SPL_FS_INFO; done by set o */
+       /* intern->type = SPL_FS_INFO; done by set 0 */
        intern->file_class = spl_ce_SplFileObject;
        intern->info_class = spl_ce_SplFileInfo;
        if (obj) *obj = intern;
@@ -270,9 +273,14 @@ static zend_object_value spl_filesystem_object_clone(zval *zobject TSRMLS_DC)
        intern->info_class = source->info_class;
        intern->flags = source->flags;
        intern->oth = source->oth;
+       intern->oth_handler = source->oth_handler;
 
        zend_objects_clone_members(new_object, new_obj_val, old_object, handle TSRMLS_CC);
 
+       if (intern->oth_handler && intern->oth_handler->clone) {
+               intern->oth_handler->clone(source, intern TSRMLS_CC);
+       }
+
        return new_obj_val;
 }
 /* }}} */
@@ -437,8 +445,8 @@ SPL_METHOD(DirectoryIterator, __construct)
 
        if (!len) {
                php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
-                zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Directory name must not be empty.");
-                return;
+               zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Directory name must not be empty.");
+               return;
        }
 
        intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
index c0c68eddd2d353e26d44f5ce5ff85e372945e82e..5a72bb6c24e3c436bf4824c3766d2cadb3076063 100755 (executable)
@@ -33,14 +33,25 @@ extern PHPAPI zend_class_entry *spl_ce_SplTempFileObject;
 PHP_MINIT_FUNCTION(spl_directory);
 
 typedef enum {
-       SPL_FS_INFO,
+       SPL_FS_INFO, /* must be 0 */
        SPL_FS_DIR,
        SPL_FS_FILE,
 } SPL_FS_OBJ_TYPE;
 
-typedef struct _spl_filesystem_object {
+typedef struct _spl_filesystem_object  spl_filesystem_object;
+
+typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object TSRMLS_DC);
+typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst TSRMLS_DC);
+
+typedef struct _spl_other_handler {
+       spl_foreign_dtor_t     dtor;
+       spl_foreign_clone_t    clone;
+} spl_other_handler;
+
+struct _spl_filesystem_object {
        zend_object        std;
        void               *oth;
+       spl_other_handler  *oth_handler;
        char               *path;
        int                path_len;
        char               *file_name;
@@ -73,7 +84,7 @@ typedef struct _spl_filesystem_object {
                        zend_function      *func_getCurr;
                } file;
        } u;
-} spl_filesystem_object;
+};
 
 #define SPL_FILE_OBJECT_DROP_NEW_LINE      0x00000001 /* drop new lines */