helly           Tue Nov  1 11:54:45 2005 EDT

  Modified files:              
    /php-src/ext/spl    spl_directory.c spl_directory.h 
  Log:
  - Allow to recive derived SplFileInfo/SplFileObject instances
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/spl_directory.c?r1=1.54&r2=1.55&ty=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.54 
php-src/ext/spl/spl_directory.c:1.55
--- php-src/ext/spl/spl_directory.c:1.54        Sat Oct 29 11:48:14 2005
+++ php-src/ext/spl/spl_directory.c     Tue Nov  1 11:54:44 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.c,v 1.54 2005/10/29 15:48:14 helly Exp $ */
+/* $Id: spl_directory.c,v 1.55 2005/11/01 16:54:44 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -131,6 +131,8 @@
        memset(intern, 0, sizeof(spl_filesystem_object));
        intern->std.ce = class_type;
        /* intern->type = SPL_FS_INFO; done by set o */
+       intern->file_class = U_CLASS_ENTRY(spl_ce_SplFileObject);
+       intern->info_class = U_CLASS_ENTRY(spl_ce_SplFileInfo);
        if (obj) *obj = intern;
 
        ALLOC_HASHTABLE(intern->std.properties);
@@ -259,6 +261,9 @@
                php_error_docref(NULL TSRMLS_CC, E_ERROR, "An object of class 
%v cannot be cloned", old_object->ce->name);
                break;
        }
+       
+       intern->file_class = source->file_class;
+       intern->info_class = source->info_class;
 
        zend_objects_clone_members(new_object, new_obj_val, old_object, handle 
TSRMLS_CC);
 
@@ -283,7 +288,7 @@
        intern->path = estrndup(path, intern->path_len);
 } /* }}} */
 
-static spl_filesystem_object * 
spl_filesystem_object_create_info(spl_filesystem_object *source, char 
*file_path, int file_path_len, int use_copy, zval *return_value TSRMLS_DC) /* 
{{{ */
+static spl_filesystem_object * 
spl_filesystem_object_create_info(spl_filesystem_object *source, char 
*file_path, int file_path_len, int use_copy, zend_class_entry *ce, zval 
*return_value TSRMLS_DC) /* {{{ */
 {
        spl_filesystem_object *intern;
        
@@ -298,7 +303,7 @@
 
        php_set_error_handling(EH_THROW, U_CLASS_ENTRY(spl_ce_RuntimeException) 
TSRMLS_CC);
 
-       return_value->value.obj = 
spl_filesystem_object_new_ex(spl_ce_SplFileInfo, &intern TSRMLS_CC);
+       return_value->value.obj = spl_filesystem_object_new_ex(ce ? ce : 
intern->info_class, &intern TSRMLS_CC);
        Z_TYPE_P(return_value) = IS_OBJECT;
 
        spl_filesystem_info_set_filename(intern, file_path, file_path_len, 
use_copy TSRMLS_CC);
@@ -308,7 +313,7 @@
        return intern;
 } /* }}} */
 
-static spl_filesystem_object * spl_filesystem_object_create_type(int ht, 
spl_filesystem_object *source, int type, zval *return_value TSRMLS_DC) /* {{{ */
+static spl_filesystem_object * spl_filesystem_object_create_type(int ht, 
spl_filesystem_object *source, int type, zend_class_entry *ce, zval 
*return_value TSRMLS_DC) /* {{{ */
 {
        spl_filesystem_object *intern;
        zend_bool use_include_path = 0;
@@ -329,7 +334,7 @@
 
        switch (type) {
        case SPL_FS_INFO:
-               return_value->value.obj = 
spl_filesystem_object_new_ex(spl_ce_SplFileInfo, &intern TSRMLS_CC);
+               return_value->value.obj = spl_filesystem_object_new_ex(ce ? ce 
: intern->info_class, &intern TSRMLS_CC);
                Z_TYPE_P(return_value) = IS_OBJECT;
        
                spl_filesystem_object_get_file_name(source TSRMLS_CC);
@@ -337,7 +342,7 @@
                intern->file_name_len = source->file_name_len;
                break;
        case SPL_FS_FILE:
-               return_value->value.obj = 
spl_filesystem_object_new_ex(spl_ce_SplFileObject, &intern TSRMLS_CC);
+               return_value->value.obj = spl_filesystem_object_new_ex(ce ? ce 
: intern->file_class, &intern TSRMLS_CC);
                Z_TYPE_P(return_value) = IS_OBJECT;
        
                spl_filesystem_object_get_file_name(source TSRMLS_CC);
@@ -546,7 +551,7 @@
 
        if (intern->flags & SPL_FILE_DIR_CURRENT_AS_FILEINFO) {
                spl_filesystem_object_get_file_name(intern TSRMLS_CC);
-               spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, 
return_value TSRMLS_CC);
+               spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, NULL, 
return_value TSRMLS_CC);
        } else {
                RETURN_STRING(intern->u.dir.entry.d_name, 1);
        }
