pcl.pclziplib.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:249k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /**
  3. * Joomla/Mambo Community Builder
  4. * @version $Id:  $
  5. * @package Community Builder
  6. * @subpackage pcl.pclziplib.php
  7. * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU/GPL version 2
  8. */
  9. // ensure this file is being included by a parent file
  10. if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }
  11. global $_CB_framework;
  12. define( 'PCLZIP_TEMPORARY_DIR', $_CB_framework->getCfg( 'tmp_path' ) );
  13. // also search for //BB for change below
  14. // --------------------------------------------------------------------------------
  15. // PhpConcept Library - Zip Module 2.6
  16. // --------------------------------------------------------------------------------
  17. // License GNU/LGPL - Vincent Blavet - March 2006
  18. // http://www.phpconcept.net
  19. // --------------------------------------------------------------------------------
  20. //
  21. // Presentation :
  22. //   PclZip is a PHP library that manage ZIP archives.
  23. //   So far tests show that archives generated by PclZip are readable by
  24. //   WinZip application and other tools.
  25. //
  26. // Description :
  27. //   See readme.txt and http://www.phpconcept.net
  28. //
  29. // Warning :
  30. //   This library and the associated files are non commercial, non professional
  31. //   work.
  32. //   It should not have unexpected results. However if any damage is caused by
  33. //   this software the author can not be responsible.
  34. //   The use of this software is at the risk of the user.
  35. //
  36. // --------------------------------------------------------------------------------
  37. // $Id: pclzip.lib.php,v 1.47 2007/07/20 13:56:07 vblavet Exp $
  38. // --------------------------------------------------------------------------------
  39.   // ----- Constants
  40.   if (!defined('PCLZIP_READ_BLOCK_SIZE')) {
  41.     define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
  42.   }
  43.   
  44.   // ----- File list separator
  45.   // In version 1.x of PclZip, the separator for file list is a space
  46.   // (which is not a very smart choice, specifically for windows paths !).
  47.   // A better separator should be a comma (,). This constant gives you the
  48.   // abilty to change that.
  49.   // However notice that changing this value, may have impact on existing
  50.   // scripts, using space separated filenames.
  51.   // Recommanded values for compatibility with older versions :
  52.   //define( 'PCLZIP_SEPARATOR', ' ' );
  53.   // Recommanded values for smart separation of filenames.
  54.   if (!defined('PCLZIP_SEPARATOR')) {
  55.     define( 'PCLZIP_SEPARATOR', ',' );
  56.   }
  57.   // ----- Error configuration
  58.   // 0 : PclZip Class integrated error handling
  59.   // 1 : PclError external library error handling. By enabling this
  60.   //     you must ensure that you have included PclError library.
  61.   // [2,...] : reserved for futur use
  62.   if (!defined('PCLZIP_ERROR_EXTERNAL')) {
  63.     define( 'PCLZIP_ERROR_EXTERNAL', 0 );
  64.   }
  65.   // ----- Optional static temporary directory
  66.   //       By default temporary files are generated in the script current
  67.   //       path.
  68.   //       If defined :
  69.   //       - MUST BE terminated by a '/'.
  70.   //       - MUST be a valid, already created directory
  71.   //       Samples :
  72.   // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
  73.   // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
  74.   if (!defined('PCLZIP_TEMPORARY_DIR')) {
  75.     define( 'PCLZIP_TEMPORARY_DIR', '' );
  76.   }
  77. // --------------------------------------------------------------------------------
  78. // ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****
  79. // --------------------------------------------------------------------------------
  80.   // ----- Global variables
  81.   $g_pclzip_version = "2.6";
  82.   // ----- Error codes
  83.   //   -1 : Unable to open file in binary write mode
  84.   //   -2 : Unable to open file in binary read mode
  85.   //   -3 : Invalid parameters
  86.   //   -4 : File does not exist
  87.   //   -5 : Filename is too long (max. 255)
  88.   //   -6 : Not a valid zip file
  89.   //   -7 : Invalid extracted file size
  90.   //   -8 : Unable to create directory
  91.   //   -9 : Invalid archive extension
  92.   //  -10 : Invalid archive format
  93.   //  -11 : Unable to delete file (unlink)
  94.   //  -12 : Unable to rename file (rename)
  95.   //  -13 : Invalid header checksum
  96.   //  -14 : Invalid archive size
  97.   define( 'PCLZIP_ERR_USER_ABORTED', 2 );
  98.   define( 'PCLZIP_ERR_NO_ERROR', 0 );
  99.   define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );
  100.   define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );
  101.   define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );
  102.   define( 'PCLZIP_ERR_MISSING_FILE', -4 );
  103.   define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );
  104.   define( 'PCLZIP_ERR_INVALID_ZIP', -6 );
  105.   define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );
  106.   define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );
  107.   define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );
  108.   define( 'PCLZIP_ERR_BAD_FORMAT', -10 );
  109.   define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );
  110.   define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );
  111.   define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );
  112.   define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
  113.   define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );
  114.   define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );
  115.   define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );
  116.   define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );
  117.   define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );
  118.   define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );
  119.   define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );
  120.   // ----- Options values
  121.   define( 'PCLZIP_OPT_PATH', 77001 );
  122.   define( 'PCLZIP_OPT_ADD_PATH', 77002 );
  123.   define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
  124.   define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
  125.   define( 'PCLZIP_OPT_SET_CHMOD', 77005 );
  126.   define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
  127.   define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
  128.   define( 'PCLZIP_OPT_BY_NAME', 77008 );
  129.   define( 'PCLZIP_OPT_BY_INDEX', 77009 );
  130.   define( 'PCLZIP_OPT_BY_EREG', 77010 );
  131.   define( 'PCLZIP_OPT_BY_PREG', 77011 );
  132.   define( 'PCLZIP_OPT_COMMENT', 77012 );
  133.   define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
  134.   define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
  135.   define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );
  136.   define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );
  137.   define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );
  138.   // Having big trouble with crypt. Need to multiply 2 long int
  139.   // which is not correctly supported by PHP ...
  140.   //define( 'PCLZIP_OPT_CRYPT', 77018 );
  141.   define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
  142.   
  143.   // ----- File description attributes
  144.   define( 'PCLZIP_ATT_FILE_NAME', 79001 );
  145.   define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
  146.   define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
  147.   define( 'PCLZIP_ATT_FILE_MTIME', 79004 );
  148.   define( 'PCLZIP_ATT_FILE_CONTENT', 79005 );
  149.   define( 'PCLZIP_ATT_FILE_COMMENT', 79006 );
  150.   // ----- Call backs values
  151.   define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
  152.   define( 'PCLZIP_CB_POST_EXTRACT', 78002 );
  153.   define( 'PCLZIP_CB_PRE_ADD', 78003 );
  154.   define( 'PCLZIP_CB_POST_ADD', 78004 );
  155.   /* For futur use
  156.   define( 'PCLZIP_CB_PRE_LIST', 78005 );
  157.   define( 'PCLZIP_CB_POST_LIST', 78006 );
  158.   define( 'PCLZIP_CB_PRE_DELETE', 78007 );
  159.   define( 'PCLZIP_CB_POST_DELETE', 78008 );
  160.   */
  161.   // --------------------------------------------------------------------------------
  162.   // Class : PclZip
  163.   // Description :
  164.   //   PclZip is the class that represent a Zip archive.
  165.   //   The public methods allow the manipulation of the archive.
  166.   // Attributes :
  167.   //   Attributes must not be accessed directly.
  168.   // Methods :
  169.   //   PclZip() : Object creator
  170.   //   create() : Creates the Zip archive
  171.   //   listContent() : List the content of the Zip archive
  172.   //   extract() : Extract the content of the archive
  173.   //   properties() : List the properties of the archive
  174.   // --------------------------------------------------------------------------------
  175.   class PclZip
  176.   {
  177.     // ----- Filename of the zip file
  178.     var $zipname = '';
  179.     // ----- File descriptor of the zip file
  180.     var $zip_fd = 0;
  181.     // ----- Internal error handling
  182.     var $error_code = 1;
  183.     var $error_string = '';
  184.     
  185.     // ----- Current status of the magic_quotes_runtime
  186.     // This value store the php configuration for magic_quotes
  187.     // The class can then disable the magic_quotes and reset it after
  188.     var $magic_quotes_status;
  189.   // --------------------------------------------------------------------------------
  190.   // Function : PclZip()
  191.   // Description :
  192.   //   Creates a PclZip object and set the name of the associated Zip archive
  193.   //   filename.
  194.   //   Note that no real action is taken, if the archive does not exist it is not
  195.   //   created. Use create() for that.
  196.   // --------------------------------------------------------------------------------
  197.   function PclZip($p_zipname)
  198.   {
  199.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::PclZip', "zipname=$p_zipname");
  200.     // ----- Tests the zlib
  201.     if (!function_exists('gzopen'))
  202.     {
  203.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 1, "zlib extension seems to be missing");
  204.       die('Abort '.basename(__FILE__).' : Missing zlib extensions');
  205.     }
  206.     // ----- Set the attributes
  207.     $this->zipname = $p_zipname;
  208.     $this->zip_fd = 0;
  209.     $this->magic_quotes_status = -1;
  210.     // ----- Return
  211.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1);
  212.     return;
  213.   }
  214.   // --------------------------------------------------------------------------------
  215.   // --------------------------------------------------------------------------------
  216.   // Function :
  217.   //   create($p_filelist, $p_add_dir="", $p_remove_dir="")
  218.   //   create($p_filelist, $p_option, $p_option_value, ...)
  219.   // Description :
  220.   //   This method supports two different synopsis. The first one is historical.
  221.   //   This method creates a Zip Archive. The Zip file is created in the
  222.   //   filesystem. The files and directories indicated in $p_filelist
  223.   //   are added in the archive. See the parameters description for the
  224.   //   supported format of $p_filelist.
  225.   //   When a directory is in the list, the directory and its content is added
  226.   //   in the archive.
  227.   //   In this synopsis, the function takes an optional variable list of
  228.   //   options. See bellow the supported options.
  229.   // Parameters :
  230.   //   $p_filelist : An array containing file or directory names, or
  231.   //                 a string containing one filename or one directory name, or
  232.   //                 a string containing a list of filenames and/or directory
  233.   //                 names separated by spaces.
  234.   //   $p_add_dir : A path to add before the real path of the archived file,
  235.   //                in order to have it memorized in the archive.
  236.   //   $p_remove_dir : A path to remove from the real path of the file to archive,
  237.   //                   in order to have a shorter path memorized in the archive.
  238.   //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
  239.   //                   is removed first, before $p_add_dir is added.
  240.   // Options :
  241.   //   PCLZIP_OPT_ADD_PATH :
  242.   //   PCLZIP_OPT_REMOVE_PATH :
  243.   //   PCLZIP_OPT_REMOVE_ALL_PATH :
  244.   //   PCLZIP_OPT_COMMENT :
  245.   //   PCLZIP_CB_PRE_ADD :
  246.   //   PCLZIP_CB_POST_ADD :
  247.   // Return Values :
  248.   //   0 on failure,
  249.   //   The list of the added files, with a status of the add action.
  250.   //   (see PclZip::listContent() for list entry format)
  251.   // --------------------------------------------------------------------------------
  252.   function create($p_filelist)
  253.   {
  254.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ...");
  255.     $v_result=1;
  256.     // ----- Reset the error handler
  257.     $this->privErrorReset();
  258.     // ----- Set default values
  259.     $v_options = array();
  260.     $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
  261.     // ----- Look for variable options arguments
  262.     $v_size = func_num_args();
  263.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  264.     // ----- Look for arguments
  265.     if ($v_size > 1) {
  266.       // ----- Get the arguments
  267.       $v_arg_list = func_get_args();
  268.       // ----- Remove from the options list the first argument
  269.       array_shift($v_arg_list);
  270.       $v_size--;
  271.       // ----- Look for first arg
  272.       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  273.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
  274.         // ----- Parse the options
  275.         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  276.                                             array (PCLZIP_OPT_REMOVE_PATH => 'optional',
  277.                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  278.                                                    PCLZIP_OPT_ADD_PATH => 'optional',
  279.                                                    PCLZIP_CB_PRE_ADD => 'optional',
  280.                                                    PCLZIP_CB_POST_ADD => 'optional',
  281.                                                    PCLZIP_OPT_NO_COMPRESSION => 'optional',
  282.                                                    PCLZIP_OPT_COMMENT => 'optional'
  283.                                                    //, PCLZIP_OPT_CRYPT => 'optional'
  284.                                              ));
  285.         if ($v_result != 1) {
  286.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  287.           return 0;
  288.         }
  289.       }
  290.       // ----- Look for 2 args
  291.       // Here we need to support the first historic synopsis of the
  292.       // method.
  293.       else {
  294.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  295.         // ----- Get the first argument
  296.         $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];
  297.         // ----- Look for the optional second argument
  298.         if ($v_size == 2) {
  299.           $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
  300.         }
  301.         else if ($v_size > 2) {
  302.           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  303.                        "Invalid number / type of arguments");
  304.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  305.           return 0;
  306.         }
  307.       }
  308.     }
  309.     // ----- Init
  310.     $v_string_list = array();
  311.     $v_att_list = array();
  312.     $v_filedescr_list = array();
  313.     $p_result_list = array();
  314.     
  315.     // ----- Look if the $p_filelist is really an array
  316.     if (is_array($p_filelist)) {
  317.     
  318.       // ----- Look if the first element is also an array
  319.       //       This will mean that this is a file description entry
  320.       if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
  321.         $v_att_list = $p_filelist;
  322.       }
  323.       
  324.       // ----- The list is a list of string names
  325.       else {
  326.         $v_string_list = $p_filelist;
  327.       }
  328.     }
  329.     // ----- Look if the $p_filelist is a string
  330.     else if (is_string($p_filelist)) {
  331.       // ----- Create a list from the string
  332.       $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
  333.     }
  334.     // ----- Invalid variable type for $p_filelist
  335.     else {
  336.       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
  337.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  338.       return 0;
  339.     }
  340.     
  341.     // ----- Reformat the string list
  342.     if (sizeof($v_string_list) != 0) {
  343.       foreach ($v_string_list as $v_string) {
  344.         if ($v_string != '') {
  345.           $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
  346.         }
  347.         else {
  348.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Ignore an empty filename");
  349.         }
  350.       }
  351.     }
  352.     
  353.     // ----- For each file in the list check the attributes
  354.     $v_supported_attributes
  355.     = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
  356.              ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
  357.              ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
  358.              ,PCLZIP_ATT_FILE_MTIME => 'optional'
  359.              ,PCLZIP_ATT_FILE_CONTENT => 'optional'
  360.              ,PCLZIP_ATT_FILE_COMMENT => 'optional'
  361. );
  362.     foreach ($v_att_list as $v_entry) {
  363.       $v_result = $this->privFileDescrParseAtt($v_entry,
  364.                                                $v_filedescr_list[],
  365.                                                $v_options,
  366.                                                $v_supported_attributes);
  367.       if ($v_result != 1) {
  368.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  369.         return 0;
  370.       }
  371.     }
  372.     // ----- Expand the filelist (expand directories)
  373.     $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
  374.     if ($v_result != 1) {
  375.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  376.       return 0;
  377.     }
  378.     // ----- Call the create fct
  379.     $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
  380.     if ($v_result != 1) {
  381.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  382.       return 0;
  383.     }
  384.     // ----- Return
  385.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
  386.     return $p_result_list;
  387.   }
  388.   // --------------------------------------------------------------------------------
  389.   // --------------------------------------------------------------------------------
  390.   // Function :
  391.   //   add($p_filelist, $p_add_dir="", $p_remove_dir="")
  392.   //   add($p_filelist, $p_option, $p_option_value, ...)
  393.   // Description :
  394.   //   This method supports two synopsis. The first one is historical.
  395.   //   This methods add the list of files in an existing archive.
  396.   //   If a file with the same name already exists, it is added at the end of the
  397.   //   archive, the first one is still present.
  398.   //   If the archive does not exist, it is created.
  399.   // Parameters :
  400.   //   $p_filelist : An array containing file or directory names, or
  401.   //                 a string containing one filename or one directory name, or
  402.   //                 a string containing a list of filenames and/or directory
  403.   //                 names separated by spaces.
  404.   //   $p_add_dir : A path to add before the real path of the archived file,
  405.   //                in order to have it memorized in the archive.
  406.   //   $p_remove_dir : A path to remove from the real path of the file to archive,
  407.   //                   in order to have a shorter path memorized in the archive.
  408.   //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
  409.   //                   is removed first, before $p_add_dir is added.
  410.   // Options :
  411.   //   PCLZIP_OPT_ADD_PATH :
  412.   //   PCLZIP_OPT_REMOVE_PATH :
  413.   //   PCLZIP_OPT_REMOVE_ALL_PATH :
  414.   //   PCLZIP_OPT_COMMENT :
  415.   //   PCLZIP_OPT_ADD_COMMENT :
  416.   //   PCLZIP_OPT_PREPEND_COMMENT :
  417.   //   PCLZIP_CB_PRE_ADD :
  418.   //   PCLZIP_CB_POST_ADD :
  419.   // Return Values :
  420.   //   0 on failure,
  421.   //   The list of the added files, with a status of the add action.
  422.   //   (see PclZip::listContent() for list entry format)
  423.   // --------------------------------------------------------------------------------
  424.   function add($p_filelist)
  425.   {
  426.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ...");
  427.     $v_result=1;
  428.     // ----- Reset the error handler
  429.     $this->privErrorReset();
  430.     // ----- Set default values
  431.     $v_options = array();
  432.     $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
  433.     // ----- Look for variable options arguments
  434.     $v_size = func_num_args();
  435.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  436.     // ----- Look for arguments
  437.     if ($v_size > 1) {
  438.       // ----- Get the arguments
  439.       $v_arg_list = func_get_args();
  440.       // ----- Remove form the options list the first argument
  441.       array_shift($v_arg_list);
  442.       $v_size--;
  443.       // ----- Look for first arg
  444.       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  445.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
  446.         // ----- Parse the options
  447.         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  448.                                             array (PCLZIP_OPT_REMOVE_PATH => 'optional',
  449.                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  450.                                                    PCLZIP_OPT_ADD_PATH => 'optional',
  451.                                                    PCLZIP_CB_PRE_ADD => 'optional',
  452.                                                    PCLZIP_CB_POST_ADD => 'optional',
  453.                                                    PCLZIP_OPT_NO_COMPRESSION => 'optional',
  454.                                                    PCLZIP_OPT_COMMENT => 'optional',
  455.                                                    PCLZIP_OPT_ADD_COMMENT => 'optional',
  456.                                                    PCLZIP_OPT_PREPEND_COMMENT => 'optional'
  457.                                                    //, PCLZIP_OPT_CRYPT => 'optional'
  458.    ));
  459.         if ($v_result != 1) {
  460.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  461.           return 0;
  462.         }
  463.       }
  464.       // ----- Look for 2 args
  465.       // Here we need to support the first historic synopsis of the
  466.       // method.
  467.       else {
  468.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  469.         // ----- Get the first argument
  470.         $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];
  471.         // ----- Look for the optional second argument
  472.         if ($v_size == 2) {
  473.           $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
  474.         }
  475.         else if ($v_size > 2) {
  476.           // ----- Error log
  477.           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  478.           // ----- Return
  479.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  480.           return 0;
  481.         }
  482.       }
  483.     }
  484.     // ----- Init
  485.     $v_string_list = array();
  486.     $v_att_list = array();
  487.     $v_filedescr_list = array();
  488.     $p_result_list = array();
  489.     
  490.     // ----- Look if the $p_filelist is really an array
  491.     if (is_array($p_filelist)) {
  492.     
  493.       // ----- Look if the first element is also an array
  494.       //       This will mean that this is a file description entry
  495.       if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
  496.         $v_att_list = $p_filelist;
  497.       }
  498.       
  499.       // ----- The list is a list of string names
  500.       else {
  501.         $v_string_list = $p_filelist;
  502.       }
  503.     }
  504.     // ----- Look if the $p_filelist is a string
  505.     else if (is_string($p_filelist)) {
  506.       // ----- Create a list from the string
  507.       $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
  508.     }
  509.     // ----- Invalid variable type for $p_filelist
  510.     else {
  511.       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
  512.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  513.       return 0;
  514.     }
  515.     
  516.     // ----- Reformat the string list
  517.     if (sizeof($v_string_list) != 0) {
  518.       foreach ($v_string_list as $v_string) {
  519.         $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
  520.       }
  521.     }
  522.     
  523.     // ----- For each file in the list check the attributes
  524.     $v_supported_attributes
  525.     = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
  526.              ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
  527.              ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
  528.              ,PCLZIP_ATT_FILE_MTIME => 'optional'
  529.              ,PCLZIP_ATT_FILE_CONTENT => 'optional'
  530.              ,PCLZIP_ATT_FILE_COMMENT => 'optional'
  531. );
  532.     foreach ($v_att_list as $v_entry) {
  533.       $v_result = $this->privFileDescrParseAtt($v_entry,
  534.                                                $v_filedescr_list[],
  535.                                                $v_options,
  536.                                                $v_supported_attributes);
  537.       if ($v_result != 1) {
  538.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  539.         return 0;
  540.       }
  541.     }
  542.     // ----- Expand the filelist (expand directories)
  543.     $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
  544.     if ($v_result != 1) {
  545.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  546.       return 0;
  547.     }
  548.     // ----- Call the create fct
  549.     $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
  550.     if ($v_result != 1) {
  551.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  552.       return 0;
  553.     }
  554.     // ----- Return
  555.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
  556.     return $p_result_list;
  557.   }
  558.   // --------------------------------------------------------------------------------
  559.   // --------------------------------------------------------------------------------
  560.   // Function : listContent()
  561.   // Description :
  562.   //   This public method, gives the list of the files and directories, with their
  563.   //   properties.
  564.   //   The properties of each entries in the list are (used also in other functions) :
  565.   //     filename : Name of the file. For a create or add action it is the filename
  566.   //                given by the user. For an extract function it is the filename
  567.   //                of the extracted file.
  568.   //     stored_filename : Name of the file / directory stored in the archive.
  569.   //     size : Size of the stored file.
  570.   //     compressed_size : Size of the file's data compressed in the archive
  571.   //                       (without the headers overhead)
  572.   //     mtime : Last known modification date of the file (UNIX timestamp)
  573.   //     comment : Comment associated with the file
  574.   //     folder : true | false
  575.   //     index : index of the file in the archive
  576.   //     status : status of the action (depending of the action) :
  577.   //              Values are :
  578.   //                ok : OK !
  579.   //                filtered : the file / dir is not extracted (filtered by user)
  580.   //                already_a_directory : the file can not be extracted because a
  581.   //                                      directory with the same name already exists
  582.   //                write_protected : the file can not be extracted because a file
  583.   //                                  with the same name already exists and is
  584.   //                                  write protected
  585.   //                newer_exist : the file was not extracted because a newer file exists
  586.   //                path_creation_fail : the file is not extracted because the folder
  587.   //                                     does not exists and can not be created
  588.   //                write_error : the file was not extracted because there was a
  589.   //                              error while writing the file
  590.   //                read_error : the file was not extracted because there was a error
  591.   //                             while reading the file
  592.   //                invalid_header : the file was not extracted because of an archive
  593.   //                                 format error (bad file header)
  594.   //   Note that each time a method can continue operating when there
  595.   //   is an action error on a file, the error is only logged in the file status.
  596.   // Return Values :
  597.   //   0 on an unrecoverable failure,
  598.   //   The list of the files in the archive.
  599.   // --------------------------------------------------------------------------------
  600.   function listContent()
  601.   {
  602.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', "");
  603.     $v_result=1;
  604.     // ----- Reset the error handler
  605.     $this->privErrorReset();
  606.     // ----- Check archive
  607.     if (!$this->privCheckFormat()) {
  608.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  609.       return(0);
  610.     }
  611.     // ----- Call the extracting fct
  612.     $p_list = array();
  613.     if (($v_result = $this->privList($p_list)) != 1)
  614.     {
  615.       unset($p_list);
  616.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  617.       return(0);
  618.     }
  619.     // ----- Return
  620.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  621.     return $p_list;
  622.   }
  623.   // --------------------------------------------------------------------------------
  624.   // --------------------------------------------------------------------------------
  625.   // Function :
  626.   //   extract($p_path="./", $p_remove_path="")
  627.   //   extract([$p_option, $p_option_value, ...])
  628.   // Description :
  629.   //   This method supports two synopsis. The first one is historical.
  630.   //   This method extract all the files / directories from the archive to the
  631.   //   folder indicated in $p_path.
  632.   //   If you want to ignore the 'root' part of path of the memorized files
  633.   //   you can indicate this in the optional $p_remove_path parameter.
  634.   //   By default, if a newer file with the same name already exists, the
  635.   //   file is not extracted.
  636.   //
  637.   //   If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions
  638.   //   are used, the path indicated in PCLZIP_OPT_ADD_PATH is append
  639.   //   at the end of the path value of PCLZIP_OPT_PATH.
  640.   // Parameters :
  641.   //   $p_path : Path where the files and directories are to be extracted
  642.   //   $p_remove_path : First part ('root' part) of the memorized path
  643.   //                    (if any similar) to remove while extracting.
  644.   // Options :
  645.   //   PCLZIP_OPT_PATH :
  646.   //   PCLZIP_OPT_ADD_PATH :
  647.   //   PCLZIP_OPT_REMOVE_PATH :
  648.   //   PCLZIP_OPT_REMOVE_ALL_PATH :
  649.   //   PCLZIP_CB_PRE_EXTRACT :
  650.   //   PCLZIP_CB_POST_EXTRACT :
  651.   // Return Values :
  652.   //   0 or a negative value on failure,
  653.   //   The list of the extracted files, with a status of the action.
  654.   //   (see PclZip::listContent() for list entry format)
  655.   // --------------------------------------------------------------------------------
  656.   function extract()
  657.   {
  658.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", "");
  659.     $v_result=1;
  660.     // ----- Reset the error handler
  661.     $this->privErrorReset();
  662.     // ----- Check archive
  663.     if (!$this->privCheckFormat()) {
  664.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  665.       return(0);
  666.     }
  667.     // ----- Set default values
  668.     $v_options = array();
  669. //    $v_path = "./";
  670.     $v_path = '';
  671.     $v_remove_path = "";
  672.     $v_remove_all_path = false;
  673.     // ----- Look for variable options arguments
  674.     $v_size = func_num_args();
  675.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  676.     // ----- Default values for option
  677.     $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  678.     // ----- Look for arguments
  679.     if ($v_size > 0) {
  680.       // ----- Get the arguments
  681.       $v_arg_list = func_get_args();
  682.       // ----- Look for first arg
  683.       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  684.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
  685.         // ----- Parse the options
  686.         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  687.                                             array (PCLZIP_OPT_PATH => 'optional',
  688.                                                    PCLZIP_OPT_REMOVE_PATH => 'optional',
  689.                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  690.                                                    PCLZIP_OPT_ADD_PATH => 'optional',
  691.                                                    PCLZIP_CB_PRE_EXTRACT => 'optional',
  692.                                                    PCLZIP_CB_POST_EXTRACT => 'optional',
  693.                                                    PCLZIP_OPT_SET_CHMOD => 'optional',
  694.                                                    PCLZIP_OPT_BY_NAME => 'optional',
  695.                                                    PCLZIP_OPT_BY_EREG => 'optional',
  696.                                                    PCLZIP_OPT_BY_PREG => 'optional',
  697.                                                    PCLZIP_OPT_BY_INDEX => 'optional',
  698.                                                    PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
  699.                                                    PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
  700.                                                    PCLZIP_OPT_REPLACE_NEWER => 'optional'
  701.                                                    ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
  702.                                                    ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
  703.     ));
  704.         if ($v_result != 1) {
  705.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  706.           return 0;
  707.         }
  708.         // ----- Set the arguments
  709.         if (isset($v_options[PCLZIP_OPT_PATH])) {
  710.           $v_path = $v_options[PCLZIP_OPT_PATH];
  711.         }
  712.         if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
  713.           $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
  714.         }
  715.         if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  716.           $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  717.         }
  718.         if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
  719.           // ----- Check for '/' in last path char
  720.           if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
  721.             $v_path .= '/';
  722.           }
  723.           $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
  724.         }
  725.       }
  726.       // ----- Look for 2 args
  727.       // Here we need to support the first historic synopsis of the
  728.       // method.
  729.       else {
  730.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  731.         // ----- Get the first argument
  732.         $v_path = $v_arg_list[0];
  733.         // ----- Look for the optional second argument
  734.         if ($v_size == 2) {
  735.           $v_remove_path = $v_arg_list[1];
  736.         }
  737.         else if ($v_size > 2) {
  738.           // ----- Error log
  739.           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  740.           // ----- Return
  741.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  742.           return 0;
  743.         }
  744.       }
  745.     }
  746.     // ----- Trace
  747.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");
  748.     // ----- Call the extracting fct
  749.     $p_list = array();
  750.     $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
  751.                                      $v_remove_all_path, $v_options);
  752.     if ($v_result < 1) {
  753.       unset($p_list);
  754.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  755.       return(0);
  756.     }
  757.     // ----- Return
  758.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  759.     return $p_list;
  760.   }
  761.   // --------------------------------------------------------------------------------
  762.   // --------------------------------------------------------------------------------
  763.   // Function :
  764.   //   extractByIndex($p_index, $p_path="./", $p_remove_path="")
  765.   //   extractByIndex($p_index, [$p_option, $p_option_value, ...])
  766.   // Description :
  767.   //   This method supports two synopsis. The first one is historical.
  768.   //   This method is doing a partial extract of the archive.
  769.   //   The extracted files or folders are identified by their index in the
  770.   //   archive (from 0 to n).
  771.   //   Note that if the index identify a folder, only the folder entry is
  772.   //   extracted, not all the files included in the archive.
  773.   // Parameters :
  774.   //   $p_index : A single index (integer) or a string of indexes of files to
  775.   //              extract. The form of the string is "0,4-6,8-12" with only numbers
  776.   //              and '-' for range or ',' to separate ranges. No spaces or ';'
  777.   //              are allowed.
  778.   //   $p_path : Path where the files and directories are to be extracted
  779.   //   $p_remove_path : First part ('root' part) of the memorized path
  780.   //                    (if any similar) to remove while extracting.
  781.   // Options :
  782.   //   PCLZIP_OPT_PATH :
  783.   //   PCLZIP_OPT_ADD_PATH :
  784.   //   PCLZIP_OPT_REMOVE_PATH :
  785.   //   PCLZIP_OPT_REMOVE_ALL_PATH :
  786.   //   PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and
  787.   //     not as files.
  788.   //     The resulting content is in a new field 'content' in the file
  789.   //     structure.
  790.   //     This option must be used alone (any other options are ignored).
  791.   //   PCLZIP_CB_PRE_EXTRACT :
  792.   //   PCLZIP_CB_POST_EXTRACT :
  793.   // Return Values :
  794.   //   0 on failure,
  795.   //   The list of the extracted files, with a status of the action.
  796.   //   (see PclZip::listContent() for list entry format)
  797.   // --------------------------------------------------------------------------------
  798.   //function extractByIndex($p_index, options...)
  799.   function extractByIndex($p_index)
  800.   {
  801.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ...");
  802.     $v_result=1;
  803.     // ----- Reset the error handler
  804.     $this->privErrorReset();
  805.     // ----- Check archive
  806.     if (!$this->privCheckFormat()) {
  807.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  808.       return(0);
  809.     }
  810.     // ----- Set default values
  811.     $v_options = array();
  812. //    $v_path = "./";
  813.     $v_path = '';
  814.     $v_remove_path = "";
  815.     $v_remove_all_path = false;
  816.     // ----- Look for variable options arguments
  817.     $v_size = func_num_args();
  818.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  819.     // ----- Default values for option
  820.     $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  821.     // ----- Look for arguments
  822.     if ($v_size > 1) {
  823.       // ----- Get the arguments
  824.       $v_arg_list = func_get_args();
  825.       // ----- Remove form the options list the first argument
  826.       array_shift($v_arg_list);
  827.       $v_size--;
  828.       // ----- Look for first arg
  829.       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  830.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
  831.         // ----- Parse the options
  832.         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  833.                                             array (PCLZIP_OPT_PATH => 'optional',
  834.                                                    PCLZIP_OPT_REMOVE_PATH => 'optional',
  835.                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  836.                                                    PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
  837.                                                    PCLZIP_OPT_ADD_PATH => 'optional',
  838.                                                    PCLZIP_CB_PRE_EXTRACT => 'optional',
  839.                                                    PCLZIP_CB_POST_EXTRACT => 'optional',
  840.                                                    PCLZIP_OPT_SET_CHMOD => 'optional',
  841.                                                    PCLZIP_OPT_REPLACE_NEWER => 'optional'
  842.                                                    ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
  843.                                                    ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
  844.    ));
  845.         if ($v_result != 1) {
  846.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  847.           return 0;
  848.         }
  849.         // ----- Set the arguments
  850.         if (isset($v_options[PCLZIP_OPT_PATH])) {
  851.           $v_path = $v_options[PCLZIP_OPT_PATH];
  852.         }
  853.         if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
  854.           $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
  855.         }
  856.         if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  857.           $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  858.         }
  859.         if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
  860.           // ----- Check for '/' in last path char
  861.           if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
  862.             $v_path .= '/';
  863.           }
  864.           $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
  865.         }
  866.         if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
  867.           $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  868.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set.");
  869.         }
  870.         else {
  871.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set.");
  872.         }
  873.       }
  874.       // ----- Look for 2 args
  875.       // Here we need to support the first historic synopsis of the
  876.       // method.
  877.       else {
  878.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  879.         // ----- Get the first argument
  880.         $v_path = $v_arg_list[0];
  881.         // ----- Look for the optional second argument
  882.         if ($v_size == 2) {
  883.           $v_remove_path = $v_arg_list[1];
  884.         }
  885.         else if ($v_size > 2) {
  886.           // ----- Error log
  887.           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  888.           // ----- Return
  889.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  890.           return 0;
  891.         }
  892.       }
  893.     }
  894.     // ----- Trace
  895.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "index='$p_index', path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");
  896.     // ----- Trick
  897.     // Here I want to reuse extractByRule(), so I need to parse the $p_index
  898.     // with privParseOptions()
  899.     $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
  900.     $v_options_trick = array();
  901.     $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
  902.                                         array (PCLZIP_OPT_BY_INDEX => 'optional' ));
  903.     if ($v_result != 1) {
  904.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  905.         return 0;
  906.     }
  907.     $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];
  908.     // ----- Call the extracting fct
  909.     if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
  910.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  911.         return(0);
  912.     }
  913.     // ----- Return
  914.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  915.     return $p_list;
  916.   }
  917.   // --------------------------------------------------------------------------------
  918.   // --------------------------------------------------------------------------------
  919.   // Function :
  920.   //   delete([$p_option, $p_option_value, ...])
  921.   // Description :
  922.   //   This method removes files from the archive.
  923.   //   If no parameters are given, then all the archive is emptied.
  924.   // Parameters :
  925.   //   None or optional arguments.
  926.   // Options :
  927.   //   PCLZIP_OPT_BY_INDEX :
  928.   //   PCLZIP_OPT_BY_NAME :
  929.   //   PCLZIP_OPT_BY_EREG : 
  930.   //   PCLZIP_OPT_BY_PREG :
  931.   // Return Values :
  932.   //   0 on failure,
  933.   //   The list of the files which are still present in the archive.
  934.   //   (see PclZip::listContent() for list entry format)
  935.   // --------------------------------------------------------------------------------
  936.   function delete()
  937.   {
  938.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", "");
  939.     $v_result=1;
  940.     // ----- Reset the error handler
  941.     $this->privErrorReset();
  942.     // ----- Check archive
  943.     if (!$this->privCheckFormat()) {
  944.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  945.       return(0);
  946.     }
  947.     // ----- Set default values
  948.     $v_options = array();
  949.     // ----- Look for variable options arguments
  950.     $v_size = func_num_args();
  951.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  952.     // ----- Look for arguments
  953.     if ($v_size > 0) {
  954.       // ----- Get the arguments
  955.       $v_arg_list = func_get_args();
  956.       // ----- Parse the options
  957.       $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  958.                                         array (PCLZIP_OPT_BY_NAME => 'optional',
  959.                                                PCLZIP_OPT_BY_EREG => 'optional',
  960.                                                PCLZIP_OPT_BY_PREG => 'optional',
  961.                                                PCLZIP_OPT_BY_INDEX => 'optional' ));
  962.       if ($v_result != 1) {
  963.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  964.           return 0;
  965.       }
  966.     }
  967.     // ----- Magic quotes trick
  968.     $this->privDisableMagicQuotes();
  969.     // ----- Call the delete fct
  970.     $v_list = array();
  971.     if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
  972.       $this->privSwapBackMagicQuotes();
  973.       unset($v_list);
  974.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  975.       return(0);
  976.     }
  977.     // ----- Magic quotes trick
  978.     $this->privSwapBackMagicQuotes();
  979.     // ----- Return
  980.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_list);
  981.     return $v_list;
  982.   }
  983.   // --------------------------------------------------------------------------------
  984.   // --------------------------------------------------------------------------------
  985.   // Function : deleteByIndex()
  986.   // Description :
  987.   //   ***** Deprecated *****
  988.   //   delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.
  989.   // --------------------------------------------------------------------------------
  990.   function deleteByIndex($p_index)
  991.   {
  992.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'");
  993.     
  994.     $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
  995.     // ----- Return
  996.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  997.     return $p_list;
  998.   }
  999.   // --------------------------------------------------------------------------------
  1000.   // --------------------------------------------------------------------------------
  1001.   // Function : properties()
  1002.   // Description :
  1003.   //   This method gives the properties of the archive.
  1004.   //   The properties are :
  1005.   //     nb : Number of files in the archive
  1006.   //     comment : Comment associated with the archive file
  1007.   //     status : not_exist, ok
  1008.   // Parameters :
  1009.   //   None
  1010.   // Return Values :
  1011.   //   0 on failure,
  1012.   //   An array with the archive properties.
  1013.   // --------------------------------------------------------------------------------
  1014.   function properties()
  1015.   {
  1016.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", "");
  1017.     // ----- Reset the error handler
  1018.     $this->privErrorReset();
  1019.     // ----- Magic quotes trick
  1020.     $this->privDisableMagicQuotes();
  1021.     // ----- Check archive
  1022.     if (!$this->privCheckFormat()) {
  1023.       $this->privSwapBackMagicQuotes();
  1024.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1025.       return(0);
  1026.     }
  1027.     // ----- Default properties
  1028.     $v_prop = array();
  1029.     $v_prop['comment'] = '';
  1030.     $v_prop['nb'] = 0;
  1031.     $v_prop['status'] = 'not_exist';
  1032.     // ----- Look if file exists
  1033.     if (@is_file($this->zipname))
  1034.     {
  1035.       // ----- Open the zip file
  1036.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  1037.       if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
  1038.       {
  1039.         $this->privSwapBackMagicQuotes();
  1040.         
  1041.         // ----- Error log
  1042.         PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive ''.$this->zipname.'' in binary read mode');
  1043.         // ----- Return
  1044.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0);
  1045.         return 0;
  1046.       }
  1047.       // ----- Read the central directory informations
  1048.       $v_central_dir = array();
  1049.       if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  1050.       {
  1051.         $this->privSwapBackMagicQuotes();
  1052.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1053.         return 0;
  1054.       }
  1055.       // ----- Close the zip file
  1056.       $this->privCloseFd();
  1057.       // ----- Set the user attributes
  1058.       $v_prop['comment'] = $v_central_dir['comment'];
  1059.       $v_prop['nb'] = $v_central_dir['entries'];
  1060.       $v_prop['status'] = 'ok';
  1061.     }
  1062.     // ----- Magic quotes trick
  1063.     $this->privSwapBackMagicQuotes();
  1064.     // ----- Return
  1065.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_prop);
  1066.     return $v_prop;
  1067.   }
  1068.   // --------------------------------------------------------------------------------
  1069.   // --------------------------------------------------------------------------------
  1070.   // Function : duplicate()
  1071.   // Description :
  1072.   //   This method creates an archive by copying the content of an other one. If
  1073.   //   the archive already exist, it is replaced by the new one without any warning.
  1074.   // Parameters :
  1075.   //   $p_archive : The filename of a valid archive, or
  1076.   //                a valid PclZip object.
  1077.   // Return Values :
  1078.   //   1 on success.
  1079.   //   0 or a negative value on error (error code).
  1080.   // --------------------------------------------------------------------------------
  1081.   function duplicate($p_archive)
  1082.   {
  1083.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", "");
  1084.     $v_result = 1;
  1085.     // ----- Reset the error handler
  1086.     $this->privErrorReset();
  1087.     // ----- Look if the $p_archive is a PclZip object
  1088.     if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))
  1089.     {
  1090.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'");
  1091.       // ----- Duplicate the archive
  1092.       $v_result = $this->privDuplicate($p_archive->zipname);
  1093.     }
  1094.     // ----- Look if the $p_archive is a string (so a filename)
  1095.     else if (is_string($p_archive))
  1096.     {
  1097.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'");
  1098.       // ----- Check that $p_archive is a valid zip file
  1099.       // TBC : Should also check the archive format
  1100.       if (!is_file($p_archive)) {
  1101.         // ----- Error log
  1102.         PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
  1103.         $v_result = PCLZIP_ERR_MISSING_FILE;
  1104.       }
  1105.       else {
  1106.         // ----- Duplicate the archive
  1107.         $v_result = $this->privDuplicate($p_archive);
  1108.       }
  1109.     }
  1110.     // ----- Invalid variable
  1111.     else
  1112.     {
  1113.       // ----- Error log
  1114.       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
  1115.       $v_result = PCLZIP_ERR_INVALID_PARAMETER;
  1116.     }
  1117.     // ----- Return
  1118.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1119.     return $v_result;
  1120.   }
  1121.   // --------------------------------------------------------------------------------
  1122.   // --------------------------------------------------------------------------------
  1123.   // Function : merge()
  1124.   // Description :
  1125.   //   This method merge the $p_archive_to_add archive at the end of the current
  1126.   //   one ($this).
  1127.   //   If the archive ($this) does not exist, the merge becomes a duplicate.
  1128.   //   If the $p_archive_to_add archive does not exist, the merge is a success.
  1129.   // Parameters :
  1130.   //   $p_archive_to_add : It can be directly the filename of a valid zip archive,
  1131.   //                       or a PclZip object archive.
  1132.   // Return Values :
  1133.   //   1 on success,
  1134.   //   0 or negative values on error (see below).
  1135.   // --------------------------------------------------------------------------------
  1136.   function merge($p_archive_to_add)
  1137.   {
  1138.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", "");
  1139.     $v_result = 1;
  1140.     // ----- Reset the error handler
  1141.     $this->privErrorReset();
  1142.     // ----- Check archive
  1143.     if (!$this->privCheckFormat()) {
  1144.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1145.       return(0);
  1146.     }
  1147.     // ----- Look if the $p_archive_to_add is a PclZip object
  1148.     if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))
  1149.     {
  1150.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object");
  1151.       // ----- Merge the archive
  1152.       $v_result = $this->privMerge($p_archive_to_add);
  1153.     }
  1154.     // ----- Look if the $p_archive_to_add is a string (so a filename)
  1155.     else if (is_string($p_archive_to_add))
  1156.     {
  1157.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename");
  1158.       // ----- Create a temporary archive
  1159.       $v_object_archive = new PclZip($p_archive_to_add);
  1160.       // ----- Merge the archive
  1161.       $v_result = $this->privMerge($v_object_archive);
  1162.     }
  1163.     // ----- Invalid variable
  1164.     else
  1165.     {
  1166.       // ----- Error log
  1167.       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
  1168.       $v_result = PCLZIP_ERR_INVALID_PARAMETER;
  1169.     }
  1170.     // ----- Return
  1171.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1172.     return $v_result;
  1173.   }
  1174.   // --------------------------------------------------------------------------------
  1175.   // --------------------------------------------------------------------------------
  1176.   // Function : errorCode()
  1177.   // Description :
  1178.   // Parameters :
  1179.   // --------------------------------------------------------------------------------
  1180.   function errorCode()
  1181.   {
  1182.     if (PCLZIP_ERROR_EXTERNAL == 1) {
  1183.       return(PclErrorCode());
  1184.     }
  1185.     else {
  1186.       return($this->error_code);
  1187.     }
  1188.   }
  1189.   // --------------------------------------------------------------------------------
  1190.   // --------------------------------------------------------------------------------
  1191.   // Function : errorName()
  1192.   // Description :
  1193.   // Parameters :
  1194.   // --------------------------------------------------------------------------------
  1195.   function errorName($p_with_code=false)
  1196.   {
  1197.     $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
  1198.                       PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
  1199.                       PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
  1200.                       PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
  1201.                       PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
  1202.                       PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
  1203.                       PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
  1204.                       PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
  1205.                       PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
  1206.                       PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
  1207.                       PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
  1208.                       PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
  1209.                       PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
  1210.                       PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
  1211.                       PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
  1212.                       PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
  1213.                       PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
  1214.                       PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
  1215.                       PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'
  1216.                       ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'
  1217.                       ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
  1218.                     );
  1219.     if (isset($v_name[$this->error_code])) {
  1220.       $v_value = $v_name[$this->error_code];
  1221.     }
  1222.     else {
  1223.       $v_value = 'NoName';
  1224.     }
  1225.     if ($p_with_code) {
  1226.       return($v_value.' ('.$this->error_code.')');
  1227.     }
  1228.     else {
  1229.       return($v_value);
  1230.     }
  1231.   }
  1232.   // --------------------------------------------------------------------------------
  1233.   // --------------------------------------------------------------------------------
  1234.   // Function : errorInfo()
  1235.   // Description :
  1236.   // Parameters :
  1237.   // --------------------------------------------------------------------------------
  1238.   function errorInfo($p_full=false)
  1239.   {
  1240.     if (PCLZIP_ERROR_EXTERNAL == 1) {
  1241.       return(PclErrorString());
  1242.     }
  1243.     else {
  1244.       if ($p_full) {
  1245.         return($this->errorName(true)." : ".$this->error_string);
  1246.       }
  1247.       else {
  1248.         return($this->error_string." [code ".$this->error_code."]");
  1249.       }
  1250.     }
  1251.   }
  1252.   // --------------------------------------------------------------------------------
  1253. // --------------------------------------------------------------------------------
  1254. // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****
  1255. // *****                                                        *****
  1256. // *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****
  1257. // --------------------------------------------------------------------------------
  1258.   // --------------------------------------------------------------------------------
  1259.   // Function : privCheckFormat()
  1260.   // Description :
  1261.   //   This method check that the archive exists and is a valid zip archive.
  1262.   //   Several level of check exists. (futur)
  1263.   // Parameters :
  1264.   //   $p_level : Level of check. Default 0.
  1265.   //              0 : Check the first bytes (magic codes) (default value))
  1266.   //              1 : 0 + Check the central directory (futur)
  1267.   //              2 : 1 + Check each file header (futur)
  1268.   // Return Values :
  1269.   //   true on success,
  1270.   //   false on error, the error code is set.
  1271.   // --------------------------------------------------------------------------------
  1272.   function privCheckFormat($p_level=0)
  1273.   {
  1274.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", "");
  1275.     $v_result = true;
  1276. // ----- Reset the file system cache
  1277.     clearstatcache();
  1278.     // ----- Reset the error handler
  1279.     $this->privErrorReset();
  1280.     // ----- Look if the file exits
  1281.     if (!is_file($this->zipname)) {
  1282.       // ----- Error log
  1283.       PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
  1284.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
  1285.       return(false);
  1286.     }
  1287.     // ----- Check that the file is readeable
  1288.     if (!is_readable($this->zipname)) {
  1289.       // ----- Error log
  1290.       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
  1291.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
  1292.       return(false);
  1293.     }
  1294.     // ----- Check the magic code
  1295.     // TBC
  1296.     // ----- Check the central header
  1297.     // TBC
  1298.     // ----- Check each file header
  1299.     // TBC
  1300.     // ----- Return
  1301.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1302.     return $v_result;
  1303.   }
  1304.   // --------------------------------------------------------------------------------
  1305.   // --------------------------------------------------------------------------------
  1306.   // Function : privParseOptions()
  1307.   // Description :
  1308.   //   This internal methods reads the variable list of arguments ($p_options_list,
  1309.   //   $p_size) and generate an array with the options and values ($v_result_list).
  1310.   //   $v_requested_options contains the options that can be present and those that
  1311.   //   must be present.
  1312.   //   $v_requested_options is an array, with the option value as key, and 'optional',
  1313.   //   or 'mandatory' as value.
  1314.   // Parameters :
  1315.   //   See above.
  1316.   // Return Values :
  1317.   //   1 on success.
  1318.   //   0 on failure.
  1319.   // --------------------------------------------------------------------------------
  1320.   function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
  1321.   {
  1322.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", "");
  1323.     $v_result=1;
  1324.     
  1325.     // ----- Read the options
  1326.     $i=0;
  1327.     while ($i<$p_size) {
  1328.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'");
  1329.       // ----- Check if the option is supported
  1330.       if (!isset($v_requested_options[$p_options_list[$i]])) {
  1331.         // ----- Error log
  1332.         PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");
  1333.         // ----- Return
  1334.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1335.         return PclZip::errorCode();
  1336.       }
  1337.       // ----- Look for next option
  1338.       switch ($p_options_list[$i]) {
  1339.         // ----- Look for options that request a path value
  1340.         case PCLZIP_OPT_PATH :
  1341.         case PCLZIP_OPT_REMOVE_PATH :
  1342.         case PCLZIP_OPT_ADD_PATH :
  1343.           // ----- Check the number of parameters
  1344.           if (($i+1) >= $p_size) {
  1345.             // ----- Error log
  1346.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1347.             // ----- Return
  1348.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1349.             return PclZip::errorCode();
  1350.           }
  1351.           // ----- Get the value
  1352.           $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
  1353.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1354.           $i++;
  1355.         break;
  1356.         case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
  1357.           // ----- Check the number of parameters
  1358.           if (($i+1) >= $p_size) {
  1359.             // ----- Error log
  1360.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1361.             // ----- Return
  1362.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1363.             return PclZip::errorCode();
  1364.           }
  1365.           // ----- Get the value
  1366.           if (   is_string($p_options_list[$i+1])
  1367.               && ($p_options_list[$i+1] != '')) {
  1368.             $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
  1369.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1370.             $i++;
  1371.           }
  1372.           else {
  1373.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored.");
  1374.           }
  1375.         break;
  1376.         // ----- Look for options that request an array of string for value
  1377.         case PCLZIP_OPT_BY_NAME :
  1378.           // ----- Check the number of parameters
  1379.           if (($i+1) >= $p_size) {
  1380.             // ----- Error log
  1381.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1382.             // ----- Return
  1383.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1384.             return PclZip::errorCode();
  1385.           }
  1386.           // ----- Get the value
  1387.           if (is_string($p_options_list[$i+1])) {
  1388.               $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
  1389.           }
  1390.           else if (is_array($p_options_list[$i+1])) {
  1391.               $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1392.           }
  1393.           else {
  1394.             // ----- Error log
  1395.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1396.             // ----- Return
  1397.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1398.             return PclZip::errorCode();
  1399.           }
  1400.           ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1401.           $i++;
  1402.         break;
  1403.         // ----- Look for options that request an EREG or PREG expression
  1404.         case PCLZIP_OPT_BY_EREG :
  1405.         case PCLZIP_OPT_BY_PREG :
  1406.         //case PCLZIP_OPT_CRYPT :
  1407.           // ----- Check the number of parameters
  1408.           if (($i+1) >= $p_size) {
  1409.             // ----- Error log
  1410.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1411.             // ----- Return
  1412.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1413.             return PclZip::errorCode();
  1414.           }
  1415.           // ----- Get the value
  1416.           if (is_string($p_options_list[$i+1])) {
  1417.               $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1418.           }
  1419.           else {
  1420.             // ----- Error log
  1421.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1422.             // ----- Return
  1423.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1424.             return PclZip::errorCode();
  1425.           }
  1426.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1427.           $i++;
  1428.         break;
  1429.         // ----- Look for options that takes a string
  1430.         case PCLZIP_OPT_COMMENT :
  1431.         case PCLZIP_OPT_ADD_COMMENT :
  1432.         case PCLZIP_OPT_PREPEND_COMMENT :
  1433.           // ----- Check the number of parameters
  1434.           if (($i+1) >= $p_size) {
  1435.             // ----- Error log
  1436.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
  1437.                      "Missing parameter value for option '"
  1438.  .PclZipUtilOptionText($p_options_list[$i])
  1439.  ."'");
  1440.             // ----- Return
  1441.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1442.             return PclZip::errorCode();
  1443.           }
  1444.           // ----- Get the value
  1445.           if (is_string($p_options_list[$i+1])) {
  1446.               $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1447.           }
  1448.           else {
  1449.             // ----- Error log
  1450.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
  1451.                      "Wrong parameter value for option '"
  1452.  .PclZipUtilOptionText($p_options_list[$i])
  1453.  ."'");
  1454.             // ----- Return
  1455.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1456.             return PclZip::errorCode();
  1457.           }
  1458.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1459.           $i++;
  1460.         break;
  1461.         // ----- Look for options that request an array of index
  1462.         case PCLZIP_OPT_BY_INDEX :
  1463.           // ----- Check the number of parameters
  1464.           if (($i+1) >= $p_size) {
  1465.             // ----- Error log
  1466.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1467.             // ----- Return
  1468.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1469.             return PclZip::errorCode();
  1470.           }
  1471.           // ----- Get the value
  1472.           $v_work_list = array();
  1473.           if (is_string($p_options_list[$i+1])) {
  1474.               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'");
  1475.               // ----- Remove spaces
  1476.               $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');
  1477.               // ----- Parse items
  1478.               $v_work_list = explode(",", $p_options_list[$i+1]);
  1479.           }
  1480.           else if (is_integer($p_options_list[$i+1])) {
  1481.               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'");
  1482.               $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
  1483.           }
  1484.           else if (is_array($p_options_list[$i+1])) {
  1485.               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array");
  1486.               $v_work_list = $p_options_list[$i+1];
  1487.           }
  1488.           else {
  1489.             // ----- Error log
  1490.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1491.             // ----- Return
  1492.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1493.             return PclZip::errorCode();
  1494.           }
  1495.           
  1496.           // ----- Reduce the index list
  1497.           // each index item in the list must be a couple with a start and
  1498.           // an end value : [0,3], [5-5], [8-10], ...
  1499.           // ----- Check the format of each item
  1500.           $v_sort_flag=false;
  1501.           $v_sort_value=0;
  1502.           for ($j=0; $j<sizeof($v_work_list); $j++) {
  1503.               // ----- Explode the item
  1504.               $v_item_list = explode("-", $v_work_list[$j]);
  1505.               $v_size_item_list = sizeof($v_item_list);
  1506.               
  1507.               // ----- TBC : Here we might check that each item is a
  1508.               // real integer ...
  1509.               
  1510.               // ----- Look for single value
  1511.               if ($v_size_item_list == 1) {
  1512.                   // ----- Set the option value
  1513.                   $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
  1514.                   $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
  1515.               }
  1516.               elseif ($v_size_item_list == 2) {
  1517.                   // ----- Set the option value
  1518.                   $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
  1519.                   $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
  1520.               }
  1521.               else {
  1522.                   // ----- Error log
  1523.                   PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1524.                   // ----- Return
  1525.                   //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1526.                   return PclZip::errorCode();
  1527.               }
  1528.               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extracted index item = [".$v_result_list[$p_options_list[$i]][$j]['start'].",".$v_result_list[$p_options_list[$i]][$j]['end']."]");
  1529.               // ----- Look for list sort
  1530.               if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
  1531.                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The list should be sorted ...");
  1532.                   $v_sort_flag=true;
  1533.                   // ----- TBC : An automatic sort should be writen ...
  1534.                   // ----- Error log
  1535.                   PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1536.                   // ----- Return
  1537.                   //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1538.                   return PclZip::errorCode();
  1539.               }
  1540.               $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
  1541.           }
  1542.           
  1543.           // ----- Sort the items
  1544.           if ($v_sort_flag) {
  1545.               // TBC : To Be Completed
  1546.               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "List sorting is not yet write ...");
  1547.           }
  1548.           // ----- Next option
  1549.           $i++;
  1550.         break;
  1551.         // ----- Look for options that request no value
  1552.         case PCLZIP_OPT_REMOVE_ALL_PATH :
  1553.         case PCLZIP_OPT_EXTRACT_AS_STRING :
  1554.         case PCLZIP_OPT_NO_COMPRESSION :
  1555.         case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
  1556.         case PCLZIP_OPT_REPLACE_NEWER :
  1557.         case PCLZIP_OPT_STOP_ON_ERROR :
  1558.           $v_result_list[$p_options_list[$i]] = true;
  1559.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1560.         break;
  1561.         // ----- Look for options that request an octal value
  1562.         case PCLZIP_OPT_SET_CHMOD :
  1563.           // ----- Check the number of parameters
  1564.           if (($i+1) >= $p_size) {
  1565.             // ----- Error log
  1566.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1567.             // ----- Return
  1568.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1569.             return PclZip::errorCode();
  1570.           }
  1571.           // ----- Get the value
  1572.           $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1573.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1574.           $i++;
  1575.         break;
  1576.         // ----- Look for options that request a call-back
  1577.         case PCLZIP_CB_PRE_EXTRACT :
  1578.         case PCLZIP_CB_POST_EXTRACT :
  1579.         case PCLZIP_CB_PRE_ADD :
  1580.         case PCLZIP_CB_POST_ADD :
  1581.         /* for futur use
  1582.         case PCLZIP_CB_PRE_DELETE :
  1583.         case PCLZIP_CB_POST_DELETE :
  1584.         case PCLZIP_CB_PRE_LIST :
  1585.         case PCLZIP_CB_POST_LIST :
  1586.         */
  1587.           // ----- Check the number of parameters
  1588.           if (($i+1) >= $p_size) {
  1589.             // ----- Error log
  1590.             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1591.             // ----- Return
  1592.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1593.             return PclZip::errorCode();
  1594.           }
  1595.           // ----- Get the value
  1596.           $v_function_name = $p_options_list[$i+1];
  1597.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'");
  1598.           // ----- Check that the value is a valid existing function
  1599.           if (!function_exists($v_function_name)) {
  1600.             // ----- Error log
  1601.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1602.             // ----- Return
  1603.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1604.             return PclZip::errorCode();
  1605.           }
  1606.           // ----- Set the attribute
  1607.           $v_result_list[$p_options_list[$i]] = $v_function_name;
  1608.           $i++;
  1609.         break;
  1610.         default :
  1611.           // ----- Error log
  1612.           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  1613.                        "Unknown parameter '"
  1614.    .$p_options_list[$i]."'");
  1615.           // ----- Return
  1616.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1617.           return PclZip::errorCode();
  1618.       }
  1619.       // ----- Next options
  1620.       $i++;
  1621.     }
  1622.     // ----- Look for mandatory options
  1623.     if ($v_requested_options !== false) {
  1624.       for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
  1625.         // ----- Look for mandatory option
  1626.         if ($v_requested_options[$key] == 'mandatory') {
  1627.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
  1628.           // ----- Look if present
  1629.           if (!isset($v_result_list[$key])) {
  1630.             // ----- Error log
  1631.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
  1632.             // ----- Return
  1633.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1634.             return PclZip::errorCode();
  1635.           }
  1636.         }
  1637.       }
  1638.     }
  1639.     // ----- Return
  1640.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1641.     return $v_result;
  1642.   }
  1643.   // --------------------------------------------------------------------------------
  1644.   // --------------------------------------------------------------------------------
  1645.   // Function : privFileDescrParseAtt()
  1646.   // Description :
  1647.   // Parameters :
  1648.   // Return Values :
  1649.   //   1 on success.
  1650.   //   0 on failure.
  1651.   // --------------------------------------------------------------------------------
  1652.   function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
  1653.   {
  1654.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrParseAtt", "");
  1655.     $v_result=1;
  1656.     
  1657.     // ----- For each file in the list check the attributes
  1658.     foreach ($p_file_list as $v_key => $v_value) {
  1659.     
  1660.       // ----- Check if the option is supported
  1661.       if (!isset($v_requested_options[$v_key])) {
  1662.         // ----- Error log
  1663.         PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");
  1664.         // ----- Return
  1665.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1666.         return PclZip::errorCode();
  1667.       }
  1668.       // ----- Look for attribute
  1669.       switch ($v_key) {
  1670.         case PCLZIP_ATT_FILE_NAME :
  1671.           if (!is_string($v_value)) {
  1672.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1673.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1674.             return PclZip::errorCode();
  1675.           }
  1676.           $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
  1677.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1678.           
  1679.           if ($p_filedescr['filename'] == '') {
  1680.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1681.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1682.             return PclZip::errorCode();
  1683.           }
  1684.         break;
  1685.         case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
  1686.           if (!is_string($v_value)) {
  1687.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1688.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1689.             return PclZip::errorCode();
  1690.           }
  1691.           $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);
  1692.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1693.           if ($p_filedescr['new_short_name'] == '') {
  1694.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1695.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1696.             return PclZip::errorCode();
  1697.           }
  1698.         break;
  1699.         case PCLZIP_ATT_FILE_NEW_FULL_NAME :
  1700.           if (!is_string($v_value)) {
  1701.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1702.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1703.             return PclZip::errorCode();
  1704.           }
  1705.           $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);
  1706.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1707.           if ($p_filedescr['new_full_name'] == '') {
  1708.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1709.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1710.             return PclZip::errorCode();
  1711.           }
  1712.         break;
  1713.         // ----- Look for options that takes a string
  1714.         case PCLZIP_ATT_FILE_COMMENT :
  1715.           if (!is_string($v_value)) {
  1716.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1717.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1718.             return PclZip::errorCode();
  1719.           }
  1720.           $p_filedescr['comment'] = $v_value;
  1721.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1722.         break;
  1723.         case PCLZIP_ATT_FILE_MTIME :
  1724.           if (!is_integer($v_value)) {
  1725.             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1726.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1727.             return PclZip::errorCode();
  1728.           }
  1729.           $p_filedescr['mtime'] = $v_value;
  1730.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1731.         break;
  1732.         case PCLZIP_ATT_FILE_CONTENT :
  1733.           $p_filedescr['content'] = $v_value;
  1734.           ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1735.         break;
  1736.         default :
  1737.           // ----- Error log
  1738.           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  1739.                            "Unknown parameter '".$v_key."'");
  1740.           // ----- Return
  1741.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1742.           return PclZip::errorCode();
  1743.       }
  1744.       // ----- Look for mandatory options
  1745.       if ($v_requested_options !== false) {
  1746.         for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
  1747.           // ----- Look for mandatory option
  1748.           if ($v_requested_options[$key] == 'mandatory') {
  1749.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
  1750.             // ----- Look if present
  1751.             if (!isset($p_file_list[$key])) {
  1752.               PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
  1753.               //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1754.               return PclZip::errorCode();
  1755.             }
  1756.           }
  1757.         }
  1758.       }
  1759.     
  1760.     // end foreach
  1761.     }
  1762.     
  1763.     // ----- Return
  1764.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1765.     return $v_result;
  1766.   }
  1767.   // --------------------------------------------------------------------------------
  1768.   // --------------------------------------------------------------------------------
  1769.   // Function : privFileDescrExpand()
  1770.   // Description :
  1771.   // Parameters :
  1772.   // Return Values :
  1773.   //   1 on success.
  1774.   //   0 on failure.
  1775.   // --------------------------------------------------------------------------------
  1776.   function privFileDescrExpand(&$p_filedescr_list, &$p_options)
  1777.   {
  1778.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrExpand", "");
  1779.     $v_result=1;
  1780.     
  1781.     // ----- Create a result list
  1782.     $v_result_list = array();
  1783.     
  1784.     // ----- Look each entry
  1785.     for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
  1786.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for file ".$i.".");
  1787.       
  1788.       // ----- Get filedescr
  1789.       $v_descr = $p_filedescr_list[$i];
  1790.       
  1791.       // ----- Reduce the filename
  1792.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr before reduction :'".$v_descr['filename']."'");
  1793.       $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], FALSE ); //BB added FALSE
  1794.       $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
  1795.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr after reduction :'".$v_descr['filename']."'");
  1796.       
  1797.       // ----- Look for real file or folder
  1798.       if (file_exists($v_descr['filename'])) {
  1799.         if (@is_file($v_descr['filename'])) {
  1800.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a file");
  1801.           $v_descr['type'] = 'file';
  1802.         }
  1803.         else if (@is_dir($v_descr['filename'])) {
  1804.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a folder");
  1805.           $v_descr['type'] = 'folder';
  1806.         }
  1807.         else if (@is_link($v_descr['filename'])) {
  1808.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : link");
  1809.           // skip
  1810.           continue;
  1811.         }
  1812.         else {
  1813.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : unknown type");
  1814.           // skip
  1815.           continue;
  1816.         }
  1817.       }
  1818.       
  1819.       // ----- Look for string added as file
  1820.       else if (isset($v_descr['content'])) {
  1821.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a string added as a file");
  1822.         $v_descr['type'] = 'virtual_file';
  1823.       }
  1824.       
  1825.       // ----- Missing file
  1826.       else {
  1827.         // ----- Error log
  1828.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_descr['filename']."' does not exists");
  1829.         PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exists");
  1830.         // ----- Return
  1831.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1832.         return PclZip::errorCode();
  1833.       }
  1834.       
  1835.       // ----- Calculate the stored filename
  1836.       $this->privCalculateStoredFilename($v_descr, $p_options);
  1837.       
  1838.       // ----- Add the descriptor in result list
  1839.       $v_result_list[sizeof($v_result_list)] = $v_descr;
  1840.       
  1841.       // ----- Look for folder
  1842.       if ($v_descr['type'] == 'folder') {
  1843.         // ----- List of items in folder
  1844.         $v_dirlist_descr = array();
  1845.         $v_dirlist_nb = 0;
  1846.         if ($v_folder_handler = @opendir($v_descr['filename'])) {
  1847.           while (($v_item_handler = @readdir($v_folder_handler)) !== false) {
  1848.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for '".$v_item_handler."' in the directory");
  1849.             // ----- Skip '.' and '..'
  1850.             if (($v_item_handler == '.') || ($v_item_handler == '..')) {
  1851.                 continue;
  1852.             }
  1853.             
  1854.             // ----- Compose the full filename
  1855.             $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
  1856.             
  1857.             // ----- Look for different stored filename
  1858.             // Because the name of the folder was changed, the name of the
  1859.             // files/sub-folders also change
  1860.             if ($v_descr['stored_filename'] != $v_descr['filename']) {
  1861.               if ($v_descr['stored_filename'] != '') {
  1862.                 $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
  1863.               }
  1864.               else {
  1865.                 $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;
  1866.               }
  1867.             }
  1868.       
  1869.             $v_dirlist_nb++;
  1870.           }
  1871.           
  1872.           @closedir($v_folder_handler);
  1873.         }
  1874.         else {
  1875.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to open dir '".$v_descr['filename']."' in read mode. Skipped.");
  1876.           // TBC : unable to open folder in read mode
  1877.         }
  1878.         
  1879.         // ----- Expand each element of the list
  1880.         if ($v_dirlist_nb != 0) {
  1881.           // ----- Expand
  1882.           if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
  1883.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1884.             return $v_result;
  1885.           }
  1886.           
  1887.           // ----- Concat the resulting list
  1888.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Merging result list (size '".sizeof($v_result_list)."') with dirlist (size '".sizeof($v_dirlist_descr)."')");
  1889.           $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
  1890.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "merged result list is size '".sizeof($v_result_list)."'");
  1891.         }
  1892.         else {
  1893.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Nothing in this folder to expand.");
  1894.         }
  1895.           
  1896.         // ----- Free local array
  1897.         unset($v_dirlist_descr);
  1898.       }
  1899.     }
  1900.     
  1901.     // ----- Get the result list
  1902.     $p_filedescr_list = $v_result_list;
  1903.     // ----- Return
  1904.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1905.     return $v_result;
  1906.   }
  1907.   // --------------------------------------------------------------------------------
  1908.   // --------------------------------------------------------------------------------
  1909.   // Function : privCreate()
  1910.   // Description :
  1911.   // Parameters :
  1912.   // Return Values :
  1913.   // --------------------------------------------------------------------------------
  1914.   function privCreate($p_filedescr_list, &$p_result_list, &$p_options)
  1915.   {
  1916.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list");
  1917.     $v_result=1;
  1918.     $v_list_detail = array();
  1919.     
  1920.     // ----- Magic quotes trick
  1921.     $this->privDisableMagicQuotes();
  1922.     // ----- Open the file in write mode
  1923.     if (($v_result = $this->privOpenFd('wb')) != 1)
  1924.     {
  1925.       // ----- Return
  1926.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1927.       return $v_result;
  1928.     }
  1929.     // ----- Add the list of files
  1930.     $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);
  1931.     // ----- Close
  1932.     $this->privCloseFd();
  1933.     // ----- Magic quotes trick
  1934.     $this->privSwapBackMagicQuotes();
  1935.     // ----- Return
  1936.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1937.     return $v_result;
  1938.   }
  1939.   // --------------------------------------------------------------------------------
  1940.   // --------------------------------------------------------------------------------
  1941.   // Function : privAdd()
  1942.   // Description :
  1943.   // Parameters :
  1944.   // Return Values :
  1945.   // --------------------------------------------------------------------------------
  1946.   function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
  1947.   {
  1948.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list");
  1949.     $v_result=1;
  1950.     $v_list_detail = array();
  1951.     // ----- Look if the archive exists or is empty
  1952.     if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
  1953.     {
  1954.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it.");
  1955.       // ----- Do a create
  1956.       $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);
  1957.       // ----- Return
  1958.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1959.       return $v_result;
  1960.     }
  1961.     // ----- Magic quotes trick
  1962.     $this->privDisableMagicQuotes();
  1963.     // ----- Open the zip file
  1964.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  1965.     if (($v_result=$this->privOpenFd('rb')) != 1)
  1966.     {
  1967.       // ----- Magic quotes trick
  1968.       $this->privSwapBackMagicQuotes();
  1969.       // ----- Return
  1970.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1971.       return $v_result;
  1972.     }
  1973.     // ----- Read the central directory informations
  1974.     $v_central_dir = array();
  1975.     if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  1976.     {
  1977.       $this->privCloseFd();
  1978.       $this->privSwapBackMagicQuotes();
  1979.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1980.       return $v_result;
  1981.     }
  1982.     // ----- Go to beginning of File
  1983.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
  1984.     @rewind($this->zip_fd);
  1985.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
  1986.     // ----- Creates a temporay file
  1987.     $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
  1988.     // ----- Open the temporary file in write mode
  1989.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  1990.     if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
  1991.     {
  1992.       $this->privCloseFd();
  1993.       $this->privSwapBackMagicQuotes();
  1994.       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file ''.$v_zip_temp_name.'' in binary write mode');
  1995.       // ----- Return
  1996.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1997.       return PclZip::errorCode();
  1998.     }
  1999.     // ----- Copy the files from the archive to the temporary file
  2000.     // TBC : Here I should better append the file and go back to erase the central dir
  2001.     $v_size = $v_central_dir['offset'];
  2002.     while ($v_size != 0)
  2003.     {
  2004.       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  2005.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  2006.       $v_buffer = fread($this->zip_fd, $v_read_size);
  2007.       @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  2008.       $v_size -= $v_read_size;
  2009.     }
  2010.     // ----- Swap the file descriptor
  2011.     // Here is a trick : I swap the temporary fd with the zip fd, in order to use
  2012.     // the following methods on the temporary fil and not the real archive
  2013.     $v_swap = $this->zip_fd;
  2014.     $this->zip_fd = $v_zip_temp_fd;
  2015.     $v_zip_temp_fd = $v_swap;
  2016.     // ----- Add the files
  2017.     $v_header_list = array();
  2018.     if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
  2019.     {
  2020.       fclose($v_zip_temp_fd);
  2021.       $this->privCloseFd();
  2022.       @unlink($v_zip_temp_name);
  2023.       $this->privSwapBackMagicQuotes();
  2024.       // ----- Return
  2025.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2026.       return $v_result;
  2027.     }
  2028.     // ----- Store the offset of the central dir
  2029.     $v_offset = @ftell($this->zip_fd);
  2030.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
  2031.     // ----- Copy the block of file headers from the old archive
  2032.     $v_size = $v_central_dir['size'];
  2033.     while ($v_size != 0)
  2034.     {
  2035.       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  2036.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  2037.       $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
  2038.       @fwrite($this->zip_fd, $v_buffer, $v_read_size);
  2039.       $v_size -= $v_read_size;
  2040.     }
  2041.     // ----- Create the Central Dir files header
  2042.     for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
  2043.     {
  2044.       // ----- Create the file header
  2045.       if ($v_header_list[$i]['status'] == 'ok') {
  2046.         if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  2047.           fclose($v_zip_temp_fd);
  2048.           $this->privCloseFd();
  2049.           @unlink($v_zip_temp_name);
  2050.           $this->privSwapBackMagicQuotes();
  2051.           // ----- Return
  2052.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2053.           return $v_result;
  2054.         }
  2055.         $v_count++;
  2056.       }
  2057.       // ----- Transform the header to a 'usable' info
  2058.       $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  2059.     }
  2060.     // ----- Zip file comment
  2061.     $v_comment = $v_central_dir['comment'];
  2062.     if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  2063.       $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  2064.     }
  2065.     if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
  2066.       $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
  2067.     }
  2068.     if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
  2069.       $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
  2070.     }
  2071.     // ----- Calculate the size of the central header
  2072.     $v_size = @ftell($this->zip_fd)-$v_offset;
  2073.     // ----- Create the central dir footer
  2074.     if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
  2075.     {
  2076.       // ----- Reset the file list
  2077.       unset($v_header_list);
  2078.       $this->privSwapBackMagicQuotes();
  2079.       // ----- Return
  2080.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2081.       return $v_result;
  2082.     }
  2083.     // ----- Swap back the file descriptor
  2084.     $v_swap = $this->zip_fd;
  2085.     $this->zip_fd = $v_zip_temp_fd;
  2086.     $v_zip_temp_fd = $v_swap;
  2087.     // ----- Close
  2088.     $this->privCloseFd();
  2089.     // ----- Close the temporary file
  2090.     @fclose($v_zip_temp_fd);
  2091.     // ----- Magic quotes trick
  2092.     $this->privSwapBackMagicQuotes();
  2093.     // ----- Delete the zip file
  2094.     // TBC : I should test the result ...
  2095.     @unlink($this->zipname);
  2096.     // ----- Rename the temporary file
  2097.     // TBC : I should test the result ...
  2098.     //@rename($v_zip_temp_name, $this->zipname);
  2099.     PclZipUtilRename($v_zip_temp_name, $this->zipname);
  2100.     // ----- Return
  2101.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2102.     return $v_result;
  2103.   }
  2104.   // --------------------------------------------------------------------------------
  2105.   // --------------------------------------------------------------------------------
  2106.   // Function : privOpenFd()
  2107.   // Description :
  2108.   // Parameters :
  2109.   // --------------------------------------------------------------------------------
  2110.   function privOpenFd($p_mode)
  2111.   {
  2112.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode);
  2113.     $v_result=1;
  2114.     // ----- Look if already open
  2115.     if ($this->zip_fd != 0)
  2116.     {
  2117.       // ----- Error log
  2118.       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file ''.$this->zipname.'' already open');
  2119.       // ----- Return
  2120.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2121.       return PclZip::errorCode();
  2122.     }
  2123.     // ----- Open the zip file
  2124.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode');
  2125.     if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
  2126.     {
  2127.       // ----- Error log
  2128.       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive ''.$this->zipname.'' in '.$p_mode.' mode');
  2129.       // ----- Return
  2130.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2131.       return PclZip::errorCode();
  2132.     }
  2133.     // ----- Return
  2134.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2135.     return $v_result;
  2136.   }
  2137.   // --------------------------------------------------------------------------------
  2138.   // --------------------------------------------------------------------------------
  2139.   // Function : privCloseFd()
  2140.   // Description :
  2141.   // Parameters :
  2142.   // --------------------------------------------------------------------------------
  2143.   function privCloseFd()
  2144.   {
  2145.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", "");
  2146.     $v_result=1;
  2147.     if ($this->zip_fd != 0)
  2148.       @fclose($this->zip_fd);
  2149.     $this->zip_fd = 0;
  2150.     // ----- Return
  2151.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2152.     return $v_result;
  2153.   }
  2154.   // --------------------------------------------------------------------------------
  2155.   // --------------------------------------------------------------------------------
  2156.   // Function : privAddList()
  2157.   // Description :
  2158.   //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
  2159.   //   different from the real path of the file. This is usefull if you want to have PclTar
  2160.   //   running in any directory, and memorize relative path from an other directory.
  2161.   // Parameters :
  2162.   //   $p_list : An array containing the file or directory names to add in the tar
  2163.   //   $p_result_list : list of added files with their properties (specially the status field)
  2164.   //   $p_add_dir : Path to add in the filename path archived
  2165.   //   $p_remove_dir : Path to remove in the filename path archived
  2166.   // Return Values :
  2167.   // --------------------------------------------------------------------------------
  2168. //  function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)
  2169.   function privAddList($p_filedescr_list, &$p_result_list, &$p_options)
  2170.   {
  2171.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list");
  2172.     $v_result=1;
  2173.     // ----- Add the files
  2174.     $v_header_list = array();
  2175.     if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
  2176.     {
  2177.       // ----- Return
  2178.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2179.       return $v_result;
  2180.     }
  2181.     // ----- Store the offset of the central dir
  2182.     $v_offset = @ftell($this->zip_fd);
  2183.     // ----- Create the Central Dir files header
  2184.     for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
  2185.     {
  2186.       // ----- Create the file header
  2187.       if ($v_header_list[$i]['status'] == 'ok') {
  2188.         if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  2189.           // ----- Return
  2190.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2191.           return $v_result;
  2192.         }
  2193.         $v_count++;
  2194.       }
  2195.       // ----- Transform the header to a 'usable' info
  2196.       $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  2197.     }
  2198.     // ----- Zip file comment
  2199.     $v_comment = '';
  2200.     if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  2201.       $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  2202.     }
  2203.     // ----- Calculate the size of the central header
  2204.     $v_size = @ftell($this->zip_fd)-$v_offset;
  2205.     // ----- Create the central dir footer
  2206.     if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
  2207.     {
  2208.       // ----- Reset the file list
  2209.       unset($v_header_list);
  2210.       // ----- Return
  2211.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2212.       return $v_result;
  2213.     }
  2214.     // ----- Return
  2215.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2216.     return $v_result;
  2217.   }
  2218.   // --------------------------------------------------------------------------------
  2219.   // --------------------------------------------------------------------------------
  2220.   // Function : privAddFileList()
  2221.   // Description :
  2222.   // Parameters :
  2223.   //   $p_filedescr_list : An array containing the file description 
  2224.   //                      or directory names to add in the zip
  2225.   //   $p_result_list : list of added files with their properties (specially the status field)
  2226.   // Return Values :
  2227.   // --------------------------------------------------------------------------------
  2228.   function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)
  2229.   {
  2230.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "filedescr_list");
  2231.     $v_result=1;
  2232.     $v_header = array();
  2233.     // ----- Recuperate the current number of elt in list
  2234.     $v_nb = sizeof($p_result_list);
  2235.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have ".$v_nb." elements");
  2236.     // ----- Loop on the files
  2237.     for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
  2238.       // ----- Format the filename
  2239.       $p_filedescr_list[$j]['filename']
  2240.       = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
  2241.       
  2242.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for file '".$p_filedescr_list[$j]['filename']."'");
  2243.       // ----- Skip empty file names
  2244.       // TBC : Can this be possible ? not checked in DescrParseAtt ?
  2245.       if ($p_filedescr_list[$j]['filename'] == "") {
  2246.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Skip empty filename");
  2247.         continue;
  2248.       }
  2249.       // ----- Check the filename
  2250.       if (   ($p_filedescr_list[$j]['type'] != 'virtual_file')
  2251.           && (!file_exists($p_filedescr_list[$j]['filename']))) {
  2252.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
  2253.         PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
  2254.         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2255.         return PclZip::errorCode();
  2256.       }
  2257.       // ----- Look if it is a file or a dir with no all path remove option
  2258.       // or a dir with all its path removed
  2259. //      if (   (is_file($p_filedescr_list[$j]['filename']))
  2260. //          || (   is_dir($p_filedescr_list[$j]['filename'])
  2261.       if (   ($p_filedescr_list[$j]['type'] == 'file')
  2262.           || ($p_filedescr_list[$j]['type'] == 'virtual_file')
  2263.           || (   ($p_filedescr_list[$j]['type'] == 'folder')
  2264.               && (   !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
  2265.                   || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))
  2266.           ) {
  2267.         // ----- Add the file
  2268.         $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
  2269.                                        $p_options);
  2270.         if ($v_result != 1) {
  2271.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2272.           return $v_result;
  2273.         }
  2274.         // ----- Store the file infos
  2275.         $p_result_list[$v_nb++] = $v_header;
  2276.       }
  2277.     }
  2278.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have ".$v_nb." elements");
  2279.     // ----- Return
  2280.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2281.     return $v_result;
  2282.   }
  2283.   // --------------------------------------------------------------------------------
  2284.   // --------------------------------------------------------------------------------
  2285.   // Function : privAddFile()
  2286.   // Description :
  2287.   // Parameters :
  2288.   // Return Values :
  2289.   // --------------------------------------------------------------------------------
  2290.   function privAddFile($p_filedescr, &$p_header, &$p_options)
  2291.   {
  2292.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='".$p_filedescr['filename']."'");
  2293.     $v_result=1;
  2294.     
  2295.     // ----- Working variable
  2296.     $p_filename = $p_filedescr['filename'];
  2297.     // TBC : Already done in the fileAtt check ... ?
  2298.     if ($p_filename == "") {
  2299.       // ----- Error log
  2300.       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
  2301.       // ----- Return
  2302.       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2303.       return PclZip::errorCode();
  2304.     }
  2305.   
  2306.     // ----- Look for a stored different filename 
  2307.     /* TBC : Removed
  2308.     if (isset($p_filedescr['stored_filename'])) {
  2309.       $v_stored_filename = $p_filedescr['stored_filename'];
  2310.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is NOT the same "'.$v_stored_filename.'"');
  2311.     }
  2312.     else {
  2313.       $v_stored_filename = $p_filedescr['stored_filename'];
  2314.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is the same');
  2315.     }
  2316.     */
  2317.     // ----- Set the file properties
  2318.     clearstatcache();
  2319.     $p_header['version'] = 20;
  2320.     $p_header['version_extracted'] = 10;
  2321.     $p_header['flag'] = 0;
  2322.     $p_header['compression'] = 0;
  2323.     $p_header['crc'] = 0;
  2324.     $p_header['compressed_size'] = 0;
  2325.     $p_header['filename_len'] = strlen($p_filename);
  2326.     $p_header['extra_len'] = 0;
  2327.     $p_header['disk'] = 0;
  2328.     $p_header['internal'] = 0;
  2329.     $p_header['offset'] = 0;
  2330.     $p_header['filename'] = $p_filename;
  2331. // TBC : Removed    $p_header['stored_filename'] = $v_stored_filename;
  2332.     $p_header['stored_filename'] = $p_filedescr['stored_filename'];
  2333.     $p_header['extra'] = '';
  2334.     $p_header['status'] = 'ok';
  2335.     $p_header['index'] = -1;
  2336.     // ----- Look for regular file
  2337.     if ($p_filedescr['type']=='file') {
  2338.       $p_header['external'] = 0x00000000;
  2339.       $p_header['size'] = filesize($p_filename);
  2340.     }
  2341.     
  2342.     // ----- Look for regular folder
  2343.     else if ($p_filedescr['type']=='folder') {
  2344.       $p_header['external'] = 0x00000010;
  2345.       $p_header['mtime'] = filemtime($p_filename);
  2346.       $p_header['size'] = filesize($p_filename);
  2347.     }
  2348.     
  2349.     // ----- Look for virtual file
  2350.     else if ($p_filedescr['type'] == 'virtual_file') {
  2351.       $p_header['external'] = 0x00000000;
  2352.       $p_header['size'] = strlen($p_filedescr['content']);
  2353.     }
  2354.     
  2355.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'");
  2356.     // ----- Look for filetime
  2357.     if (isset($p_filedescr['mtime'])) {
  2358.       $p_header['mtime'] = $p_filedescr['mtime'];
  2359.     }
  2360.     else if ($p_filedescr['type'] == 'virtual_file') {
  2361.       $p_header['mtime'] = mktime();
  2362.     }
  2363.     else {
  2364.       $p_header['mtime'] = filemtime($p_filename);
  2365.     }
  2366.     // ------ Look for file comment
  2367.     if (isset($p_filedescr['comment'])) {
  2368.       $p_header['comment_len'] = strlen($p_filedescr['comment']);
  2369.       $p_header['comment'] = $p_filedescr['comment'];
  2370.     }
  2371.     else {
  2372.       $p_header['comment_len'] = 0;
  2373.       $p_header['comment'] = '';
  2374.     }
  2375.     // ----- Look for pre-add callback
  2376.     if (isset($p_options[PCLZIP_CB_PRE_ADD])) {
  2377.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction");
  2378.       // ----- Generate a local information
  2379.       $v_local_header = array();
  2380.       $this->privConvertHeader2FileInfo($p_header, $v_local_header);
  2381.       // ----- Call the callback
  2382.       // Here I do not use call_user_func() because I need to send a reference to the
  2383.       // header.
  2384.       eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');
  2385.       if ($v_result == 0) {
  2386.         // ----- Change the file status
  2387.         $p_header['status'] = "skipped";
  2388.         $v_result = 1;
  2389.       }
  2390.       // ----- Update the informations
  2391.       // Only some fields can be modified
  2392.       if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
  2393.         $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
  2394.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'");
  2395.       }
  2396.     }
  2397.     // ----- Look for empty stored filename
  2398.     if ($p_header['stored_filename'] == "") {
  2399.       $p_header['status'] = "filtered";
  2400.     }
  2401.     
  2402.     // ----- Check the path length
  2403.     if (strlen($p_header['stored_filename']) > 0xFF) {
  2404.       $p_header['status'] = 'filename_too_long';
  2405.     }
  2406.     // ----- Look if no error, or file not skipped
  2407.     if ($p_header['status'] == 'ok') {
  2408.       // ----- Look for a file
  2409. //      if (is_file($p_filename))
  2410.       if (   ($p_filedescr['type'] == 'file')
  2411.           || ($p_filedescr['type'] == 'virtual_file')) {
  2412.           
  2413.         // ----- Get content from real file
  2414.         if ($p_filedescr['type'] == 'file') {        
  2415.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file");
  2416.           // ----- Open the source file
  2417.           if (($v_file = @fopen($p_filename, "rb")) == 0) {
  2418.             PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
  2419.             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2420.             return PclZip::errorCode();
  2421.           }
  2422.           // ----- Read the file content
  2423.           $v_content = @fread($v_file, $p_header['size']);
  2424.           // ----- Close the file
  2425.           @fclose($v_file);
  2426.         }
  2427.         else if ($p_filedescr['type'] == 'virtual_file') {        
  2428.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Add by string");
  2429.           $v_content = $p_filedescr['content'];
  2430.         }
  2431.         // ----- Calculate the CRC
  2432.         $p_header['crc'] = @crc32($v_content);
  2433.         
  2434.         // ----- Look for no compression
  2435.         if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
  2436.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed");
  2437.           // ----- Set header parameters
  2438.           $p_header['compressed_size'] = $p_header['size'];
  2439.           $p_header['compression'] = 0;
  2440.         }
  2441.         
  2442.         // ----- Look for normal compression
  2443.         else {
  2444.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed");
  2445.           // ----- Compress the content
  2446.           $v_content = @gzdeflate($v_content);
  2447.           // ----- Set header parameters
  2448.           $p_header['compressed_size'] = strlen($v_content);
  2449.           $p_header['compression'] = 8;
  2450.         }
  2451.         
  2452.         // ----- Look for encryption
  2453.         /*
  2454.         if ((isset($p_options[PCLZIP_OPT_CRYPT]))
  2455.     && ($p_options[PCLZIP_OPT_CRYPT] != "")) {
  2456.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ....");
  2457.           
  2458.           // Should be a random header
  2459.           $v_header = 'xxxxxxxxxxxx';
  2460.       $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed,
  2461.                                            $p_header['compressed_size'],
  2462.                                                $v_header,
  2463.    $p_header['crc'],
  2464.    "test");
  2465.    
  2466.           $p_header['compressed_size'] += 12;
  2467.           $p_header['flag'] = 1;
  2468.           
  2469.           // ----- Add the header to the data
  2470.           $v_content_compressed = $v_header.$v_content_compressed;
  2471.           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed)."");
  2472.         }
  2473.         */
  2474.         // ----- Call the header generation
  2475.         if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
  2476.           @fclose($v_file);
  2477.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2478.           return $v_result;
  2479.         }
  2480.         // ----- Write the compressed (or not) content
  2481.         @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
  2482.       }
  2483.       // ----- Look for a directory
  2484.       else if ($p_filedescr['type'] == 'folder') {
  2485.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder");
  2486.         // ----- Look for directory last '/'
  2487.         if (@substr($p_header['stored_filename'], -1) != '/') {
  2488.           $p_header['stored_filename'] .= '/';
  2489.         }
  2490.         // ----- Set the file properties
  2491.         $p_header['size'] = 0;
  2492.         //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
  2493.         $p_header['external'] = 0x00000010;   // Value for a folder : to be checked
  2494.         // ----- Call the header generation
  2495.         if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
  2496.         {
  2497.           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2498.           return $v_result;
  2499.         }
  2500.       }
  2501.     }
  2502.     // ----- Look for post-add callback
  2503.     if (isset($p_options[PCLZIP_CB_POST_ADD])) {
  2504.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction");
  2505.       // ----- Generate a local information
  2506.       $v_local_header = array();
  2507.       $this->privConvertHeader2FileInfo($p_header, $v_local_header);
  2508.       // ----- Call the callback
  2509.       // Here I do not use call_user_func() because I need to send a reference to the
  2510.       // header.
  2511.       eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');
  2512.       if ($v_result == 0) {
  2513.         // ----- Ignored
  2514.         $v_result = 1;
  2515.       }
  2516.       // ----- Update the informations
  2517.       // Nothing can be modified
  2518.     }
  2519.     // ----- Return
  2520.     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2521.     return $v_result;
  2522.   }
  2523.   // --------------------------------------------------------------------------------
  2524.   // --------------------------------------------------------------------------------
  2525.   // Function : privCalculateStoredFilename()
  2526.   // Description :
  2527.   //   Based on file descriptor properties and global options, this method
  2528.   //   calculate the filename that will be stored in the archive.
  2529.   // Parameters :
  2530.   // Return Values :
  2531.   // --------------------------------------------------------------------------------
  2532.   function privCalculateStoredFilename(&$p_filedescr, &$p_options)
  2533.   {
  2534.     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCalculateStoredFilename", "filename='".$p_filedescr['filename']."'");
  2535.     $v_result=1;
  2536.     
  2537.     // ----- Working variables
  2538.     $p_filename = $p_filedescr['filename'];
  2539.     if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
  2540.       $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
  2541.     }
  2542.     else {
  2543.       $p_add_dir = '';
  2544.     }
  2545.     if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
  2546.       $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
  2547.     }
  2548.     else {
  2549.       $p_remove_dir = '';
  2550.     }
  2551.     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Remove path ='".$p_remove_dir."'");
  2552.     if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  2553.       $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  2554.     }
  2555.     else {
  2556.       $p_remove_all_dir = 0;
  2557.     }
  2558.     // ----- Look for full name change
  2559.     if (isset($p_filedescr['new_full_name'])) {
  2560.       $v_stored_filename = $p_filedescr['new_full_name'];
  2561.       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing full name of '".$p_filename."' for '".$v_stored_filename."'");
  2562.     }
  2563.     
  2564.     // ----- Look for path and/or short name change
  2565.     else {
  2566.       // ----- Look for short name change
  2567.       if (isset($p_filedescr['new_short_name'])) {
  2568.         $v_path_info = pathinfo($p_filename);
  2569.         $v_dir = '';
  2570.         if ($v_path_info['dirname'] != '') {
  2571.           $v_dir = $v_path_info['dirname'].'/';
  2572.         }
  2573.         $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
  2574.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing short name of '".$p_filename."' for '".$v_stored_filename."'");
  2575.       }
  2576.       else {
  2577.         // ----- Calculate the stored filename
  2578.         $v_stored_filename = $p_filename;
  2579.       }
  2580.       // ----- Look for all path to remove
  2581.       if ($p_remove_all_dir) {
  2582.         $v_stored_filename = basename($p_filename);
  2583.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove all path selected change '".$p_filename."' for '".$v_stored_filename."'");
  2584.       }
  2585.       // ----- Look for partial path remove
  2586.       else if ($p_remove_dir != "") {
  2587.         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Partial path to remove");
  2588.         if (substr($p_remove_dir, -1) != '/')
  2589.           $p_remove_dir .= "/";
  2590.         if (   (substr($p_filename, 0, 2) == "./")
  2591.             || (substr($p_remove_dir, 0, 2) == "./")) {
  2592.             
  2593.           if (   (substr($p_filename, 0, 2) == "./")
  2594.               && (substr($p_remove_dir, 0, 2) != "./")) {
  2595.             $p_remove_dir = "./".$p_remove_dir;
  2596.           }
  2597.           if (   (substr($p_filename, 0, 2) != "./")
  2598.               && (substr($p_remove_dir, 0, 2) == "./")) {
  2599.             $p_remove_dir = substr($p_remove_dir, 2);
  2600.           }
  2601.         }
  2602.         $v_compare = PclZipUtilPathInclusion($p_remove_dir,
  2603.                                              $v_stored_filename);
  2604.         if ($v_compare > 0) {
  2605.           if ($v_compare == 2) {
  2606.             $v_stored_filename = "";
  2607.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder");
  2608.           }
  2609.           else {
  2610.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$v_stored_filename'");
  2611.             $v_stored_filename = substr($v_stored_filename,
  2612.                                         strlen($p_remove_dir));
  2613.             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Result is '$v_stored_filename'");