]> granicus.if.org Git - php/commitdiff
- Finalize work on SplFileInfo and derived for now (add missing get*Info())
authorMarcus Boerger <helly@php.net>
Mon, 10 Oct 2005 21:06:54 +0000 (21:06 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 10 Oct 2005 21:06:54 +0000 (21:06 +0000)
- Update docu

ext/spl/spl.php
ext/spl/spl_directory.c

index 942b824a33f83f537d00fd0809fc84d8ab779c88..484117422454914daebb3c811cddfae02ab7c5ad 100755 (executable)
@@ -749,10 +749,18 @@ class SplFileInfo
         */
        function getFilename(); 
 
+       /** @return SplFileInfo created for the file
+        */
+       function getFileInfo();
+
        /** @return The current entries path and file name.
         */
        function getPathname(); 
 
+       /** @return SplFileInfo created for the path
+        */
+       function getPathInfo();
+
        /** @return The current entry's permissions.
         */
        function getPerms();
@@ -898,6 +906,19 @@ class RecursiveDirectoryIterator extends DirectoryIterator implements RecursiveI
        /** @return a RecursiveDirectoryIterator for the current entry.
         */
        function getChildren(); 
+
+       /** @return sub path only (without main path)
+        */
+       function getSubPath();
+
+       /** @return the current sub path
+        */
+       function getSubPathname();
+
+       /** @return SplFileInfo created for the current sub path
+        */
+       function getSubPathInfo();
+
 }
 
 /** @ingroup SPL
index 888a4b8e84d4a8af2403e768e9a1de015cf2f941..683367b3043b1f352d649f8cf1738dc8633353c5 100755 (executable)
@@ -265,7 +265,49 @@ static zend_object_value spl_filesystem_object_clone(zval *zobject TSRMLS_DC)
 }
 /* }}} */
 
-static void spl_filesystem_object_create_type(int ht, spl_filesystem_object *source, int type, zval *return_value TSRMLS_DC) /* {{{ */
+void spl_filesystem_info_set_filename(spl_filesystem_object *intern, char *path, int len, int use_copy TSRMLS_DC) /* {{{ */
+{
+       char *p1, *p2;
+
+       intern->file_name = use_copy ? estrndup(path, len) : path;
+       intern->file_name_len = len;
+
+       p1 = strrchr(path, '/');
+       p2 = strrchr(path, '\\');
+       if (p1 || p2) {
+               intern->path_len = (p1 > p2 ? p1 : p2) - path;
+       } else {
+               intern->path_len = 0;
+       }
+       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) /* {{{ */
+{
+       spl_filesystem_object *intern;
+       
+       if (!file_path || !file_path_len) {
+               zend_throw_exception_ex(U_CLASS_ENTRY(spl_ce_RuntimeException), 0 TSRMLS_CC, "Cannot create SplFileInfo for empty path");
+               if (file_path && !use_copy)
+               {
+                       efree(file_path);
+               }
+               return NULL;
+       }
+
+       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);
+       Z_TYPE_P(return_value) = IS_OBJECT;
+
+       spl_filesystem_info_set_filename(intern, file_path, file_path_len, use_copy TSRMLS_CC);
+       
+       php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+       
+       return intern;
+} /* }}} */
+
+static spl_filesystem_object * spl_filesystem_object_create_type(int ht, spl_filesystem_object *source, int type, zval *return_value TSRMLS_DC) /* {{{ */
 {
        spl_filesystem_object *intern;
        zend_bool use_include_path = 0;
@@ -280,7 +322,7 @@ static void spl_filesystem_object_create_type(int ht, spl_filesystem_object *sou
                if (!source->u.dir.entry.d_name[0]) {
                        zend_throw_exception_ex(U_CLASS_ENTRY(spl_ce_RuntimeException), 0 TSRMLS_CC, "Could not open file");
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
-                       return;
+                       return NULL;
                }
        }
 
@@ -292,8 +334,6 @@ static void spl_filesystem_object_create_type(int ht, spl_filesystem_object *sou
                spl_filesystem_object_get_file_name(source TSRMLS_CC);
                intern->file_name = estrndup(source->file_name, source->file_name_len);
                intern->file_name_len = source->file_name_len;
-       
-               php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                break;
        case SPL_FS_FILE:
                return_value->value.obj = spl_filesystem_object_new_ex(spl_ce_SplFileObject, &intern TSRMLS_CC);
@@ -306,27 +346,29 @@ static void spl_filesystem_object_create_type(int ht, spl_filesystem_object *sou
                intern->u.file.open_mode = "r";
                intern->u.file.open_mode_len = 1;
        
-               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sbr", 
+               if (ht && zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sbr", 
                                &intern->u.file.open_mode, &intern->u.file.open_mode_len, 
                                &use_include_path, &intern->u.file.zcontext) == FAILURE) {
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                        intern->u.file.open_mode = NULL;
                        zval_dtor(return_value);
                        Z_TYPE_P(return_value) = IS_NULL;
-                       return;
+                       return NULL;
                }
        
                if (spl_filesystem_file_open(intern, use_include_path, 0 TSRMLS_CC) == FAILURE) {
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                        zval_dtor(return_value);
                        Z_TYPE_P(return_value) = IS_NULL;
-                       return;
+                       return NULL;
                }
        case SPL_FS_DIR:        
+               php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                zend_throw_exception_ex(U_CLASS_ENTRY(spl_ce_RuntimeException), 0 TSRMLS_CC, "Operation not supported");
-               break;
+               return NULL;
        }
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+       return NULL;
 } /* }}} */
 
 /* {{{ proto void DirectoryIterator::__construct(string path [, int flags])
@@ -532,7 +574,7 @@ SPL_METHOD(DirectoryIterator, isDot)
 SPL_METHOD(SplFileInfo, __construct)
 {
        spl_filesystem_object *intern;
-       char *path, *p1, *p2;
+       char *path;
        int len;
 
        php_set_error_handling(EH_THROW, U_CLASS_ENTRY(spl_ce_RuntimeException) TSRMLS_CC);
@@ -544,18 +586,8 @@ SPL_METHOD(SplFileInfo, __construct)
 
        intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
        
-       intern->file_name = estrndup(path, len);
-       intern->file_name_len = len;
-
-       p1 = strrchr(path, '/');
-       p2 = strrchr(path, '\\');
-       if (p1 || p2) {
-               intern->path_len = (p1 > p2 ? p1 : p2) - path;
-       } else {
-               intern->path_len = 0;
-       }
-       intern->path = estrndup(path, intern->path_len);
-
+       spl_filesystem_info_set_filename(intern, path, len, 1 TSRMLS_CC);
+       
        /* intern->type = SPL_FS_INFO; already set */
 
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
@@ -657,7 +689,7 @@ SPL_METHOD(SplFileInfo, openFile)
        spl_filesystem_object_create_type(ht, intern, SPL_FS_FILE, return_value TSRMLS_CC);
 }
 