@@ -687,25 +692,63 @@
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
-       spl_filesystem_object_create_type(ht, intern, SPL_FS_FILE, return_value 
TSRMLS_CC);
+       spl_filesystem_object_create_type(ht, intern, SPL_FS_FILE, NULL, 
return_value TSRMLS_CC);
 }
 
-/* {{{ proto SplFileInfo SplFileInfo::getFileInfo()
+/* {{{ proto SplFileObject SplFileInfo::setFileClass([string class_name])
+   Class to use in openFile() */
+SPL_METHOD(SplFileInfo, setFileClass)
+{
+       spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       zend_class_entry *ce = U_CLASS_ENTRY(spl_ce_SplFileObject);
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == 
FAILURE) {
+               return;
+       }
+
+       intern->file_class = ce;
+}
+
+/* {{{ proto SplFileObject SplFileInfo::setInfoClass([string class_name])
+   Class to use in getFileInfo(), getPathInfo(), getSubPathInfo() */
+SPL_METHOD(SplFileInfo, setInfoClass)
+{
+       spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       zend_class_entry *ce = U_CLASS_ENTRY(spl_ce_SplFileInfo);
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == 
FAILURE) {
+               return;
+       }
+
+       intern->file_class = ce;
+}
+
+/* {{{ proto SplFileInfo SplFileInfo::getFileInfo([string $class_name])
    Get/copy file info */
 SPL_METHOD(SplFileInfo, getFileInfo)
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       zend_class_entry *ce = intern->info_class;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == 
FAILURE) {
+               return;
+       }
 
-       spl_filesystem_object_create_type(ht, intern, SPL_FS_INFO, return_value 
TSRMLS_CC);
+       spl_filesystem_object_create_type(ht, intern, SPL_FS_INFO, ce, 
return_value TSRMLS_CC);
 }
 
-/* {{{ proto SplFileInfo SplFileInfo::getPathInfo()
+/* {{{ proto SplFileInfo SplFileInfo::getPathInfo([string $class_name])
    Get/copy file info */
 SPL_METHOD(SplFileInfo, getPathInfo)
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       zend_class_entry *ce = intern->info_class;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == 
FAILURE) {
+               return;
+       }
 
-       spl_filesystem_object_create_info(intern, intern->path, 
intern->path_len, 1, return_value TSRMLS_CC);
+       spl_filesystem_object_create_info(intern, intern->path, 
intern->path_len, 1, ce, return_value TSRMLS_CC);
 }
 
 /* {{{ proto void RecursiveDirectoryIterator::rewind()
@@ -783,7 +826,7 @@
        INIT_PZVAL(&zpath);
        ZVAL_STRINGL(&zpath, intern->file_name, intern->file_name_len, 0);
 
-       spl_instantiate_arg_ex1(spl_ce_RecursiveDirectoryIterator, 
&return_value, 0, &zpath TSRMLS_CC);
+       
spl_instantiate_arg_ex1(U_CLASS_ENTRY(spl_ce_RecursiveDirectoryIterator), 
&return_value, 0, &zpath TSRMLS_CC);
        
        subdir = 
(spl_filesystem_object*)zend_object_store_get_object(return_value TSRMLS_CC);
        if (subdir) {
@@ -829,19 +872,24 @@
 }
 /* }}} */
 
-/* {{{ proto SplFileInfo RecursiveDirectoryIterator::getSubPathInfo()
+/* {{{ proto SplFileInfo RecursiveDirectoryIterator::getSubPathInfo([string 
$class_info])
    Create SplFileInfo for sub path */
 SPL_METHOD(RecursiveDirectoryIterator, getSubPathInfo)
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
        char *sub_name;
        int len;
+       zend_class_entry *ce = intern->info_class;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == 
FAILURE) {
+               return;
+       }
 
        if (intern->u.dir.sub_path) {
                len = spprintf(&sub_name, 0, "%s/%s", intern->u.dir.sub_path, 
intern->u.dir.entry.d_name);
-               spl_filesystem_object_create_info(intern, sub_name, len, 0, 
return_value TSRMLS_CC);
+               spl_filesystem_object_create_info(intern, sub_name, len, 0, ce, 
return_value TSRMLS_CC);
        } else {
-               spl_filesystem_object_create_info(intern, intern->path, 
intern->path_len, 1, return_value TSRMLS_CC);
+               spl_filesystem_object_create_info(intern, intern->path, 
intern->path_len, 1, ce, return_value TSRMLS_CC);
        }
 }
 /* }}} */
@@ -987,7 +1035,7 @@
                if (!iterator->current) {
                        ALLOC_INIT_ZVAL(iterator->current);
                        spl_filesystem_object_get_file_name(object TSRMLS_CC);
-                       spl_filesystem_object_create_type(0, object, 
SPL_FS_INFO, iterator->current TSRMLS_CC);
+                       spl_filesystem_object_create_type(0, object, 
SPL_FS_INFO, NULL, iterator->current TSRMLS_CC);
                }
                *data = &iterator->current;
        } else {
@@ -1119,6 +1167,11 @@
        ZEND_ARG_INFO(0, context)
 ZEND_END_ARG_INFO();
 
+static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_info_optinalFileClass, 0, 0, 0)
+       ZEND_ARG_INFO(0, class_name)
+ZEND_END_ARG_INFO();
+
 /* the method table */
 /* each method can have its own parameters and visibility */
 static zend_function_entry spl_SplFileInfo_functions[] = {
@@ -1141,9 +1194,11 @@
        SPL_ME(SplFileInfo,       isFile,        NULL, ZEND_ACC_PUBLIC)
        SPL_ME(SplFileInfo,       isDir,         NULL, ZEND_ACC_PUBLIC)
        SPL_ME(SplFileInfo,       isLink,        NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(SplFileInfo,       getFileInfo,   NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(SplFileInfo,       getPathInfo,   NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(SplFileInfo,       openFile,      arginfo_info_openFile, 
ZEND_ACC_PUBLIC)
+       SPL_ME(SplFileInfo,       getFileInfo,   arginfo_info_optinalFileClass, 
ZEND_ACC_PUBLIC)
+       SPL_ME(SplFileInfo,       getPathInfo,   arginfo_info_optinalFileClass, 
ZEND_ACC_PUBLIC)
+       SPL_ME(SplFileInfo,       openFile,      arginfo_info_openFile,         
ZEND_ACC_PUBLIC)
+       SPL_ME(SplFileInfo,       setFileClass,  arginfo_info_optinalFileClass, 
ZEND_ACC_PUBLIC)
+       SPL_ME(SplFileInfo,       setInfoClass,  arginfo_info_optinalFileClass, 
ZEND_ACC_PUBLIC)
        SPL_MA(SplFileInfo,       __toString, SplFileInfo, getPathname, NULL, 
ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
@@ -1177,7 +1232,7 @@
        SPL_ME(RecursiveDirectoryIterator, getChildren,   NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveDirectoryIterator, getSubPath,    NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveDirectoryIterator, getSubPathname,NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(RecursiveDirectoryIterator, getSubPathInfo,NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveDirectoryIterator, 
getSubPathInfo,arginfo_info_optinalFileClass, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 
@@ -1226,7 +1281,7 @@
        zval *retval;
 
        /* if overloaded call the function, otherwise do it directly */
-       if (intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
+       if (intern->u.file.func_getCurr->common.scope != 
U_CLASS_ENTRY(spl_ce_SplFileObject)) {
                if (php_stream_eof(intern->u.file.stream)) {
                        if (!silent) {
                                
zend_throw_exception_ex(U_CLASS_ENTRY(spl_ce_RuntimeException), 0 TSRMLS_CC, 
"Cannot read from file %s", intern->file_name);
http://cvs.php.net/diff.php/php-src/ext/spl/spl_directory.h?r1=1.16&r2=1.17&ty=u
Index: php-src/ext/spl/spl_directory.h
diff -u php-src/ext/spl/spl_directory.h:1.16 
php-src/ext/spl/spl_directory.h:1.17
--- php-src/ext/spl/spl_directory.h:1.16        Sat Oct 29 11:15:22 2005
+++ php-src/ext/spl/spl_directory.h     Tue Nov  1 11:54:44 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.h,v 1.16 2005/10/29 15:15:22 helly Exp $ */
+/* $Id: spl_directory.h,v 1.17 2005/11/01 16:54:44 helly Exp $ */
 
 #ifndef SPL_DIRECTORY_H
 #define SPL_DIRECTORY_H
@@ -46,6 +46,8 @@
        int                file_name_len; 
        SPL_FS_OBJ_TYPE    type;
        long               flags;
+       zend_class_entry   *file_class;
+       zend_class_entry   *info_class;
        union {
                struct {
                        php_stream         *dirp;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to