-/* {{{ proto SplFileObject SplFileInfo::getFileInfo()
+/* {{{ proto SplFileInfo SplFileInfo::getFileInfo()
    Get/copy file info */
 SPL_METHOD(SplFileInfo, getFileInfo)
 {
@@ -666,6 +698,15 @@ SPL_METHOD(SplFileInfo, getFileInfo)
        spl_filesystem_object_create_type(ht, intern, SPL_FS_INFO, return_value TSRMLS_CC);
 }
 
+/* {{{ proto SplFileInfo SplFileInfo::getPathInfo()
+   Get/copy file info */
+SPL_METHOD(SplFileInfo, getPathInfo)
+{
+       spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       spl_filesystem_object_create_info(intern, intern->path, intern->path_len, 1, return_value TSRMLS_CC);
+}
+
 /* {{{ proto void RecursiveDirectoryIterator::rewind()
    Rewind dir back to the start */
 SPL_METHOD(RecursiveDirectoryIterator, rewind)
@@ -787,6 +828,23 @@ SPL_METHOD(RecursiveDirectoryIterator, getSubPathname)
 }
 /* }}} */
 
+/* {{{ proto SplFileInfo RecursiveDirectoryIterator::getSubPathInfo()
+   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;
+
+       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);
+       } else {
+               spl_filesystem_object_create_info(intern, intern->path, intern->path_len, 1, return_value TSRMLS_CC);
+       }
+}
+/* }}} */
+
 /* define an overloaded iterator structure */
 typedef struct {
        zend_object_iterator  intern;
@@ -1083,6 +1141,7 @@ static zend_function_entry spl_filesystem_info_class_functions[] = {
        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_MA(SplFileInfo,       __toString, SplFileInfo, getPathname, NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
@@ -1117,6 +1176,7 @@ static zend_function_entry spl_filesystem_tree_class_functions[] = {
        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)
        {NULL, NULL, NULL}
 };