Make WordPress Core

Changeset 11025


Ignore:
Timestamp:
04/20/2009 10:25:40 PM (16 years ago)
Author:
ryan
Message:

Update pclzip to 2.7. Props simek. fixes #9464

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/class-pclzip.php

    r8645 r11025  
    11<?php
    2 /**
    3  * PhpConcept Library - Zip Module 2.5
    4  *
    5  * Presentation :
    6  *   PclZip is a PHP library that manage ZIP archives.
    7  *   So far tests show that archives generated by PclZip are readable by
    8  *   WinZip application and other tools.
    9  *
    10  * Warning :
    11  *   This library and the associated files are non commercial, non professional
    12  *   work.
    13  *   It should not have unexpected results. However if any damage is caused by
    14  *   this software the author can not be responsible.
    15  *   The use of this software is at the risk of the user.
    16  *
    17  * @package External
    18  * @subpackage PclZip
    19  *
    20  * @license License GNU/LGPL
    21  * @copyright March 2006 Vincent Blavet
    22  * @author Vincent Blavet
    23  * @link http://www.phpconcept.net
    24  * @version $Id: pclzip.lib.php,v 1.44 2006/03/08 21:23:59 vblavet Exp $
    25  */
    26 
    27 /**
    28  * The read block size for reading zip files.
    29  *
    30  * @since 2.5
    31  */
    32 define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
    33 
    34 /**
    35  * File list separator
    36  *
    37  * In version 1.x of PclZip, the separator for file list is a space(which is not
    38  * a very smart choice, specifically for windows paths !). A better separator
    39  * should be a comma (,). This constant gives you the abilty to change that.
    40  *
    41  * However notice that changing this value, may have impact on existing scripts,
    42  * using space separated filenames. Recommanded values for compatibility with
    43  * older versions :
    44  * <code>define( 'PCLZIP_SEPARATOR', ' ' );</code>
    45  * Recommanded values for smart separation of filenames.
    46  */
    47 define( 'PCLZIP_SEPARATOR', ',' );
    48 
    49 /**
    50  * Error configuration
    51  *
    52  * 0 : PclZip Class integrated error handling
    53  * 1 : PclError external library error handling. By enabling this you must
    54  *     ensure that you have included PclError library.
    55  * [2,...] : reserved for future use
    56  */
    57 define( 'PCLZIP_ERROR_EXTERNAL', 0 );
     2// --------------------------------------------------------------------------------
     3// PhpConcept Library - Zip Module 2.7
     4// --------------------------------------------------------------------------------
     5// License GNU/LGPL - Vincent Blavet - March 2006
     6// http://www.phpconcept.net
     7// --------------------------------------------------------------------------------
     8//
     9// Presentation :
     10//   PclZip is a PHP library that manage ZIP archives.
     11//   So far tests show that archives generated by PclZip are readable by
     12//   WinZip application and other tools.
     13//
     14// Description :
     15//   See readme.txt and http://www.phpconcept.net
     16//
     17// Warning :
     18//   This library and the associated files are non commercial, non professional
     19//   work.
     20//   It should not have unexpected results. However if any damage is caused by
     21//   this software the author can not be responsible.
     22//   The use of this software is at the risk of the user.
     23//
     24// --------------------------------------------------------------------------------
     25// $Id: pclzip.lib.php,v 1.50 2009/03/24 17:13:52 vblavet Exp $
     26// --------------------------------------------------------------------------------
     27
     28  // ----- Constants
     29  if (!defined('PCLZIP_READ_BLOCK_SIZE')) {
     30    define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
     31  }
     32 
     33  // ----- File list separator
     34  // In version 1.x of PclZip, the separator for file list is a space
     35  // (which is not a very smart choice, specifically for windows paths !).
     36  // A better separator should be a comma (,). This constant gives you the
     37  // abilty to change that.
     38  // However notice that changing this value, may have impact on existing
     39  // scripts, using space separated filenames.
     40  // Recommanded values for compatibility with older versions :
     41  //define( 'PCLZIP_SEPARATOR', ' ' );
     42  // Recommanded values for smart separation of filenames.
     43  if (!defined('PCLZIP_SEPARATOR')) {
     44    define( 'PCLZIP_SEPARATOR', ',' );
     45  }
     46
     47  // ----- Error configuration
     48  // 0 : PclZip Class integrated error handling
     49  // 1 : PclError external library error handling. By enabling this
     50  //     you must ensure that you have included PclError library.
     51  // [2,...] : reserved for futur use
     52  if (!defined('PCLZIP_ERROR_EXTERNAL')) {
     53    define( 'PCLZIP_ERROR_EXTERNAL', 0 );
     54  }
    5855
    5956  // ----- Optional static temporary directory
    60   //       By default temporary files are generated in the script current
    61   //       path.
    62   //       If defined :
    63   //       - MUST BE terminated by a '/'.
    64   //       - MUST be a valid, already created directory
    65   //       Samples :
     57  //       By default temporary files are generated in the script current
     58  //       path.
     59  //       If defined :
     60  //       - MUST BE terminated by a '/'.
     61  //       - MUST be a valid, already created directory
     62  //       Samples :
    6663  // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
    6764  // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
    68   define( 'PCLZIP_TEMPORARY_DIR', '' );
     65  if (!defined('PCLZIP_TEMPORARY_DIR')) {
     66    define( 'PCLZIP_TEMPORARY_DIR', '' );
     67  }
    6968
    7069// --------------------------------------------------------------------------------
     
    7372
    7473  // ----- Global variables
    75   $g_pclzip_version = "2.5";
     74  $g_pclzip_version = "2.7";
    7675
    7776  // ----- Error codes
     
    136135  //define( 'PCLZIP_OPT_CRYPT', 77018 );
    137136  define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
    138 
     137  define( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 );
     138  define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 );
     139  define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 );
     140 
    139141  // ----- File description attributes
    140142  define( 'PCLZIP_ATT_FILE_NAME', 79001 );
    141143  define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
    142144  define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
     145  define( 'PCLZIP_ATT_FILE_MTIME', 79004 );
     146  define( 'PCLZIP_ATT_FILE_CONTENT', 79005 );
     147  define( 'PCLZIP_ATT_FILE_COMMENT', 79006 );
    143148
    144149  // ----- Call backs values
     
    147152  define( 'PCLZIP_CB_PRE_ADD', 78003 );
    148153  define( 'PCLZIP_CB_POST_ADD', 78004 );
    149   /* For future use
     154  /* For futur use
    150155  define( 'PCLZIP_CB_PRE_LIST', 78005 );
    151156  define( 'PCLZIP_CB_POST_LIST', 78006 );
     
    170175  class PclZip
    171176  {
    172     // ----- Filename of the zip file
    173     var $zipname = '';
    174 
    175     // ----- File descriptor of the zip file
    176     var $zip_fd = 0;
    177 
    178     // ----- Internal error handling
    179     var $error_code = 1;
    180     var $error_string = '';
    181 
    182     // ----- Current status of the magic_quotes_runtime
    183     // This value store the php configuration for magic_quotes
    184     // The class can then disable the magic_quotes and reset it after
    185     var $magic_quotes_status;
     177    // ----- Filename of the zip file
     178    var $zipname = '';
     179
     180    // ----- File descriptor of the zip file
     181    var $zip_fd = 0;
     182
     183    // ----- Internal error handling
     184    var $error_code = 1;
     185    var $error_string = '';
     186   
     187    // ----- Current status of the magic_quotes_runtime
     188    // This value store the php configuration for magic_quotes
     189    // The class can then disable the magic_quotes and reset it after
     190    var $magic_quotes_status;
    186191
    187192  // --------------------------------------------------------------------------------
     
    195200  function PclZip($p_zipname)
    196201  {
    197     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::PclZip', "zipname=$p_zipname");
    198 
    199     // ----- Tests the zlib
    200     if (!function_exists('gzopen'))
    201     {
    202       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 1, "zlib extension seems to be missing");
    203       die('Abort '.basename(__FILE__).' : Missing zlib extensions');
    204     }
    205 
    206     // ----- Set the attributes
    207     $this->zipname = $p_zipname;
    208     $this->zip_fd = 0;
    209     $this->magic_quotes_status = -1;
    210 
    211     // ----- Return
    212     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1);
    213     return;
     202    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::PclZip', "zipname=$p_zipname");
     203
     204    // ----- Tests the zlib
     205    if (!function_exists('gzopen'))
     206    {
     207      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 1, "zlib extension seems to be missing");
     208      die('Abort '.basename(__FILE__).' : Missing zlib extensions');
     209    }
     210
     211    // ----- Set the attributes
     212    $this->zipname = $p_zipname;
     213    $this->zip_fd = 0;
     214    $this->magic_quotes_status = -1;
     215
     216    // ----- Return
     217    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1);
     218    return;
    214219  }
    215220  // --------------------------------------------------------------------------------
     
    231236  // Parameters :
    232237  //   $p_filelist : An array containing file or directory names, or
    233   //                a string containing one filename or one directory name, or
    234   //                a string containing a list of filenames and/or directory
    235   //                names separated by spaces.
     238  //                a string containing one filename or one directory name, or
     239  //                a string containing a list of filenames and/or directory
     240  //                names separated by spaces.
    236241  //   $p_add_dir : A path to add before the real path of the archived file,
    237   //                in order to have it memorized in the archive.
     242  //                in order to have it memorized in the archive.
    238243  //   $p_remove_dir : A path to remove from the real path of the file to archive,
    239   //                   in order to have a shorter path memorized in the archive.
    240   //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
    241   //                   is removed first, before $p_add_dir is added.
     244  //                   in order to have a shorter path memorized in the archive.
     245  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
     246  //                   is removed first, before $p_add_dir is added.
    242247  // Options :
    243248  //   PCLZIP_OPT_ADD_PATH :
     
    254259  function create($p_filelist)
    255260  {
    256     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ...");
    257     $v_result=1;
    258 
    259     // ----- Reset the error handler
    260     $this->privErrorReset();
    261 
    262     // ----- Set default values
    263     $v_options = array();
    264     $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
    265 
    266     // ----- Look for variable options arguments
    267     $v_size = func_num_args();
    268     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
    269 
    270     // ----- Look for arguments
    271     if ($v_size > 1) {
    272       // ----- Get the arguments
    273       $v_arg_list = func_get_args();
    274 
    275       // ----- Remove from the options list the first argument
    276       array_shift($v_arg_list);
    277       $v_size--;
    278 
    279       // ----- Look for first arg
    280       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
    281         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
    282 
    283         // ----- Parse the options
    284         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
    285                                             array (PCLZIP_OPT_REMOVE_PATH => 'optional',
    286                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
    287                                                    PCLZIP_OPT_ADD_PATH => 'optional',
    288                                                    PCLZIP_CB_PRE_ADD => 'optional',
    289                                                    PCLZIP_CB_POST_ADD => 'optional',
    290                                                    PCLZIP_OPT_NO_COMPRESSION => 'optional',
    291                                                    PCLZIP_OPT_COMMENT => 'optional'
    292                                                    //, PCLZIP_OPT_CRYPT => 'optional'
    293                                              ));
    294         if ($v_result != 1) {
    295           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    296           return 0;
    297         }
    298       }
    299 
    300       // ----- Look for 2 args
    301       // Here we need to support the first historic synopsis of the
    302       // method.
    303       else {
    304         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
    305 
    306         // ----- Get the first argument
    307         $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];
    308 
    309         // ----- Look for the optional second argument
    310         if ($v_size == 2) {
    311           $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
    312         }
    313         else if ($v_size > 2) {
    314           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
    315                                "Invalid number / type of arguments");
    316           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    317           return 0;
    318         }
    319       }
    320     }
    321 
    322     // ----- Init
    323     $v_string_list = array();
    324     $v_att_list = array();
    325     $v_filedescr_list = array();
    326     $p_result_list = array();
    327 
    328     // ----- Look if the $p_filelist is really an array
    329     if (is_array($p_filelist)) {
    330 
    331       // ----- Look if the first element is also an array
    332       //       This will mean that this is a file description entry
    333       if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
    334         $v_att_list = $p_filelist;
    335       }
    336 
    337       // ----- The list is a list of string names
    338       else {
    339         $v_string_list = $p_filelist;
    340       }
    341     }
    342 
    343     // ----- Look if the $p_filelist is a string
    344     else if (is_string($p_filelist)) {
    345       // ----- Create a list from the string
    346       $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
    347     }
    348 
    349     // ----- Invalid variable type for $p_filelist
    350     else {
    351       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
    352       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    353       return 0;
    354     }
    355 
    356     // ----- Reformat the string list
    357     if (sizeof($v_string_list) != 0) {
    358       foreach ($v_string_list as $v_string) {
    359         if ($v_string != '') {
    360           $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
    361         }
    362         else {
    363           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Ignore an empty filename");
    364         }
    365       }
    366     }
    367 
    368     // ----- For each file in the list check the attributes
    369     $v_supported_attributes
    370     = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
    371              ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
    372              ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
     261    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ...");
     262    $v_result=1;
     263
     264    // ----- Reset the error handler
     265    $this->privErrorReset();
     266
     267    // ----- Set default values
     268    $v_options = array();
     269    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
     270
     271    // ----- Look for variable options arguments
     272    $v_size = func_num_args();
     273    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
     274
     275    // ----- Look for arguments
     276    if ($v_size > 1) {
     277      // ----- Get the arguments
     278      $v_arg_list = func_get_args();
     279
     280      // ----- Remove from the options list the first argument
     281      array_shift($v_arg_list);
     282      $v_size--;
     283
     284      // ----- Look for first arg
     285      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
     286        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
     287
     288        // ----- Parse the options
     289        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
     290                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
     291                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
     292                                                   PCLZIP_OPT_ADD_PATH => 'optional',
     293                                                   PCLZIP_CB_PRE_ADD => 'optional',
     294                                                   PCLZIP_CB_POST_ADD => 'optional',
     295                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
     296                                                   PCLZIP_OPT_COMMENT => 'optional',
     297                                                   PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD => 'optional',
     298                                                   PCLZIP_OPT_ADD_TEMP_FILE_ON => 'optional',
     299                                                   PCLZIP_OPT_ADD_TEMP_FILE_OFF => 'optional'
     300                                                   //, PCLZIP_OPT_CRYPT => 'optional'
     301                                             ));
     302        if ($v_result != 1) {
     303          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     304          return 0;
     305        }
     306      }
     307
     308      // ----- Look for 2 args
     309      // Here we need to support the first historic synopsis of the
     310      // method.
     311      else {
     312        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
     313
     314        // ----- Get the first argument
     315        $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];
     316
     317        // ----- Look for the optional second argument
     318        if ($v_size == 2) {
     319          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
     320        }
     321        else if ($v_size > 2) {
     322          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
     323                               "Invalid number / type of arguments");
     324          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     325          return 0;
     326        }
     327      }
     328    }
     329   
     330    // ----- Look for default option values
     331    if (!isset($v_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD])) {
     332      $this->privOptionDefaultThreshold($v_options);
     333    }
     334
     335    // ----- Init
     336    $v_string_list = array();
     337    $v_att_list = array();
     338    $v_filedescr_list = array();
     339    $p_result_list = array();
     340   
     341    // ----- Look if the $p_filelist is really an array
     342    if (is_array($p_filelist)) {
     343   
     344      // ----- Look if the first element is also an array
     345      //       This will mean that this is a file description entry
     346      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
     347        $v_att_list = $p_filelist;
     348      }
     349     
     350      // ----- The list is a list of string names
     351      else {
     352        $v_string_list = $p_filelist;
     353      }
     354    }
     355
     356    // ----- Look if the $p_filelist is a string
     357    else if (is_string($p_filelist)) {
     358      // ----- Create a list from the string
     359      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
     360    }
     361
     362    // ----- Invalid variable type for $p_filelist
     363    else {
     364      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
     365      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     366      return 0;
     367    }
     368   
     369    // ----- Reformat the string list
     370    if (sizeof($v_string_list) != 0) {
     371      foreach ($v_string_list as $v_string) {
     372        if ($v_string != '') {
     373          $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
     374        }
     375        else {
     376          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Ignore an empty filename");
     377        }
     378      }
     379    }
     380   
     381    // ----- For each file in the list check the attributes
     382    $v_supported_attributes
     383    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
     384             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
     385             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
     386             ,PCLZIP_ATT_FILE_MTIME => 'optional'
     387             ,PCLZIP_ATT_FILE_CONTENT => 'optional'
     388             ,PCLZIP_ATT_FILE_COMMENT => 'optional'
    373389                        );
    374     foreach ($v_att_list as $v_entry) {
    375       $v_result = $this->privFileDescrParseAtt($v_entry,
    376                                                $v_filedescr_list[],
    377                                                $v_options,
    378                                                $v_supported_attributes);
    379       if ($v_result != 1) {
    380         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    381         return 0;
    382       }
    383     }
    384 
    385     // ----- Expand the filelist (expand directories)
    386     $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
    387     if ($v_result != 1) {
    388       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    389       return 0;
    390     }
    391 
    392     // ----- Call the create fct
    393     $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
    394     if ($v_result != 1) {
    395       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    396       return 0;
    397     }
    398 
    399     // ----- Return
    400     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
    401     return $p_result_list;
     390    foreach ($v_att_list as $v_entry) {
     391      $v_result = $this->privFileDescrParseAtt($v_entry,
     392                                               $v_filedescr_list[],
     393                                               $v_options,
     394                                               $v_supported_attributes);
     395      if ($v_result != 1) {
     396        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     397        return 0;
     398      }
     399    }
     400
     401    // ----- Expand the filelist (expand directories)
     402    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
     403    if ($v_result != 1) {
     404      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     405      return 0;
     406    }
     407
     408    // ----- Call the create fct
     409    $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
     410    if ($v_result != 1) {
     411      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     412      return 0;
     413    }
     414
     415    // ----- Return
     416    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
     417    return $p_result_list;
    402418  }
    403419  // --------------------------------------------------------------------------------
     
    415431  // Parameters :
    416432  //   $p_filelist : An array containing file or directory names, or
    417   //                a string containing one filename or one directory name, or
    418   //                a string containing a list of filenames and/or directory
    419   //                names separated by spaces.
     433  //                a string containing one filename or one directory name, or
     434  //                a string containing a list of filenames and/or directory
     435  //                names separated by spaces.
    420436  //   $p_add_dir : A path to add before the real path of the archived file,
    421   //                in order to have it memorized in the archive.
     437  //                in order to have it memorized in the archive.
    422438  //   $p_remove_dir : A path to remove from the real path of the file to archive,
    423   //                   in order to have a shorter path memorized in the archive.
    424   //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
    425   //                   is removed first, before $p_add_dir is added.
     439  //                   in order to have a shorter path memorized in the archive.
     440  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
     441  //                   is removed first, before $p_add_dir is added.
    426442  // Options :
    427443  //   PCLZIP_OPT_ADD_PATH :
     
    440456  function add($p_filelist)
    441457  {
    442     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ...");
    443     $v_result=1;
    444 
    445     // ----- Reset the error handler
    446     $this->privErrorReset();
    447 
    448     // ----- Set default values
    449     $v_options = array();
    450     $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
    451 
    452     // ----- Look for variable options arguments
    453     $v_size = func_num_args();
    454     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
    455 
    456     // ----- Look for arguments
    457     if ($v_size > 1) {
    458       // ----- Get the arguments
    459       $v_arg_list = func_get_args();
    460 
    461       // ----- Remove form the options list the first argument
    462       array_shift($v_arg_list);
    463       $v_size--;
    464 
    465       // ----- Look for first arg
    466       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
    467         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
    468 
    469         // ----- Parse the options
    470         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
    471                                             array (PCLZIP_OPT_REMOVE_PATH => 'optional',
    472                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
    473                                                    PCLZIP_OPT_ADD_PATH => 'optional',
    474                                                    PCLZIP_CB_PRE_ADD => 'optional',
    475                                                    PCLZIP_CB_POST_ADD => 'optional',
    476                                                    PCLZIP_OPT_NO_COMPRESSION => 'optional',
    477                                                    PCLZIP_OPT_COMMENT => 'optional',
    478                                                    PCLZIP_OPT_ADD_COMMENT => 'optional',
    479                                                    PCLZIP_OPT_PREPEND_COMMENT => 'optional'
    480                                                    //, PCLZIP_OPT_CRYPT => 'optional'
     458    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ...");
     459    $v_result=1;
     460
     461    // ----- Reset the error handler
     462    $this->privErrorReset();
     463
     464    // ----- Set default values
     465    $v_options = array();
     466    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
     467
     468    // ----- Look for variable options arguments
     469    $v_size = func_num_args();
     470    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
     471
     472    // ----- Look for arguments
     473    if ($v_size > 1) {
     474      // ----- Get the arguments
     475      $v_arg_list = func_get_args();
     476
     477      // ----- Remove form the options list the first argument
     478      array_shift($v_arg_list);
     479      $v_size--;
     480
     481      // ----- Look for first arg
     482      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
     483        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
     484
     485        // ----- Parse the options
     486        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
     487                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
     488                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
     489                                                   PCLZIP_OPT_ADD_PATH => 'optional',
     490                                                   PCLZIP_CB_PRE_ADD => 'optional',
     491                                                   PCLZIP_CB_POST_ADD => 'optional',
     492                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
     493                                                   PCLZIP_OPT_COMMENT => 'optional',
     494                                                   PCLZIP_OPT_ADD_COMMENT => 'optional',
     495                                                   PCLZIP_OPT_PREPEND_COMMENT => 'optional',
     496                                                   PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD => 'optional',
     497                                                   PCLZIP_OPT_ADD_TEMP_FILE_ON => 'optional',
     498                                                   PCLZIP_OPT_ADD_TEMP_FILE_OFF => 'optional'
     499                                                   //, PCLZIP_OPT_CRYPT => 'optional'
    481500                                                   ));
    482         if ($v_result != 1) {
    483           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    484           return 0;
    485         }
    486       }
    487 
    488       // ----- Look for 2 args
    489       // Here we need to support the first historic synopsis of the
    490       // method.
    491       else {
    492         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
    493 
    494         // ----- Get the first argument
    495         $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];
    496 
    497         // ----- Look for the optional second argument
    498         if ($v_size == 2) {
    499           $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
    500         }
    501         else if ($v_size > 2) {
    502           // ----- Error log
    503           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
    504 
    505           // ----- Return
    506           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    507           return 0;
    508         }
    509       }
    510     }
    511 
    512     // ----- Init
    513     $v_string_list = array();
    514     $v_att_list = array();
    515     $v_filedescr_list = array();
    516     $p_result_list = array();
    517 
    518     // ----- Look if the $p_filelist is really an array
    519     if (is_array($p_filelist)) {
    520 
    521       // ----- Look if the first element is also an array
    522       //       This will mean that this is a file description entry
    523       if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
    524         $v_att_list = $p_filelist;
    525       }
    526 
    527       // ----- The list is a list of string names
    528       else {
    529         $v_string_list = $p_filelist;
    530       }
    531     }
    532 
    533     // ----- Look if the $p_filelist is a string
    534     else if (is_string($p_filelist)) {
    535       // ----- Create a list from the string
    536       $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
    537     }
    538 
    539     // ----- Invalid variable type for $p_filelist
    540     else {
    541       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
    542       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    543       return 0;
    544     }
    545 
    546     // ----- Reformat the string list
    547     if (sizeof($v_string_list) != 0) {
    548       foreach ($v_string_list as $v_string) {
    549         $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
    550       }
    551     }
    552 
    553     // ----- For each file in the list check the attributes
    554     $v_supported_attributes
    555     = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
    556              ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
    557              ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
     501        if ($v_result != 1) {
     502          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     503          return 0;
     504        }
     505      }
     506
     507      // ----- Look for 2 args
     508      // Here we need to support the first historic synopsis of the
     509      // method.
     510      else {
     511        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
     512
     513        // ----- Get the first argument
     514        $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];
     515
     516        // ----- Look for the optional second argument
     517        if ($v_size == 2) {
     518          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
     519        }
     520        else if ($v_size > 2) {
     521          // ----- Error log
     522          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
     523
     524          // ----- Return
     525          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     526          return 0;
     527        }
     528      }
     529    }
     530
     531    // ----- Look for default option values
     532    if (!isset($v_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD])) {
     533      $this->privOptionDefaultThreshold($v_options);
     534    }
     535
     536    // ----- Init
     537    $v_string_list = array();
     538    $v_att_list = array();
     539    $v_filedescr_list = array();
     540    $p_result_list = array();
     541   
     542    // ----- Look if the $p_filelist is really an array
     543    if (is_array($p_filelist)) {
     544   
     545      // ----- Look if the first element is also an array
     546      //       This will mean that this is a file description entry
     547      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
     548        $v_att_list = $p_filelist;
     549      }
     550     
     551      // ----- The list is a list of string names
     552      else {
     553        $v_string_list = $p_filelist;
     554      }
     555    }
     556
     557    // ----- Look if the $p_filelist is a string
     558    else if (is_string($p_filelist)) {
     559      // ----- Create a list from the string
     560      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
     561    }
     562
     563    // ----- Invalid variable type for $p_filelist
     564    else {
     565      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
     566      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     567      return 0;
     568    }
     569   
     570    // ----- Reformat the string list
     571    if (sizeof($v_string_list) != 0) {
     572      foreach ($v_string_list as $v_string) {
     573        $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
     574      }
     575    }
     576   
     577    // ----- For each file in the list check the attributes
     578    $v_supported_attributes
     579    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
     580             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
     581             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
     582             ,PCLZIP_ATT_FILE_MTIME => 'optional'
     583             ,PCLZIP_ATT_FILE_CONTENT => 'optional'
     584             ,PCLZIP_ATT_FILE_COMMENT => 'optional'
    558585                        );
    559     foreach ($v_att_list as $v_entry) {
    560       $v_result = $this->privFileDescrParseAtt($v_entry,
    561                                                $v_filedescr_list[],
    562                                                $v_options,
    563                                                $v_supported_attributes);
    564       if ($v_result != 1) {
    565         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    566         return 0;
    567       }
    568     }
    569 
    570     // ----- Expand the filelist (expand directories)
    571     $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
    572     if ($v_result != 1) {
    573       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    574       return 0;
    575     }
    576 
    577     // ----- Call the create fct
    578     $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
    579     if ($v_result != 1) {
    580       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    581       return 0;
    582     }
    583 
    584     // ----- Return
    585     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
    586     return $p_result_list;
     586    foreach ($v_att_list as $v_entry) {
     587      $v_result = $this->privFileDescrParseAtt($v_entry,
     588                                               $v_filedescr_list[],
     589                                               $v_options,
     590                                               $v_supported_attributes);
     591      if ($v_result != 1) {
     592        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     593        return 0;
     594      }
     595    }
     596
     597    // ----- Expand the filelist (expand directories)
     598    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
     599    if ($v_result != 1) {
     600      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     601      return 0;
     602    }
     603
     604    // ----- Call the create fct
     605    $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
     606    if ($v_result != 1) {
     607      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     608      return 0;
     609    }
     610
     611    // ----- Return
     612    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
     613    return $p_result_list;
    587614  }
    588615  // --------------------------------------------------------------------------------
     
    594621  //   properties.
    595622  //   The properties of each entries in the list are (used also in other functions) :
    596   //    filename : Name of the file. For a create or add action it is the filename
    597   //                given by the user. For an extract function it is the filename
    598   //                of the extracted file.
    599   //    stored_filename : Name of the file / directory stored in the archive.
    600   //    size : Size of the stored file.
    601   //    compressed_size : Size of the file's data compressed in the archive
    602   //                       (without the headers overhead)
    603   //    mtime : Last known modification date of the file (UNIX timestamp)
    604   //    comment : Comment associated with the file
    605   //    folder : true | false
    606   //    index : index of the file in the archive
    607   //    status : status of the action (depending of the action) :
    608   //              Values are :
    609   //                ok : OK !
    610   //                filtered : the file / dir is not extracted (filtered by user)
    611   //                already_a_directory : the file can not be extracted because a
    612   //                                      directory with the same name already exists
    613   //                write_protected : the file can not be extracted because a file
    614   //                                  with the same name already exists and is
    615   //                                  write protected
    616   //                newer_exist : the file was not extracted because a newer file exists
    617   //                path_creation_fail : the file is not extracted because the folder
    618   //                                     does not exists and can not be created
    619   //                write_error : the file was not extracted because there was a
    620   //                              error while writing the file
    621   //                read_error : the file was not extracted because there was a error
    622   //                            while reading the file
    623   //                invalid_header : the file was not extracted because of an archive
    624   //                                format error (bad file header)
     623  //    filename : Name of the file. For a create or add action it is the filename
     624  //                given by the user. For an extract function it is the filename
     625  //                of the extracted file.
     626  //    stored_filename : Name of the file / directory stored in the archive.
     627  //    size : Size of the stored file.
     628  //    compressed_size : Size of the file's data compressed in the archive
     629  //                       (without the headers overhead)
     630  //    mtime : Last known modification date of the file (UNIX timestamp)
     631  //    comment : Comment associated with the file
     632  //    folder : true | false
     633  //    index : index of the file in the archive
     634  //    status : status of the action (depending of the action) :
     635  //              Values are :
     636  //                ok : OK !
     637  //                filtered : the file / dir is not extracted (filtered by user)
     638  //                already_a_directory : the file can not be extracted because a
     639  //                                      directory with the same name already exists
     640  //                write_protected : the file can not be extracted because a file
     641  //                                  with the same name already exists and is
     642  //                                  write protected
     643  //                newer_exist : the file was not extracted because a newer file exists
     644  //                path_creation_fail : the file is not extracted because the folder
     645  //                                     does not exist and can not be created
     646  //                write_error : the file was not extracted because there was a
     647  //                              error while writing the file
     648  //                read_error : the file was not extracted because there was a error
     649  //                            while reading the file
     650  //                invalid_header : the file was not extracted because of an archive
     651  //                                format error (bad file header)
    625652  //   Note that each time a method can continue operating when there
    626653  //   is an action error on a file, the error is only logged in the file status.
     
    631658  function listContent()
    632659  {
    633     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', "");
    634     $v_result=1;
    635 
    636     // ----- Reset the error handler
    637     $this->privErrorReset();
    638 
    639     // ----- Check archive
    640     if (!$this->privCheckFormat()) {
    641       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    642       return(0);
    643     }
    644 
    645     // ----- Call the extracting fct
    646     $p_list = array();
    647     if (($v_result = $this->privList($p_list)) != 1)
    648     {
    649       unset($p_list);
    650       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
    651       return(0);
    652     }
    653 
    654     // ----- Return
    655     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
    656     return $p_list;
     660    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', "");
     661    $v_result=1;
     662
     663    // ----- Reset the error handler
     664    $this->privErrorReset();
     665
     666    // ----- Check archive
     667    if (!$this->privCheckFormat()) {
     668      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     669      return(0);
     670    }
     671
     672    // ----- Call the extracting fct
     673    $p_list = array();
     674    if (($v_result = $this->privList($p_list)) != 1)
     675    {
     676      unset($p_list);
     677      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
     678      return(0);
     679    }
     680
     681    // ----- Return
     682    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
     683    return $p_list;
    657684  }
    658685  // --------------------------------------------------------------------------------
     
    677704  //   $p_path : Path where the files and directories are to be extracted
    678705  //   $p_remove_path : First part ('root' part) of the memorized path
    679   //                    (if any similar) to remove while extracting.
     706  //                    (if any similar) to remove while extracting.
    680707  // Options :
    681708  //   PCLZIP_OPT_PATH :
     
    692719  function extract()
    693720  {
    694     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", "");
    695     $v_result=1;
    696 
    697     // ----- Reset the error handler
    698     $this->privErrorReset();
    699 
    700     // ----- Check archive
    701     if (!$this->privCheckFormat()) {
    702       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    703       return(0);
    704     }
    705 
    706     // ----- Set default values
    707     $v_options = array();
    708 //    $v_path = "./";
    709     $v_path = '';
    710     $v_remove_path = "";
    711     $v_remove_all_path = false;
    712 
    713     // ----- Look for variable options arguments
    714     $v_size = func_num_args();
    715     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
    716 
    717     // ----- Default values for option
    718     $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
    719 
    720     // ----- Look for arguments
    721     if ($v_size > 0) {
    722       // ----- Get the arguments
    723       $v_arg_list = func_get_args();
    724 
    725       // ----- Look for first arg
    726       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
    727         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
    728 
    729         // ----- Parse the options
    730         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
    731                                             array (PCLZIP_OPT_PATH => 'optional',
    732                                                    PCLZIP_OPT_REMOVE_PATH => 'optional',
    733                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
    734                                                    PCLZIP_OPT_ADD_PATH => 'optional',
    735                                                    PCLZIP_CB_PRE_EXTRACT => 'optional',
    736                                                    PCLZIP_CB_POST_EXTRACT => 'optional',
    737                                                    PCLZIP_OPT_SET_CHMOD => 'optional',
    738                                                    PCLZIP_OPT_BY_NAME => 'optional',
    739                                                    PCLZIP_OPT_BY_EREG => 'optional',
    740                                                    PCLZIP_OPT_BY_PREG => 'optional',
    741                                                    PCLZIP_OPT_BY_INDEX => 'optional',
    742                                                    PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
    743                                                    PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
    744                                                    PCLZIP_OPT_REPLACE_NEWER => 'optional'
    745                                                    ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
    746                                                    ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
    747                                                     ));
    748         if ($v_result != 1) {
    749           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    750           return 0;
    751         }
    752 
    753         // ----- Set the arguments
    754         if (isset($v_options[PCLZIP_OPT_PATH])) {
    755           $v_path = $v_options[PCLZIP_OPT_PATH];
    756         }
    757         if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
    758           $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
    759         }
    760         if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
    761           $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
    762         }
    763         if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
    764           // ----- Check for '/' in last path char
    765           if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
    766             $v_path .= '/';
    767           }
    768           $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
    769         }
    770       }
    771 
    772       // ----- Look for 2 args
    773       // Here we need to support the first historic synopsis of the
    774       // method.
    775       else {
    776         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
    777 
    778         // ----- Get the first argument
    779         $v_path = $v_arg_list[0];
    780 
    781         // ----- Look for the optional second argument
    782         if ($v_size == 2) {
    783           $v_remove_path = $v_arg_list[1];
    784         }
    785         else if ($v_size > 2) {
    786           // ----- Error log
    787           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
    788 
    789           // ----- Return
    790           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
    791           return 0;
    792         }
    793       }
    794     }
    795 
    796     // ----- Trace
    797     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");
    798 
    799     // ----- Call the extracting fct
    800     $p_list = array();
    801     $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
    802                                         $v_remove_all_path, $v_options);
    803     if ($v_result < 1) {
    804       unset($p_list);
    805       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
    806       return(0);
    807     }
    808 
    809     // ----- Return
    810     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
    811     return $p_list;
     721    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", "");
     722    $v_result=1;
     723
     724    // ----- Reset the error handler
     725    $this->privErrorReset();
     726
     727    // ----- Check archive
     728    if (!$this->privCheckFormat()) {
     729      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     730      return(0);
     731    }
     732
     733    // ----- Set default values
     734    $v_options = array();
     735//  $v_path = "./";
     736    $v_path = '';
     737    $v_remove_path = "";
     738    $v_remove_all_path = false;
     739
     740    // ----- Look for variable options arguments
     741    $v_size = func_num_args();
     742    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
     743
     744    // ----- Default values for option
     745    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
     746
     747    // ----- Look for arguments
     748    if ($v_size > 0) {
     749      // ----- Get the arguments
     750      $v_arg_list = func_get_args();
     751
     752      // ----- Look for first arg
     753      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
     754        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
     755
     756        // ----- Parse the options
     757        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
     758                                            array (PCLZIP_OPT_PATH => 'optional',
     759                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
     760                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
     761                                                   PCLZIP_OPT_ADD_PATH => 'optional',
     762                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
     763                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
     764                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
     765                                                   PCLZIP_OPT_BY_NAME => 'optional',
     766                                                   PCLZIP_OPT_BY_EREG => 'optional',
     767                                                   PCLZIP_OPT_BY_PREG => 'optional',
     768                                                   PCLZIP_OPT_BY_INDEX => 'optional',
     769                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
     770                                                   PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
     771                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
     772                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
     773                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
     774                                                    ));
     775        if ($v_result != 1) {
     776          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     777          return 0;
     778        }
     779
     780        // ----- Set the arguments
     781        if (isset($v_options[PCLZIP_OPT_PATH])) {
     782          $v_path = $v_options[PCLZIP_OPT_PATH];
     783        }
     784        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
     785          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
     786        }
     787        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
     788          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
     789        }
     790        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
     791          // ----- Check for '/' in last path char
     792          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
     793            $v_path .= '/';
     794          }
     795          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
     796        }
     797      }
     798
     799      // ----- Look for 2 args
     800      // Here we need to support the first historic synopsis of the
     801      // method.
     802      else {
     803        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
     804
     805        // ----- Get the first argument
     806        $v_path = $v_arg_list[0];
     807
     808        // ----- Look for the optional second argument
     809        if ($v_size == 2) {
     810          $v_remove_path = $v_arg_list[1];
     811        }
     812        else if ($v_size > 2) {
     813          // ----- Error log
     814          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
     815
     816          // ----- Return
     817          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
     818          return 0;
     819        }
     820      }
     821    }
     822
     823    // ----- Trace
     824    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");
     825
     826    // ----- Call the extracting fct
     827    $p_list = array();
     828    $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
     829                                        $v_remove_all_path, $v_options);
     830    if ($v_result < 1) {
     831      unset($p_list);
     832      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
     833      return(0);
     834    }
     835
     836    // ----- Return
     837    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
     838    return $p_list;
    812839  }
    813840  // --------------------------------------------------------------------------------
     
    827854  // Parameters :
    828855  //   $p_index : A single index (integer) or a string of indexes of files to
    829   //              extract. The form of the string is "0,4-6,8-12" with only numbers
    830   //              and '-' for range or ',' to separate ranges. No spaces or ';'
    831   //              are allowed.
     856  //              extract. The form of the string is "0,4-6,8-12" with only numbers
     857  //              and '-' for range or ',' to separate ranges. No spaces or ';'
     858  //              are allowed.
    832859  //   $p_path : Path where the files and directories are to be extracted
    833860  //   $p_remove_path : First part ('root' part) of the memorized path
    834   //                    (if any similar) to remove while extracting.
     861  //                    (if any similar) to remove while extracting.
    835862  // Options :
    836863  //   PCLZIP_OPT_PATH :
     
    839866  //   PCLZIP_OPT_REMOVE_ALL_PATH :
    840867  //   PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and
    841   //    not as files.
    842   //    The resulting content is in a new field 'content' in the file
    843   //    structure.
    844   //    This option must be used alone (any other options are ignored).
     868  //    not as files.
     869  //    The resulting content is in a new field 'content' in the file
     870  //    structure.
     871  //    This option must be used alone (any other options are ignored).
    845872  //   PCLZIP_CB_PRE_EXTRACT :
    846873  //   PCLZIP_CB_POST_EXTRACT :
     
    853880  function extractByIndex($p_index)
    854881  {
    855     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ...");
    856     $v_result=1;
    857 
    858     // ----- Reset the error handler
    859     $this->privErrorReset();
    860 
    861     // ----- Check archive
    862     if (!$this->privCheckFormat()) {
    863       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    864       return(0);
    865     }
    866 
    867     // ----- Set default values
    868     $v_options = array();
    869 //    $v_path = "./";
    870     $v_path = '';
    871     $v_remove_path = "";
    872     $v_remove_all_path = false;
    873 
    874     // ----- Look for variable options arguments
    875     $v_size = func_num_args();
    876     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
    877 
    878     // ----- Default values for option
    879     $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
    880 
    881     // ----- Look for arguments
    882     if ($v_size > 1) {
    883       // ----- Get the arguments
    884       $v_arg_list = func_get_args();
    885 
    886       // ----- Remove form the options list the first argument
    887       array_shift($v_arg_list);
    888       $v_size--;
    889 
    890       // ----- Look for first arg
    891       if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
    892         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
    893 
    894         // ----- Parse the options
    895         $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
    896                                             array (PCLZIP_OPT_PATH => 'optional',
    897                                                    PCLZIP_OPT_REMOVE_PATH => 'optional',
    898                                                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
    899                                                    PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
    900                                                    PCLZIP_OPT_ADD_PATH => 'optional',
    901                                                    PCLZIP_CB_PRE_EXTRACT => 'optional',
    902                                                    PCLZIP_CB_POST_EXTRACT => 'optional',
    903                                                    PCLZIP_OPT_SET_CHMOD => 'optional',
    904                                                    PCLZIP_OPT_REPLACE_NEWER => 'optional'
    905                                                    ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
    906                                                    ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
     882    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ...");
     883    $v_result=1;
     884
     885    // ----- Reset the error handler
     886    $this->privErrorReset();
     887
     888    // ----- Check archive
     889    if (!$this->privCheckFormat()) {
     890      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     891      return(0);
     892    }
     893
     894    // ----- Set default values
     895    $v_options = array();
     896//  $v_path = "./";
     897    $v_path = '';
     898    $v_remove_path = "";
     899    $v_remove_all_path = false;
     900
     901    // ----- Look for variable options arguments
     902    $v_size = func_num_args();
     903    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
     904
     905    // ----- Default values for option
     906    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
     907
     908    // ----- Look for arguments
     909    if ($v_size > 1) {
     910      // ----- Get the arguments
     911      $v_arg_list = func_get_args();
     912
     913      // ----- Remove form the options list the first argument
     914      array_shift($v_arg_list);
     915      $v_size--;
     916
     917      // ----- Look for first arg
     918      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
     919        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
     920
     921        // ----- Parse the options
     922        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
     923                                            array (PCLZIP_OPT_PATH => 'optional',
     924                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
     925                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
     926                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
     927                                                   PCLZIP_OPT_ADD_PATH => 'optional',
     928                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
     929                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
     930                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
     931                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
     932                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
     933                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
    907934                                                   ));
    908         if ($v_result != 1) {
    909           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    910           return 0;
    911         }
    912 
    913         // ----- Set the arguments
    914         if (isset($v_options[PCLZIP_OPT_PATH])) {
    915           $v_path = $v_options[PCLZIP_OPT_PATH];
    916         }
    917         if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
    918           $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
    919         }
    920         if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
    921           $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
    922         }
    923         if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
    924           // ----- Check for '/' in last path char
    925           if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
    926             $v_path .= '/';
    927           }
    928           $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
    929         }
    930         if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
    931           $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
    932           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set.");
    933         }
    934         else {
    935             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set.");
    936         }
    937       }
    938 
    939       // ----- Look for 2 args
    940       // Here we need to support the first historic synopsis of the
    941       // method.
    942       else {
    943         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
    944 
    945         // ----- Get the first argument
    946         $v_path = $v_arg_list[0];
    947 
    948         // ----- Look for the optional second argument
    949         if ($v_size == 2) {
    950           $v_remove_path = $v_arg_list[1];
    951         }
    952         else if ($v_size > 2) {
    953           // ----- Error log
    954           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
    955 
    956           // ----- Return
    957           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    958           return 0;
    959         }
    960       }
    961     }
    962 
    963     // ----- Trace
    964     //--(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')."'");
    965 
    966     // ----- Trick
    967     // Here I want to reuse extractByRule(), so I need to parse the $p_index
    968     // with privParseOptions()
    969     $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
    970     $v_options_trick = array();
    971     $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
    972                                         array (PCLZIP_OPT_BY_INDEX => 'optional' ));
    973     if ($v_result != 1) {
    974         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    975         return 0;
    976     }
    977     $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];
    978 
    979     // ----- Call the extracting fct
    980     if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
    981         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
    982         return(0);
    983     }
    984 
    985     // ----- Return
    986     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
    987     return $p_list;
     935        if ($v_result != 1) {
     936          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     937          return 0;
     938        }
     939
     940        // ----- Set the arguments
     941        if (isset($v_options[PCLZIP_OPT_PATH])) {
     942          $v_path = $v_options[PCLZIP_OPT_PATH];
     943        }
     944        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
     945          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
     946        }
     947        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
     948          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
     949        }
     950        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
     951          // ----- Check for '/' in last path char
     952          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
     953            $v_path .= '/';
     954          }
     955          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
     956        }
     957        if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
     958          $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
     959          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set.");
     960        }
     961        else {
     962            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set.");
     963        }
     964      }
     965
     966      // ----- Look for 2 args
     967      // Here we need to support the first historic synopsis of the
     968      // method.
     969      else {
     970        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
     971
     972        // ----- Get the first argument
     973        $v_path = $v_arg_list[0];
     974
     975        // ----- Look for the optional second argument
     976        if ($v_size == 2) {
     977          $v_remove_path = $v_arg_list[1];
     978        }
     979        else if ($v_size > 2) {
     980          // ----- Error log
     981          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
     982
     983          // ----- Return
     984          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     985          return 0;
     986        }
     987      }
     988    }
     989
     990    // ----- Trace
     991    //--(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')."'");
     992
     993    // ----- Trick
     994    // Here I want to reuse extractByRule(), so I need to parse the $p_index
     995    // with privParseOptions()
     996    $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
     997    $v_options_trick = array();
     998    $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
     999                                        array (PCLZIP_OPT_BY_INDEX => 'optional' ));
     1000    if ($v_result != 1) {
     1001        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     1002        return 0;
     1003    }
     1004    $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];
     1005
     1006    // ----- Call the extracting fct
     1007    if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
     1008        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
     1009        return(0);
     1010    }
     1011
     1012    // ----- Return
     1013    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
     1014    return $p_list;
    9881015  }
    9891016  // --------------------------------------------------------------------------------
     
    10001027  //   PCLZIP_OPT_BY_INDEX :
    10011028  //   PCLZIP_OPT_BY_NAME :
    1002   //   PCLZIP_OPT_BY_EREG :
     1029  //   PCLZIP_OPT_BY_EREG : 
    10031030  //   PCLZIP_OPT_BY_PREG :
    10041031  // Return Values :
     
    10091036  function delete()
    10101037  {
    1011     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", "");
    1012     $v_result=1;
    1013 
    1014     // ----- Reset the error handler
    1015     $this->privErrorReset();
    1016 
    1017     // ----- Check archive
    1018     if (!$this->privCheckFormat()) {
    1019       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    1020       return(0);
    1021     }
    1022 
    1023     // ----- Set default values
    1024     $v_options = array();
    1025 
    1026     // ----- Look for variable options arguments
    1027     $v_size = func_num_args();
    1028     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
    1029 
    1030     // ----- Look for arguments
    1031     if ($v_size > 0) {
    1032       // ----- Get the arguments
    1033       $v_arg_list = func_get_args();
    1034 
    1035       // ----- Parse the options
    1036       $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
    1037                                         array (PCLZIP_OPT_BY_NAME => 'optional',
    1038                                                PCLZIP_OPT_BY_EREG => 'optional',
    1039                                                PCLZIP_OPT_BY_PREG => 'optional',
    1040                                                PCLZIP_OPT_BY_INDEX => 'optional' ));
    1041       if ($v_result != 1) {
    1042           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    1043           return 0;
    1044       }
    1045     }
    1046 
    1047     // ----- Magic quotes trick
    1048     $this->privDisableMagicQuotes();
    1049 
    1050     // ----- Call the delete fct
    1051     $v_list = array();
    1052     if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
    1053       $this->privSwapBackMagicQuotes();
    1054       unset($v_list);
    1055       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
    1056       return(0);
    1057     }
    1058 
    1059     // ----- Magic quotes trick
    1060     $this->privSwapBackMagicQuotes();
    1061 
    1062     // ----- Return
    1063     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_list);
    1064     return $v_list;
     1038    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", "");
     1039    $v_result=1;
     1040
     1041    // ----- Reset the error handler
     1042    $this->privErrorReset();
     1043
     1044    // ----- Check archive
     1045    if (!$this->privCheckFormat()) {
     1046      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     1047      return(0);
     1048    }
     1049
     1050    // ----- Set default values
     1051    $v_options = array();
     1052
     1053    // ----- Look for variable options arguments
     1054    $v_size = func_num_args();
     1055    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
     1056
     1057    // ----- Look for arguments
     1058    if ($v_size > 0) {
     1059      // ----- Get the arguments
     1060      $v_arg_list = func_get_args();
     1061
     1062      // ----- Parse the options
     1063      $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
     1064                                        array (PCLZIP_OPT_BY_NAME => 'optional',
     1065                                               PCLZIP_OPT_BY_EREG => 'optional',
     1066                                               PCLZIP_OPT_BY_PREG => 'optional',
     1067                                               PCLZIP_OPT_BY_INDEX => 'optional' ));
     1068      if ($v_result != 1) {
     1069          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     1070          return 0;
     1071      }
     1072    }
     1073
     1074    // ----- Magic quotes trick
     1075    $this->privDisableMagicQuotes();
     1076
     1077    // ----- Call the delete fct
     1078    $v_list = array();
     1079    if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
     1080      $this->privSwapBackMagicQuotes();
     1081      unset($v_list);
     1082      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
     1083      return(0);
     1084    }
     1085
     1086    // ----- Magic quotes trick
     1087    $this->privSwapBackMagicQuotes();
     1088
     1089    // ----- Return
     1090    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_list);
     1091    return $v_list;
    10651092  }
    10661093  // --------------------------------------------------------------------------------
     
    10741101  function deleteByIndex($p_index)
    10751102  {
    1076     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'");
    1077 
    1078     $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
    1079 
    1080     // ----- Return
    1081     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
    1082     return $p_list;
     1103    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'");
     1104   
     1105    $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
     1106
     1107    // ----- Return
     1108    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
     1109    return $p_list;
    10831110  }
    10841111  // --------------------------------------------------------------------------------
     
    10891116  //   This method gives the properties of the archive.
    10901117  //   The properties are :
    1091   //    nb : Number of files in the archive
    1092   //    comment : Comment associated with the archive file
    1093   //    status : not_exist, ok
     1118  //    nb : Number of files in the archive
     1119  //    comment : Comment associated with the archive file
     1120  //    status : not_exist, ok
    10941121  // Parameters :
    10951122  //   None
     
    11001127  function properties()
    11011128  {
    1102     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", "");
    1103 
    1104     // ----- Reset the error handler
    1105     $this->privErrorReset();
    1106 
    1107     // ----- Magic quotes trick
    1108     $this->privDisableMagicQuotes();
    1109 
    1110     // ----- Check archive
    1111     if (!$this->privCheckFormat()) {
    1112       $this->privSwapBackMagicQuotes();
    1113       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    1114       return(0);
    1115     }
    1116 
    1117     // ----- Default properties
    1118     $v_prop = array();
    1119     $v_prop['comment'] = '';
    1120     $v_prop['nb'] = 0;
    1121     $v_prop['status'] = 'not_exist';
    1122 
    1123     // ----- Look if file exists
    1124     if (@is_file($this->zipname))
    1125     {
    1126       // ----- Open the zip file
    1127       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    1128       if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
    1129       {
    1130         $this->privSwapBackMagicQuotes();
    1131 
    1132         // ----- Error log
    1133         PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
    1134 
    1135         // ----- Return
    1136         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0);
    1137         return 0;
    1138       }
    1139 
    1140       // ----- Read the central directory informations
    1141       $v_central_dir = array();
    1142       if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    1143       {
    1144         $this->privSwapBackMagicQuotes();
    1145         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    1146         return 0;
    1147       }
    1148 
    1149       // ----- Close the zip file
    1150       $this->privCloseFd();
    1151 
    1152       // ----- Set the user attributes
    1153       $v_prop['comment'] = $v_central_dir['comment'];
    1154       $v_prop['nb'] = $v_central_dir['entries'];
    1155       $v_prop['status'] = 'ok';
    1156     }
    1157 
    1158     // ----- Magic quotes trick
    1159     $this->privSwapBackMagicQuotes();
    1160 
    1161     // ----- Return
    1162     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_prop);
    1163     return $v_prop;
     1129    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", "");
     1130
     1131    // ----- Reset the error handler
     1132    $this->privErrorReset();
     1133
     1134    // ----- Magic quotes trick
     1135    $this->privDisableMagicQuotes();
     1136
     1137    // ----- Check archive
     1138    if (!$this->privCheckFormat()) {
     1139      $this->privSwapBackMagicQuotes();
     1140      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     1141      return(0);
     1142    }
     1143
     1144    // ----- Default properties
     1145    $v_prop = array();
     1146    $v_prop['comment'] = '';
     1147    $v_prop['nb'] = 0;
     1148    $v_prop['status'] = 'not_exist';
     1149
     1150    // ----- Look if file exists
     1151    if (@is_file($this->zipname))
     1152    {
     1153      // ----- Open the zip file
     1154      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     1155      if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
     1156      {
     1157        $this->privSwapBackMagicQuotes();
     1158       
     1159        // ----- Error log
     1160        PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
     1161
     1162        // ----- Return
     1163        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0);
     1164        return 0;
     1165      }
     1166
     1167      // ----- Read the central directory informations
     1168      $v_central_dir = array();
     1169      if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
     1170      {
     1171        $this->privSwapBackMagicQuotes();
     1172        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     1173        return 0;
     1174      }
     1175
     1176      // ----- Close the zip file
     1177      $this->privCloseFd();
     1178
     1179      // ----- Set the user attributes
     1180      $v_prop['comment'] = $v_central_dir['comment'];
     1181      $v_prop['nb'] = $v_central_dir['entries'];
     1182      $v_prop['status'] = 'ok';
     1183    }
     1184
     1185    // ----- Magic quotes trick
     1186    $this->privSwapBackMagicQuotes();
     1187
     1188    // ----- Return
     1189    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_prop);
     1190    return $v_prop;
    11641191  }
    11651192  // --------------------------------------------------------------------------------
     
    11721199  // Parameters :
    11731200  //   $p_archive : The filename of a valid archive, or
    1174   //                a valid PclZip object.
     1201  //                a valid PclZip object.
    11751202  // Return Values :
    11761203  //   1 on success.
     
    11791206  function duplicate($p_archive)
    11801207  {
    1181     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", "");
    1182     $v_result = 1;
    1183 
    1184     // ----- Reset the error handler
    1185     $this->privErrorReset();
    1186 
    1187     // ----- Look if the $p_archive is a PclZip object
    1188     if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))
    1189     {
    1190       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'");
    1191 
    1192       // ----- Duplicate the archive
    1193       $v_result = $this->privDuplicate($p_archive->zipname);
    1194     }
    1195 
    1196     // ----- Look if the $p_archive is a string (so a filename)
    1197     else if (is_string($p_archive))
    1198     {
    1199       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'");
    1200 
    1201       // ----- Check that $p_archive is a valid zip file
    1202       // TBC : Should also check the archive format
    1203       if (!is_file($p_archive)) {
    1204         // ----- Error log
    1205         PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
    1206         $v_result = PCLZIP_ERR_MISSING_FILE;
    1207       }
    1208       else {
    1209         // ----- Duplicate the archive
    1210         $v_result = $this->privDuplicate($p_archive);
    1211       }
    1212     }
    1213 
    1214     // ----- Invalid variable
    1215     else
    1216     {
    1217       // ----- Error log
    1218       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
    1219       $v_result = PCLZIP_ERR_INVALID_PARAMETER;
    1220     }
    1221 
    1222     // ----- Return
    1223     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    1224     return $v_result;
     1208    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", "");
     1209    $v_result = 1;
     1210
     1211    // ----- Reset the error handler
     1212    $this->privErrorReset();
     1213
     1214    // ----- Look if the $p_archive is a PclZip object
     1215    if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))
     1216    {
     1217      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'");
     1218
     1219      // ----- Duplicate the archive
     1220      $v_result = $this->privDuplicate($p_archive->zipname);
     1221    }
     1222
     1223    // ----- Look if the $p_archive is a string (so a filename)
     1224    else if (is_string($p_archive))
     1225    {
     1226      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'");
     1227
     1228      // ----- Check that $p_archive is a valid zip file
     1229      // TBC : Should also check the archive format
     1230      if (!is_file($p_archive)) {
     1231        // ----- Error log
     1232        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
     1233        $v_result = PCLZIP_ERR_MISSING_FILE;
     1234      }
     1235      else {
     1236        // ----- Duplicate the archive
     1237        $v_result = $this->privDuplicate($p_archive);
     1238      }
     1239    }
     1240
     1241    // ----- Invalid variable
     1242    else
     1243    {
     1244      // ----- Error log
     1245      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
     1246      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
     1247    }
     1248
     1249    // ----- Return
     1250    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     1251    return $v_result;
    12251252  }
    12261253  // --------------------------------------------------------------------------------
     
    12351262  // Parameters :
    12361263  //   $p_archive_to_add : It can be directly the filename of a valid zip archive,
    1237   //                       or a PclZip object archive.
     1264  //                       or a PclZip object archive.
    12381265  // Return Values :
    12391266  //   1 on success,
     
    12421269  function merge($p_archive_to_add)
    12431270  {
    1244     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", "");
    1245     $v_result = 1;
    1246 
    1247     // ----- Reset the error handler
    1248     $this->privErrorReset();
    1249 
    1250     // ----- Check archive
    1251     if (!$this->privCheckFormat()) {
    1252       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
    1253       return(0);
    1254     }
    1255 
    1256     // ----- Look if the $p_archive_to_add is a PclZip object
    1257     if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))
    1258     {
    1259       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object");
    1260 
    1261       // ----- Merge the archive
    1262       $v_result = $this->privMerge($p_archive_to_add);
    1263     }
    1264 
    1265     // ----- Look if the $p_archive_to_add is a string (so a filename)
    1266     else if (is_string($p_archive_to_add))
    1267     {
    1268       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename");
    1269 
    1270       // ----- Create a temporary archive
    1271       $v_object_archive = new PclZip($p_archive_to_add);
    1272 
    1273       // ----- Merge the archive
    1274       $v_result = $this->privMerge($v_object_archive);
    1275     }
    1276 
    1277     // ----- Invalid variable
    1278     else
    1279     {
    1280       // ----- Error log
    1281       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
    1282       $v_result = PCLZIP_ERR_INVALID_PARAMETER;
    1283     }
    1284 
    1285     // ----- Return
    1286     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    1287     return $v_result;
     1271    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", "");
     1272    $v_result = 1;
     1273
     1274    // ----- Reset the error handler
     1275    $this->privErrorReset();
     1276
     1277    // ----- Check archive
     1278    if (!$this->privCheckFormat()) {
     1279      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
     1280      return(0);
     1281    }
     1282
     1283    // ----- Look if the $p_archive_to_add is a PclZip object
     1284    if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))
     1285    {
     1286      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object");
     1287
     1288      // ----- Merge the archive
     1289      $v_result = $this->privMerge($p_archive_to_add);
     1290    }
     1291
     1292    // ----- Look if the $p_archive_to_add is a string (so a filename)
     1293    else if (is_string($p_archive_to_add))
     1294    {
     1295      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename");
     1296
     1297      // ----- Create a temporary archive
     1298      $v_object_archive = new PclZip($p_archive_to_add);
     1299
     1300      // ----- Merge the archive
     1301      $v_result = $this->privMerge($v_object_archive);
     1302    }
     1303
     1304    // ----- Invalid variable
     1305    else
     1306    {
     1307      // ----- Error log
     1308      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
     1309      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
     1310    }
     1311
     1312    // ----- Return
     1313    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     1314    return $v_result;
    12881315  }
    12891316  // --------------------------------------------------------------------------------
     
    12981325  function errorCode()
    12991326  {
    1300     if (PCLZIP_ERROR_EXTERNAL == 1) {
    1301       return(PclErrorCode());
    1302     }
    1303     else {
    1304       return($this->error_code);
    1305     }
     1327    if (PCLZIP_ERROR_EXTERNAL == 1) {
     1328      return(PclErrorCode());
     1329    }
     1330    else {
     1331      return($this->error_code);
     1332    }
    13061333  }
    13071334  // --------------------------------------------------------------------------------
     
    13141341  function errorName($p_with_code=false)
    13151342  {
    1316     $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
    1317                       PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
    1318                       PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
    1319                       PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
    1320                       PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
    1321                       PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
    1322                       PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
    1323                       PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
    1324                       PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
    1325                       PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
    1326                       PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
    1327                       PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
    1328                       PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
    1329                       PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
    1330                       PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
    1331                       PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
    1332                       PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
    1333                       PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
    1334                       PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'
    1335                       ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'
    1336                       ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
    1337                     );
    1338 
    1339     if (isset($v_name[$this->error_code])) {
    1340       $v_value = $v_name[$this->error_code];
    1341     }
    1342     else {
    1343       $v_value = 'NoName';
    1344     }
    1345 
    1346     if ($p_with_code) {
    1347       return($v_value.' ('.$this->error_code.')');
    1348     }
    1349     else {
    1350       return($v_value);
    1351     }
     1343    $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
     1344                      PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
     1345                      PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
     1346                      PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
     1347                      PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
     1348                      PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
     1349                      PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
     1350                      PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
     1351                      PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
     1352                      PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
     1353                      PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
     1354                      PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
     1355                      PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
     1356                      PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
     1357                      PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
     1358                      PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
     1359                      PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
     1360                      PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
     1361                      PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION',
     1362                      PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE',
     1363                      PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
     1364                    );
     1365
     1366    if (isset($v_name[$this->error_code])) {
     1367      $v_value = $v_name[$this->error_code];
     1368    }
     1369    else {
     1370      $v_value = 'NoName';
     1371    }
     1372
     1373    if ($p_with_code) {
     1374      return($v_value.' ('.$this->error_code.')');
     1375    }
     1376    else {
     1377      return($v_value);
     1378    }
    13521379  }
    13531380  // --------------------------------------------------------------------------------
     
    13601387  function errorInfo($p_full=false)
    13611388  {
    1362     if (PCLZIP_ERROR_EXTERNAL == 1) {
    1363       return(PclErrorString());
    1364     }
    1365     else {
    1366       if ($p_full) {
    1367         return($this->errorName(true)." : ".$this->error_string);
    1368       }
    1369       else {
    1370         return($this->error_string." [code ".$this->error_code."]");
    1371       }
    1372     }
     1389    if (PCLZIP_ERROR_EXTERNAL == 1) {
     1390      return(PclErrorString());
     1391    }
     1392    else {
     1393      if ($p_full) {
     1394        return($this->errorName(true)." : ".$this->error_string);
     1395      }
     1396      else {
     1397        return($this->error_string." [code ".$this->error_code."]");
     1398      }
     1399    }
    13731400  }
    13741401  // --------------------------------------------------------------------------------
     
    13771404// --------------------------------------------------------------------------------
    13781405// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****
    1379 // *****                                                        *****
    1380 // *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****
     1406// *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY      *****
    13811407// --------------------------------------------------------------------------------
    13821408
     
    13901416  // Parameters :
    13911417  //   $p_level : Level of check. Default 0.
    1392   //              0 : Check the first bytes (magic codes) (default value))
    1393   //              1 : 0 + Check the central directory (futur)
    1394   //              2 : 1 + Check each file header (futur)
     1418  //              0 : Check the first bytes (magic codes) (default value))
     1419  //              1 : 0 + Check the central directory (futur)
     1420  //              2 : 1 + Check each file header (futur)
    13951421  // Return Values :
    13961422  //   true on success,
     
    13991425  function privCheckFormat($p_level=0)
    14001426  {
    1401     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", "");
    1402     $v_result = true;
     1427    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", "");
     1428    $v_result = true;
    14031429
    14041430    // ----- Reset the file system cache
    1405     clearstatcache();
    1406 
    1407     // ----- Reset the error handler
    1408     $this->privErrorReset();
    1409 
    1410     // ----- Look if the file exits
    1411     if (!is_file($this->zipname)) {
    1412       // ----- Error log
    1413       PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
    1414       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
    1415       return(false);
    1416     }
    1417 
    1418     // ----- Check that the file is readeable
    1419     if (!is_readable($this->zipname)) {
    1420       // ----- Error log
    1421       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
    1422       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
    1423       return(false);
    1424     }
    1425 
    1426     // ----- Check the magic code
    1427     // TBC
    1428 
    1429     // ----- Check the central header
    1430     // TBC
    1431 
    1432     // ----- Check each file header
    1433     // TBC
    1434 
    1435     // ----- Return
    1436     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    1437     return $v_result;
     1431    clearstatcache();
     1432
     1433    // ----- Reset the error handler
     1434    $this->privErrorReset();
     1435
     1436    // ----- Look if the file exits
     1437    if (!is_file($this->zipname)) {
     1438      // ----- Error log
     1439      PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
     1440      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
     1441      return(false);
     1442    }
     1443
     1444    // ----- Check that the file is readeable
     1445    if (!is_readable($this->zipname)) {
     1446      // ----- Error log
     1447      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
     1448      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
     1449      return(false);
     1450    }
     1451
     1452    // ----- Check the magic code
     1453    // TBC
     1454
     1455    // ----- Check the central header
     1456    // TBC
     1457
     1458    // ----- Check each file header
     1459    // TBC
     1460
     1461    // ----- Return
     1462    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     1463    return $v_result;
    14381464  }
    14391465  // --------------------------------------------------------------------------------
     
    14561482  function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
    14571483  {
    1458     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", "");
    1459     $v_result=1;
    1460 
    1461     // ----- Read the options
    1462     $i=0;
    1463     while ($i<$p_size) {
    1464       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'");
    1465 
    1466       // ----- Check if the option is supported
    1467       if (!isset($v_requested_options[$p_options_list[$i]])) {
    1468         // ----- Error log
    1469         PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");
    1470 
    1471         // ----- Return
    1472         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1473         return PclZip::errorCode();
    1474       }
    1475 
    1476       // ----- Look for next option
    1477       switch ($p_options_list[$i]) {
    1478         // ----- Look for options that request a path value
    1479         case PCLZIP_OPT_PATH :
    1480         case PCLZIP_OPT_REMOVE_PATH :
    1481         case PCLZIP_OPT_ADD_PATH :
    1482           // ----- Check the number of parameters
    1483           if (($i+1) >= $p_size) {
    1484             // ----- Error log
    1485             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1486 
    1487             // ----- Return
    1488             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1489             return PclZip::errorCode();
    1490           }
    1491 
    1492           // ----- Get the value
    1493           $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);
    1494           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
    1495           $i++;
    1496         break;
    1497 
    1498         case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
    1499           // ----- Check the number of parameters
    1500           if (($i+1) >= $p_size) {
    1501             // ----- Error log
    1502             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1503 
    1504             // ----- Return
    1505             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1506             return PclZip::errorCode();
    1507           }
    1508 
    1509           // ----- Get the value
    1510           if (   is_string($p_options_list[$i+1])
    1511               && ($p_options_list[$i+1] != '')) {
    1512             $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);
    1513             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
    1514             $i++;
    1515           }
    1516           else {
    1517             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored.");
    1518           }
    1519         break;
    1520 
    1521         // ----- Look for options that request an array of string for value
    1522         case PCLZIP_OPT_BY_NAME :
    1523           // ----- Check the number of parameters
    1524           if (($i+1) >= $p_size) {
    1525             // ----- Error log
    1526             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1527 
    1528             // ----- Return
    1529             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1530             return PclZip::errorCode();
    1531           }
    1532 
    1533           // ----- Get the value
    1534           if (is_string($p_options_list[$i+1])) {
    1535               $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
    1536           }
    1537           else if (is_array($p_options_list[$i+1])) {
    1538               $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
    1539           }
    1540           else {
    1541             // ----- Error log
    1542             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1543 
    1544             // ----- Return
    1545             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1546             return PclZip::errorCode();
    1547           }
    1548           ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
    1549           $i++;
    1550         break;
    1551 
    1552         // ----- Look for options that request an EREG or PREG expression
    1553         case PCLZIP_OPT_BY_EREG :
    1554         case PCLZIP_OPT_BY_PREG :
    1555         //case PCLZIP_OPT_CRYPT :
    1556           // ----- Check the number of parameters
    1557           if (($i+1) >= $p_size) {
    1558             // ----- Error log
    1559             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1560 
    1561             // ----- Return
    1562             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1563             return PclZip::errorCode();
    1564           }
    1565 
    1566           // ----- Get the value
    1567           if (is_string($p_options_list[$i+1])) {
    1568               $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
    1569           }
    1570           else {
    1571             // ----- Error log
    1572             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1573 
    1574             // ----- Return
    1575             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1576             return PclZip::errorCode();
    1577           }
    1578           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
    1579           $i++;
    1580         break;
    1581 
    1582         // ----- Look for options that takes a string
    1583         case PCLZIP_OPT_COMMENT :
    1584         case PCLZIP_OPT_ADD_COMMENT :
    1585         case PCLZIP_OPT_PREPEND_COMMENT :
    1586           // ----- Check the number of parameters
    1587           if (($i+1) >= $p_size) {
    1588             // ----- Error log
    1589             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
    1590                                  "Missing parameter value for option '"
     1484    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", "");
     1485    $v_result=1;
     1486   
     1487    // ----- Read the options
     1488    $i=0;
     1489    while ($i<$p_size) {
     1490      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'");
     1491
     1492      // ----- Check if the option is supported
     1493      if (!isset($v_requested_options[$p_options_list[$i]])) {
     1494        // ----- Error log
     1495        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");
     1496
     1497        // ----- Return
     1498        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1499        return PclZip::errorCode();
     1500      }
     1501
     1502      // ----- Look for next option
     1503      switch ($p_options_list[$i]) {
     1504        // ----- Look for options that request a path value
     1505        case PCLZIP_OPT_PATH :
     1506        case PCLZIP_OPT_REMOVE_PATH :
     1507        case PCLZIP_OPT_ADD_PATH :
     1508          // ----- Check the number of parameters
     1509          if (($i+1) >= $p_size) {
     1510            // ----- Error log
     1511            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1512
     1513            // ----- Return
     1514            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1515            return PclZip::errorCode();
     1516          }
     1517
     1518          // ----- Get the value
     1519          $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
     1520          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1521          $i++;
     1522        break;
     1523
     1524        case PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD :
     1525          // ----- Check the number of parameters
     1526          if (($i+1) >= $p_size) {
     1527            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1528            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1529            return PclZip::errorCode();
     1530          }
     1531         
     1532          // ----- Check for incompatible options
     1533          if (isset($v_result_list[PCLZIP_OPT_ADD_TEMP_FILE_OFF])) {
     1534            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_ADD_TEMP_FILE_OFF'");
     1535            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1536            return PclZip::errorCode();
     1537          }
     1538         
     1539          // ----- Check the value
     1540          $v_value = $p_options_list[$i+1];
     1541          if ((!is_integer($v_value)) || ($v_value<0)) {
     1542            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1543            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1544            return PclZip::errorCode();
     1545          }
     1546
     1547          // ----- Get the value (and convert it in bytes)
     1548          $v_result_list[$p_options_list[$i]] = $v_value*1048576;
     1549          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1550          $i++;
     1551        break;
     1552
     1553        case PCLZIP_OPT_ADD_TEMP_FILE_ON :
     1554          // ----- Check for incompatible options
     1555          if (isset($v_result_list[PCLZIP_OPT_ADD_TEMP_FILE_OFF])) {
     1556            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_ADD_TEMP_FILE_OFF'");
     1557            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1558            return PclZip::errorCode();
     1559          }
     1560         
     1561          $v_result_list[$p_options_list[$i]] = true;
     1562          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1563        break;
     1564
     1565        case PCLZIP_OPT_ADD_TEMP_FILE_OFF :
     1566          // ----- Check for incompatible options
     1567          if (isset($v_result_list[PCLZIP_OPT_ADD_TEMP_FILE_ON])) {
     1568            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_ADD_TEMP_FILE_ON'");
     1569            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1570            return PclZip::errorCode();
     1571          }
     1572          // ----- Check for incompatible options
     1573          if (isset($v_result_list[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD])) {
     1574            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD'");
     1575            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1576            return PclZip::errorCode();
     1577          }
     1578         
     1579          $v_result_list[$p_options_list[$i]] = true;
     1580          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1581        break;
     1582
     1583        case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
     1584          // ----- Check the number of parameters
     1585          if (($i+1) >= $p_size) {
     1586            // ----- Error log
     1587            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1588
     1589            // ----- Return
     1590            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1591            return PclZip::errorCode();
     1592          }
     1593
     1594          // ----- Get the value
     1595          if (   is_string($p_options_list[$i+1])
     1596              && ($p_options_list[$i+1] != '')) {
     1597            $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
     1598            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1599            $i++;
     1600          }
     1601          else {
     1602            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored.");
     1603          }
     1604        break;
     1605
     1606        // ----- Look for options that request an array of string for value
     1607        case PCLZIP_OPT_BY_NAME :
     1608          // ----- Check the number of parameters
     1609          if (($i+1) >= $p_size) {
     1610            // ----- Error log
     1611            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1612
     1613            // ----- Return
     1614            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1615            return PclZip::errorCode();
     1616          }
     1617
     1618          // ----- Get the value
     1619          if (is_string($p_options_list[$i+1])) {
     1620              $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
     1621          }
     1622          else if (is_array($p_options_list[$i+1])) {
     1623              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
     1624          }
     1625          else {
     1626            // ----- Error log
     1627            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1628
     1629            // ----- Return
     1630            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1631            return PclZip::errorCode();
     1632          }
     1633          ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1634          $i++;
     1635        break;
     1636
     1637        // ----- Look for options that request an EREG or PREG expression
     1638        case PCLZIP_OPT_BY_EREG :
     1639        case PCLZIP_OPT_BY_PREG :
     1640        //case PCLZIP_OPT_CRYPT :
     1641          // ----- Check the number of parameters
     1642          if (($i+1) >= $p_size) {
     1643            // ----- Error log
     1644            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1645
     1646            // ----- Return
     1647            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1648            return PclZip::errorCode();
     1649          }
     1650
     1651          // ----- Get the value
     1652          if (is_string($p_options_list[$i+1])) {
     1653              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
     1654          }
     1655          else {
     1656            // ----- Error log
     1657            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1658
     1659            // ----- Return
     1660            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1661            return PclZip::errorCode();
     1662          }
     1663          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1664          $i++;
     1665        break;
     1666
     1667        // ----- Look for options that takes a string
     1668        case PCLZIP_OPT_COMMENT :
     1669        case PCLZIP_OPT_ADD_COMMENT :
     1670        case PCLZIP_OPT_PREPEND_COMMENT :
     1671          // ----- Check the number of parameters
     1672          if (($i+1) >= $p_size) {
     1673            // ----- Error log
     1674            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
     1675                                 "Missing parameter value for option '"
    15911676                                 .PclZipUtilOptionText($p_options_list[$i])
    15921677                                 ."'");
    15931678
    1594             // ----- Return
    1595             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1596             return PclZip::errorCode();
    1597           }
    1598 
    1599           // ----- Get the value
    1600           if (is_string($p_options_list[$i+1])) {
    1601               $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
    1602           }
    1603           else {
    1604             // ----- Error log
    1605             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
    1606                                 "Wrong parameter value for option '"
     1679            // ----- Return
     1680            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1681            return PclZip::errorCode();
     1682          }
     1683
     1684          // ----- Get the value
     1685          if (is_string($p_options_list[$i+1])) {
     1686              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
     1687          }
     1688          else {
     1689            // ----- Error log
     1690            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
     1691                                "Wrong parameter value for option '"
    16071692                                 .PclZipUtilOptionText($p_options_list[$i])
    16081693                                 ."'");
    16091694
    1610             // ----- Return
    1611             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1612             return PclZip::errorCode();
    1613           }
    1614           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
    1615           $i++;
    1616         break;
    1617 
    1618         // ----- Look for options that request an array of index
    1619         case PCLZIP_OPT_BY_INDEX :
    1620           // ----- Check the number of parameters
    1621           if (($i+1) >= $p_size) {
    1622             // ----- Error log
    1623             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1624 
    1625             // ----- Return
    1626             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1627             return PclZip::errorCode();
    1628           }
    1629 
    1630           // ----- Get the value
    1631           $v_work_list = array();
    1632           if (is_string($p_options_list[$i+1])) {
    1633               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'");
    1634 
    1635               // ----- Remove spaces
    1636               $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');
    1637 
    1638               // ----- Parse items
    1639               $v_work_list = explode(",", $p_options_list[$i+1]);
    1640           }
    1641           else if (is_integer($p_options_list[$i+1])) {
    1642               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'");
    1643               $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
    1644           }
    1645           else if (is_array($p_options_list[$i+1])) {
    1646               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array");
    1647               $v_work_list = $p_options_list[$i+1];
    1648           }
    1649           else {
    1650             // ----- Error log
    1651             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1652 
    1653             // ----- Return
    1654             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1655             return PclZip::errorCode();
    1656           }
    1657 
    1658           // ----- Reduce the index list
    1659           // each index item in the list must be a couple with a start and
    1660           // an end value : [0,3], [5-5], [8-10], ...
    1661           // ----- Check the format of each item
    1662           $v_sort_flag=false;
    1663           $v_sort_value=0;
    1664           for ($j=0; $j<sizeof($v_work_list); $j++) {
    1665               // ----- Explode the item
    1666               $v_item_list = explode("-", $v_work_list[$j]);
    1667               $v_size_item_list = sizeof($v_item_list);
    1668 
    1669               // ----- TBC : Here we might check that each item is a
    1670               // real integer ...
    1671 
    1672               // ----- Look for single value
    1673               if ($v_size_item_list == 1) {
    1674                   // ----- Set the option value
    1675                   $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
    1676                   $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
    1677               }
    1678               elseif ($v_size_item_list == 2) {
    1679                   // ----- Set the option value
    1680                   $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
    1681                   $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
    1682               }
    1683               else {
    1684                   // ----- Error log
    1685                   PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1686 
    1687                   // ----- Return
    1688                   //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1689                   return PclZip::errorCode();
    1690               }
    1691 
    1692               //--(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']."]");
    1693 
    1694               // ----- Look for list sort
    1695               if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
    1696                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The list should be sorted ...");
    1697                   $v_sort_flag=true;
    1698 
    1699                   // ----- TBC : An automatic sort should be writen ...
    1700                   // ----- Error log
    1701                   PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1702 
    1703                   // ----- Return
    1704                   //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1705                   return PclZip::errorCode();
    1706               }
    1707               $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
    1708           }
    1709 
    1710           // ----- Sort the items
    1711           if ($v_sort_flag) {
    1712               // TBC : To Be Completed
    1713               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "List sorting is not yet write ...");
    1714           }
    1715 
    1716           // ----- Next option
    1717           $i++;
    1718         break;
    1719 
    1720         // ----- Look for options that request no value
    1721         case PCLZIP_OPT_REMOVE_ALL_PATH :
    1722         case PCLZIP_OPT_EXTRACT_AS_STRING :
    1723         case PCLZIP_OPT_NO_COMPRESSION :
    1724         case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
    1725         case PCLZIP_OPT_REPLACE_NEWER :
    1726         case PCLZIP_OPT_STOP_ON_ERROR :
    1727           $v_result_list[$p_options_list[$i]] = true;
    1728           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
    1729         break;
    1730 
    1731         // ----- Look for options that request an octal value
    1732         case PCLZIP_OPT_SET_CHMOD :
    1733           // ----- Check the number of parameters
    1734           if (($i+1) >= $p_size) {
    1735             // ----- Error log
    1736             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1737 
    1738             // ----- Return
    1739             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1740             return PclZip::errorCode();
    1741           }
    1742 
    1743           // ----- Get the value
    1744           $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
    1745           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
    1746           $i++;
    1747         break;
    1748 
    1749         // ----- Look for options that request a call-back
    1750         case PCLZIP_CB_PRE_EXTRACT :
    1751         case PCLZIP_CB_POST_EXTRACT :
    1752         case PCLZIP_CB_PRE_ADD :
    1753         case PCLZIP_CB_POST_ADD :
    1754         /* for futur use
    1755         case PCLZIP_CB_PRE_DELETE :
    1756         case PCLZIP_CB_POST_DELETE :
    1757         case PCLZIP_CB_PRE_LIST :
    1758         case PCLZIP_CB_POST_LIST :
    1759         */
    1760           // ----- Check the number of parameters
    1761           if (($i+1) >= $p_size) {
    1762             // ----- Error log
    1763             PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1764 
    1765             // ----- Return
    1766             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1767             return PclZip::errorCode();
    1768           }
    1769 
    1770           // ----- Get the value
    1771           $v_function_name = $p_options_list[$i+1];
    1772           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'");
    1773 
    1774           // ----- Check that the value is a valid existing function
    1775           if (!function_exists($v_function_name)) {
    1776             // ----- Error log
    1777             PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");
    1778 
    1779             // ----- Return
    1780             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1781             return PclZip::errorCode();
    1782           }
    1783 
    1784           // ----- Set the attribute
    1785           $v_result_list[$p_options_list[$i]] = $v_function_name;
    1786           $i++;
    1787         break;
    1788 
    1789         default :
    1790           // ----- Error log
    1791           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
    1792                                "Unknown parameter '"
     1695            // ----- Return
     1696            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1697            return PclZip::errorCode();
     1698          }
     1699          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1700          $i++;
     1701        break;
     1702
     1703        // ----- Look for options that request an array of index
     1704        case PCLZIP_OPT_BY_INDEX :
     1705          // ----- Check the number of parameters
     1706          if (($i+1) >= $p_size) {
     1707            // ----- Error log
     1708            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1709
     1710            // ----- Return
     1711            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1712            return PclZip::errorCode();
     1713          }
     1714
     1715          // ----- Get the value
     1716          $v_work_list = array();
     1717          if (is_string($p_options_list[$i+1])) {
     1718              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'");
     1719
     1720              // ----- Remove spaces
     1721              $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');
     1722
     1723              // ----- Parse items
     1724              $v_work_list = explode(",", $p_options_list[$i+1]);
     1725          }
     1726          else if (is_integer($p_options_list[$i+1])) {
     1727              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'");
     1728              $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
     1729          }
     1730          else if (is_array($p_options_list[$i+1])) {
     1731              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array");
     1732              $v_work_list = $p_options_list[$i+1];
     1733          }
     1734          else {
     1735            // ----- Error log
     1736            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1737
     1738            // ----- Return
     1739            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1740            return PclZip::errorCode();
     1741          }
     1742         
     1743          // ----- Reduce the index list
     1744          // each index item in the list must be a couple with a start and
     1745          // an end value : [0,3], [5-5], [8-10], ...
     1746          // ----- Check the format of each item
     1747          $v_sort_flag=false;
     1748          $v_sort_value=0;
     1749          for ($j=0; $j<sizeof($v_work_list); $j++) {
     1750              // ----- Explode the item
     1751              $v_item_list = explode("-", $v_work_list[$j]);
     1752              $v_size_item_list = sizeof($v_item_list);
     1753             
     1754              // ----- TBC : Here we might check that each item is a
     1755              // real integer ...
     1756             
     1757              // ----- Look for single value
     1758              if ($v_size_item_list == 1) {
     1759                  // ----- Set the option value
     1760                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
     1761                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
     1762              }
     1763              elseif ($v_size_item_list == 2) {
     1764                  // ----- Set the option value
     1765                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
     1766                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
     1767              }
     1768              else {
     1769                  // ----- Error log
     1770                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1771
     1772                  // ----- Return
     1773                  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1774                  return PclZip::errorCode();
     1775              }
     1776
     1777              //--(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']."]");
     1778
     1779              // ----- Look for list sort
     1780              if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
     1781                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The list should be sorted ...");
     1782                  $v_sort_flag=true;
     1783
     1784                  // ----- TBC : An automatic sort should be writen ...
     1785                  // ----- Error log
     1786                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1787
     1788                  // ----- Return
     1789                  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1790                  return PclZip::errorCode();
     1791              }
     1792              $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
     1793          }
     1794         
     1795          // ----- Sort the items
     1796          if ($v_sort_flag) {
     1797              // TBC : To Be Completed
     1798              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "List sorting is not yet write ...");
     1799          }
     1800
     1801          // ----- Next option
     1802          $i++;
     1803        break;
     1804
     1805        // ----- Look for options that request no value
     1806        case PCLZIP_OPT_REMOVE_ALL_PATH :
     1807        case PCLZIP_OPT_EXTRACT_AS_STRING :
     1808        case PCLZIP_OPT_NO_COMPRESSION :
     1809        case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
     1810        case PCLZIP_OPT_REPLACE_NEWER :
     1811        case PCLZIP_OPT_STOP_ON_ERROR :
     1812          $v_result_list[$p_options_list[$i]] = true;
     1813          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1814        break;
     1815
     1816        // ----- Look for options that request an octal value
     1817        case PCLZIP_OPT_SET_CHMOD :
     1818          // ----- Check the number of parameters
     1819          if (($i+1) >= $p_size) {
     1820            // ----- Error log
     1821            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1822
     1823            // ----- Return
     1824            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1825            return PclZip::errorCode();
     1826          }
     1827
     1828          // ----- Get the value
     1829          $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
     1830          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
     1831          $i++;
     1832        break;
     1833
     1834        // ----- Look for options that request a call-back
     1835        case PCLZIP_CB_PRE_EXTRACT :
     1836        case PCLZIP_CB_POST_EXTRACT :
     1837        case PCLZIP_CB_PRE_ADD :
     1838        case PCLZIP_CB_POST_ADD :
     1839        /* for futur use
     1840        case PCLZIP_CB_PRE_DELETE :
     1841        case PCLZIP_CB_POST_DELETE :
     1842        case PCLZIP_CB_PRE_LIST :
     1843        case PCLZIP_CB_POST_LIST :
     1844        */
     1845          // ----- Check the number of parameters
     1846          if (($i+1) >= $p_size) {
     1847            // ----- Error log
     1848            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1849
     1850            // ----- Return
     1851            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1852            return PclZip::errorCode();
     1853          }
     1854
     1855          // ----- Get the value
     1856          $v_function_name = $p_options_list[$i+1];
     1857          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'");
     1858
     1859          // ----- Check that the value is a valid existing function
     1860          if (!function_exists($v_function_name)) {
     1861            // ----- Error log
     1862            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");
     1863
     1864            // ----- Return
     1865            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1866            return PclZip::errorCode();
     1867          }
     1868
     1869          // ----- Set the attribute
     1870          $v_result_list[$p_options_list[$i]] = $v_function_name;
     1871          $i++;
     1872        break;
     1873
     1874        default :
     1875          // ----- Error log
     1876          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
     1877                               "Unknown parameter '"
    17931878                               .$p_options_list[$i]."'");
    17941879
    1795           // ----- Return
    1796           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1797           return PclZip::errorCode();
    1798       }
    1799 
    1800       // ----- Next options
    1801       $i++;
    1802     }
    1803 
    1804     // ----- Look for mandatory options
    1805     if ($v_requested_options !== false) {
    1806       for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
    1807         // ----- Look for mandatory option
    1808         if ($v_requested_options[$key] == 'mandatory') {
    1809           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
    1810           // ----- Look if present
    1811           if (!isset($v_result_list[$key])) {
    1812             // ----- Error log
    1813             PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
    1814 
    1815             // ----- Return
    1816             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1817             return PclZip::errorCode();
    1818           }
    1819         }
    1820       }
    1821     }
    1822 
    1823     // ----- Return
    1824     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    1825     return $v_result;
     1880          // ----- Return
     1881          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1882          return PclZip::errorCode();
     1883      }
     1884
     1885      // ----- Next options
     1886      $i++;
     1887    }
     1888
     1889    // ----- Look for mandatory options
     1890    if ($v_requested_options !== false) {
     1891      for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
     1892        // ----- Look for mandatory option
     1893        if ($v_requested_options[$key] == 'mandatory') {
     1894          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
     1895          // ----- Look if present
     1896          if (!isset($v_result_list[$key])) {
     1897            // ----- Error log
     1898            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
     1899
     1900            // ----- Return
     1901            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1902            return PclZip::errorCode();
     1903          }
     1904        }
     1905      }
     1906    }
     1907   
     1908    // ----- Look for default values
     1909    if (!isset($v_result_list[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD])) {
     1910      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3,"Calculate auto threshold");
     1911     
     1912    }
     1913
     1914    // ----- Return
     1915    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     1916    return $v_result;
     1917  }
     1918  // --------------------------------------------------------------------------------
     1919
     1920  // --------------------------------------------------------------------------------
     1921  // Function : privOptionDefaultThreshold()
     1922  // Description :
     1923  // Parameters :
     1924  // Return Values :
     1925  // --------------------------------------------------------------------------------
     1926  function privOptionDefaultThreshold(&$p_options)
     1927  {
     1928    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOptionDefaultThreshold", "");
     1929    $v_result=1;
     1930   
     1931    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3,"Create an auto-threshold for use of temporay files");
     1932    // ----- Get 'memory_limit' configuration value
     1933    $v_memory_limit = ini_get('memory_limit');
     1934    $v_memory_limit = trim($v_memory_limit);
     1935    $last = strtolower(substr($v_memory_limit, -1));
     1936 
     1937    if($last == 'g')
     1938        //$v_memory_limit = $v_memory_limit*1024*1024*1024;
     1939        $v_memory_limit = $v_memory_limit*1073741824;
     1940    if($last == 'm')
     1941        //$v_memory_limit = $v_memory_limit*1024*1024;
     1942        $v_memory_limit = $v_memory_limit*1048576;
     1943    if($last == 'k')
     1944        $v_memory_limit = $v_memory_limit*1024;
     1945           
     1946    $p_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD] = floor($v_memory_limit/2);
     1947   
     1948    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3,"Threshold value is : ".$p_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD]." bytes");
     1949
     1950    // ----- Sanity check : No threshold if value lower than 1M
     1951    if ($p_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD] < 1048576) {
     1952      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3,"Unset the threshold (value ".$p_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD].") because under 1Mo sanity check)");
     1953      unset($p_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD]);
     1954    }
     1955         
     1956    // ----- Return
     1957    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     1958    return $v_result;
    18261959  }
    18271960  // --------------------------------------------------------------------------------
     
    18371970  function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
    18381971  {
    1839     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrParseAtt", "");
    1840     $v_result=1;
    1841 
    1842     // ----- For each file in the list check the attributes
    1843     foreach ($p_file_list as $v_key => $v_value) {
    1844 
    1845       // ----- Check if the option is supported
    1846       if (!isset($v_requested_options[$v_key])) {
    1847         // ----- Error log
    1848         PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");
    1849 
    1850         // ----- Return
    1851         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1852         return PclZip::errorCode();
    1853       }
    1854 
    1855       // ----- Look for attribute
    1856       switch ($v_key) {
    1857         case PCLZIP_ATT_FILE_NAME :
    1858           if (!is_string($v_value)) {
    1859             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
    1860             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1861             return PclZip::errorCode();
    1862           }
    1863 
    1864           $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
    1865           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
    1866 
    1867           if ($p_filedescr['filename'] == '') {
    1868             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
    1869             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1870             return PclZip::errorCode();
    1871           }
    1872 
    1873         break;
    1874 
    1875         case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
    1876           if (!is_string($v_value)) {
    1877             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
    1878             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1879             return PclZip::errorCode();
    1880           }
    1881 
    1882           $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);
    1883           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
    1884 
    1885           if ($p_filedescr['new_short_name'] == '') {
    1886             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
    1887             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1888             return PclZip::errorCode();
    1889           }
    1890         break;
    1891 
    1892         case PCLZIP_ATT_FILE_NEW_FULL_NAME :
    1893           if (!is_string($v_value)) {
    1894             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
    1895             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1896             return PclZip::errorCode();
    1897           }
    1898 
    1899           $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);
    1900           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
    1901 
    1902           if ($p_filedescr['new_full_name'] == '') {
    1903             PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
    1904             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1905             return PclZip::errorCode();
    1906           }
    1907         break;
    1908 
    1909         default :
    1910           // ----- Error log
    1911           PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
    1912                                    "Unknown parameter '".$v_key."'");
    1913 
    1914           // ----- Return
    1915           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1916           return PclZip::errorCode();
    1917       }
    1918 
    1919       // ----- Look for mandatory options
    1920       if ($v_requested_options !== false) {
    1921         for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
    1922           // ----- Look for mandatory option
    1923           if ($v_requested_options[$key] == 'mandatory') {
    1924             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
    1925             // ----- Look if present
    1926             if (!isset($p_file_list[$key])) {
    1927               PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
    1928               //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1929               return PclZip::errorCode();
    1930             }
    1931           }
    1932         }
    1933       }
    1934 
    1935     // end foreach
    1936     }
    1937 
    1938     // ----- Return
    1939     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    1940     return $v_result;
     1972    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrParseAtt", "");
     1973    $v_result=1;
     1974   
     1975    // ----- For each file in the list check the attributes
     1976    foreach ($p_file_list as $v_key => $v_value) {
     1977   
     1978      // ----- Check if the option is supported
     1979      if (!isset($v_requested_options[$v_key])) {
     1980        // ----- Error log
     1981        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");
     1982
     1983        // ----- Return
     1984        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1985        return PclZip::errorCode();
     1986      }
     1987
     1988      // ----- Look for attribute
     1989      switch ($v_key) {
     1990        case PCLZIP_ATT_FILE_NAME :
     1991          if (!is_string($v_value)) {
     1992            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
     1993            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     1994            return PclZip::errorCode();
     1995          }
     1996
     1997          $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
     1998          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
     1999         
     2000          if ($p_filedescr['filename'] == '') {
     2001            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
     2002            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2003            return PclZip::errorCode();
     2004          }
     2005
     2006        break;
     2007
     2008        case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
     2009          if (!is_string($v_value)) {
     2010            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
     2011            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2012            return PclZip::errorCode();
     2013          }
     2014
     2015          $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);
     2016          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
     2017
     2018          if ($p_filedescr['new_short_name'] == '') {
     2019            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
     2020            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2021            return PclZip::errorCode();
     2022          }
     2023        break;
     2024
     2025        case PCLZIP_ATT_FILE_NEW_FULL_NAME :
     2026          if (!is_string($v_value)) {
     2027            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
     2028            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2029            return PclZip::errorCode();
     2030          }
     2031
     2032          $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);
     2033          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
     2034
     2035          if ($p_filedescr['new_full_name'] == '') {
     2036            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
     2037            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2038            return PclZip::errorCode();
     2039          }
     2040        break;
     2041
     2042        // ----- Look for options that takes a string
     2043        case PCLZIP_ATT_FILE_COMMENT :
     2044          if (!is_string($v_value)) {
     2045            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
     2046            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2047            return PclZip::errorCode();
     2048          }
     2049
     2050          $p_filedescr['comment'] = $v_value;
     2051          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
     2052        break;
     2053
     2054        case PCLZIP_ATT_FILE_MTIME :
     2055          if (!is_integer($v_value)) {
     2056            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'");
     2057            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2058            return PclZip::errorCode();
     2059          }
     2060
     2061          $p_filedescr['mtime'] = $v_value;
     2062          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
     2063        break;
     2064
     2065        case PCLZIP_ATT_FILE_CONTENT :
     2066          $p_filedescr['content'] = $v_value;
     2067          ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
     2068        break;
     2069
     2070        default :
     2071          // ----- Error log
     2072          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
     2073                                   "Unknown parameter '".$v_key."'");
     2074
     2075          // ----- Return
     2076          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2077          return PclZip::errorCode();
     2078      }
     2079
     2080      // ----- Look for mandatory options
     2081      if ($v_requested_options !== false) {
     2082        for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
     2083          // ----- Look for mandatory option
     2084          if ($v_requested_options[$key] == 'mandatory') {
     2085            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
     2086            // ----- Look if present
     2087            if (!isset($p_file_list[$key])) {
     2088              PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
     2089              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2090              return PclZip::errorCode();
     2091            }
     2092          }
     2093        }
     2094      }
     2095   
     2096    // end foreach
     2097    }
     2098   
     2099    // ----- Return
     2100    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2101    return $v_result;
    19412102  }
    19422103  // --------------------------------------------------------------------------------
     
    19452106  // Function : privFileDescrExpand()
    19462107  // Description :
     2108  //   This method look for each item of the list to see if its a file, a folder
     2109  //   or a string to be added as file. For any other type of files (link, other)
     2110  //   just ignore the item.
     2111  //   Then prepare the information that will be stored for that file.
     2112  //   When its a folder, expand the folder with all the files that are in that
     2113  //   folder (recursively).
    19472114  // Parameters :
    19482115  // Return Values :
     
    19522119  function privFileDescrExpand(&$p_filedescr_list, &$p_options)
    19532120  {
    1954     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrExpand", "");
    1955     $v_result=1;
    1956 
    1957     // ----- Create a result list
    1958     $v_result_list = array();
    1959 
    1960     // ----- Look each entry
    1961     for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
    1962       // ----- Get filedescr
    1963       $v_descr = $p_filedescr_list[$i];
    1964 
    1965       // ----- Reduce the filename
    1966       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr before reduction :'".$v_descr['filename']."'");
    1967       $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename']);
    1968       $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
    1969       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr after reduction :'".$v_descr['filename']."'");
    1970 
    1971       // ----- Get type of descr
    1972       if (!file_exists($v_descr['filename'])) {
    1973         // ----- Error log
    1974         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_descr['filename']."' does not exists");
    1975         PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exists");
    1976 
    1977         // ----- Return
    1978         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    1979         return PclZip::errorCode();
    1980       }
    1981       if (@is_file($v_descr['filename'])) {
    1982         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a file");
    1983         $v_descr['type'] = 'file';
    1984       }
    1985       else if (@is_dir($v_descr['filename'])) {
    1986         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a folder");
    1987         $v_descr['type'] = 'folder';
    1988       }
    1989       else if (@is_link($v_descr['filename'])) {
    1990         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : link");
    1991         // skip
    1992         continue;
    1993       }
    1994       else {
    1995         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : unknown type");
    1996         // skip
    1997         continue;
    1998       }
    1999 
    2000       // ----- Calculate the stored filename
    2001       $this->privCalculateStoredFilename($v_descr, $p_options);
    2002 
    2003       // ----- Add the descriptor in result list
    2004       $v_result_list[sizeof($v_result_list)] = $v_descr;
    2005 
    2006       // ----- Look for folder
    2007       if ($v_descr['type'] == 'folder') {
    2008         // ----- List of items in folder
    2009         $v_dirlist_descr = array();
    2010         $v_dirlist_nb = 0;
    2011         if ($v_folder_handler = @opendir($v_descr['filename'])) {
    2012           while (($v_item_handler = @readdir($v_folder_handler)) !== false) {
    2013             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for '".$v_item_handler."' in the directory");
    2014 
    2015             // ----- Skip '.' and '..'
    2016             if (($v_item_handler == '.') || ($v_item_handler == '..')) {
    2017                 continue;
    2018             }
    2019 
    2020             // ----- Compose the full filename
    2021             $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
    2022 
    2023             // ----- Look for different stored filename
    2024             // Because the name of the folder was changed, the name of the
    2025             // files/sub-folders also change
    2026             if ($v_descr['stored_filename'] != $v_descr['filename']) {
    2027               $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
    2028             }
    2029 
    2030             $v_dirlist_nb++;
    2031           }
    2032         }
    2033         else {
    2034           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to open dir '".$v_descr['filename']."' in read mode. Skipped.");
    2035           // TBC : unable to open folder in read mode
    2036         }
    2037 
    2038         // ----- Expand each element of the list
    2039         if ($v_dirlist_nb != 0) {
    2040           // ----- Expand
    2041           if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
    2042             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2043             return $v_result;
    2044           }
    2045 
    2046           // ----- Concat the resulting list
    2047           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Merging result list (size '".sizeof($v_result_list)."') with dirlist (size '".sizeof($v_dirlist_descr)."')");
    2048           $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
    2049           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "merged result list is size '".sizeof($v_result_list)."'");
    2050         }
    2051         else {
    2052           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Nothing in this folder to expand.");
    2053         }
    2054 
    2055         // ----- Free local array
    2056         unset($v_dirlist_descr);
    2057       }
    2058     }
    2059 
    2060     // ----- Get the result list
    2061     $p_filedescr_list = $v_result_list;
    2062 
    2063     // ----- Return
    2064     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2065     return $v_result;
     2121    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrExpand", "");
     2122    $v_result=1;
     2123   
     2124    // ----- Create a result list
     2125    $v_result_list = array();
     2126   
     2127    // ----- Look each entry
     2128    for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
     2129      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for file ".$i.".");
     2130     
     2131      // ----- Get filedescr
     2132      $v_descr = $p_filedescr_list[$i];
     2133     
     2134      // ----- Reduce the filename
     2135      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr before reduction :'".$v_descr['filename']."'");
     2136      $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);
     2137      $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
     2138      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr after reduction :'".$v_descr['filename']."'");
     2139     
     2140      // ----- Look for real file or folder
     2141      if (file_exists($v_descr['filename'])) {
     2142        if (@is_file($v_descr['filename'])) {
     2143          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a file");
     2144          $v_descr['type'] = 'file';
     2145        }
     2146        else if (@is_dir($v_descr['filename'])) {
     2147          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a folder");
     2148          $v_descr['type'] = 'folder';
     2149        }
     2150        else if (@is_link($v_descr['filename'])) {
     2151          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : link");
     2152          // skip
     2153          continue;
     2154        }
     2155        else {
     2156          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : unknown type");
     2157          // skip
     2158          continue;
     2159        }
     2160      }
     2161     
     2162      // ----- Look for string added as file
     2163      else if (isset($v_descr['content'])) {
     2164        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a string added as a file");
     2165        $v_descr['type'] = 'virtual_file';
     2166      }
     2167     
     2168      // ----- Missing file
     2169      else {
     2170        // ----- Error log
     2171        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_descr['filename']."' does not exist");
     2172        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist");
     2173
     2174        // ----- Return
     2175        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2176        return PclZip::errorCode();
     2177      }
     2178     
     2179      // ----- Calculate the stored filename
     2180      $this->privCalculateStoredFilename($v_descr, $p_options);
     2181     
     2182      // ----- Add the descriptor in result list
     2183      $v_result_list[sizeof($v_result_list)] = $v_descr;
     2184     
     2185      // ----- Look for folder
     2186      if ($v_descr['type'] == 'folder') {
     2187        // ----- List of items in folder
     2188        $v_dirlist_descr = array();
     2189        $v_dirlist_nb = 0;
     2190        if ($v_folder_handler = @opendir($v_descr['filename'])) {
     2191          while (($v_item_handler = @readdir($v_folder_handler)) !== false) {
     2192            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for '".$v_item_handler."' in the directory");
     2193
     2194            // ----- Skip '.' and '..'
     2195            if (($v_item_handler == '.') || ($v_item_handler == '..')) {
     2196                continue;
     2197            }
     2198           
     2199            // ----- Compose the full filename
     2200            $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
     2201           
     2202            // ----- Look for different stored filename
     2203            // Because the name of the folder was changed, the name of the
     2204            // files/sub-folders also change
     2205            if ($v_descr['stored_filename'] != $v_descr['filename']) {
     2206              if ($v_descr['stored_filename'] != '') {
     2207                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
     2208              }
     2209              else {
     2210                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;
     2211              }
     2212            }
     2213     
     2214            $v_dirlist_nb++;
     2215          }
     2216         
     2217          @closedir($v_folder_handler);
     2218        }
     2219        else {
     2220          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to open dir '".$v_descr['filename']."' in read mode. Skipped.");
     2221          // TBC : unable to open folder in read mode
     2222        }
     2223       
     2224        // ----- Expand each element of the list
     2225        if ($v_dirlist_nb != 0) {
     2226          // ----- Expand
     2227          if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
     2228            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2229            return $v_result;
     2230          }
     2231         
     2232          // ----- Concat the resulting list
     2233          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Merging result list (size '".sizeof($v_result_list)."') with dirlist (size '".sizeof($v_dirlist_descr)."')");
     2234          $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
     2235          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "merged result list is size '".sizeof($v_result_list)."'");
     2236        }
     2237        else {
     2238          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Nothing in this folder to expand.");
     2239        }
     2240         
     2241        // ----- Free local array
     2242        unset($v_dirlist_descr);
     2243      }
     2244    }
     2245   
     2246    // ----- Get the result list
     2247    $p_filedescr_list = $v_result_list;
     2248
     2249    // ----- Return
     2250    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2251    return $v_result;
    20662252  }
    20672253  // --------------------------------------------------------------------------------
     
    20752261  function privCreate($p_filedescr_list, &$p_result_list, &$p_options)
    20762262  {
    2077     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list");
    2078     $v_result=1;
    2079     $v_list_detail = array();
    2080 
    2081     // ----- Magic quotes trick
    2082     $this->privDisableMagicQuotes();
    2083 
    2084     // ----- Open the file in write mode
    2085     if (($v_result = $this->privOpenFd('wb')) != 1)
    2086     {
    2087       // ----- Return
    2088       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2089       return $v_result;
    2090     }
    2091 
    2092     // ----- Add the list of files
    2093     $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);
    2094 
    2095     // ----- Close
    2096     $this->privCloseFd();
    2097 
    2098     // ----- Magic quotes trick
    2099     $this->privSwapBackMagicQuotes();
    2100 
    2101     // ----- Return
    2102     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2103     return $v_result;
     2263    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list");
     2264    $v_result=1;
     2265    $v_list_detail = array();
     2266   
     2267    // ----- Magic quotes trick
     2268    $this->privDisableMagicQuotes();
     2269
     2270    // ----- Open the file in write mode
     2271    if (($v_result = $this->privOpenFd('wb')) != 1)
     2272    {
     2273      // ----- Return
     2274      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2275      return $v_result;
     2276    }
     2277
     2278    // ----- Add the list of files
     2279    $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);
     2280
     2281    // ----- Close
     2282    $this->privCloseFd();
     2283
     2284    // ----- Magic quotes trick
     2285    $this->privSwapBackMagicQuotes();
     2286
     2287    // ----- Return
     2288    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2289    return $v_result;
    21042290  }
    21052291  // --------------------------------------------------------------------------------
     
    21132299  function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
    21142300  {
    2115     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list");
    2116     $v_result=1;
    2117     $v_list_detail = array();
    2118 
    2119     // ----- Look if the archive exists or is empty
    2120     if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
    2121     {
    2122       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it.");
    2123 
    2124       // ----- Do a create
    2125       $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);
    2126 
    2127       // ----- Return
    2128       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2129       return $v_result;
    2130     }
    2131     // ----- Magic quotes trick
    2132     $this->privDisableMagicQuotes();
    2133 
    2134     // ----- Open the zip file
    2135     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    2136     if (($v_result=$this->privOpenFd('rb')) != 1)
    2137     {
    2138       // ----- Magic quotes trick
    2139       $this->privSwapBackMagicQuotes();
    2140 
    2141       // ----- Return
    2142       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2143       return $v_result;
    2144     }
    2145 
    2146     // ----- Read the central directory informations
    2147     $v_central_dir = array();
    2148     if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    2149     {
    2150       $this->privCloseFd();
    2151       $this->privSwapBackMagicQuotes();
    2152       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2153       return $v_result;
    2154     }
    2155 
    2156     // ----- Go to beginning of File
    2157     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
    2158     @rewind($this->zip_fd);
    2159     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
    2160 
    2161     // ----- Creates a temporay file
    2162     $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
    2163 
    2164     // ----- Open the temporary file in write mode
    2165     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    2166     if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
    2167     {
    2168       $this->privCloseFd();
    2169       $this->privSwapBackMagicQuotes();
    2170 
    2171       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
    2172 
    2173       // ----- Return
    2174       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    2175       return PclZip::errorCode();
    2176     }
    2177 
    2178     // ----- Copy the files from the archive to the temporary file
    2179     // TBC : Here I should better append the file and go back to erase the central dir
    2180     $v_size = $v_central_dir['offset'];
    2181     while ($v_size != 0)
    2182     {
    2183       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    2184       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    2185       $v_buffer = fread($this->zip_fd, $v_read_size);
    2186       @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
    2187       $v_size -= $v_read_size;
    2188     }
    2189 
    2190     // ----- Swap the file descriptor
    2191     // Here is a trick : I swap the temporary fd with the zip fd, in order to use
    2192     // the following methods on the temporary fil and not the real archive
    2193     $v_swap = $this->zip_fd;
    2194     $this->zip_fd = $v_zip_temp_fd;
    2195     $v_zip_temp_fd = $v_swap;
    2196 
    2197     // ----- Add the files
    2198     $v_header_list = array();
    2199     if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
    2200     {
    2201       fclose($v_zip_temp_fd);
    2202       $this->privCloseFd();
    2203       @unlink($v_zip_temp_name);
    2204       $this->privSwapBackMagicQuotes();
    2205 
    2206       // ----- Return
    2207       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2208       return $v_result;
    2209     }
    2210 
    2211     // ----- Store the offset of the central dir
    2212     $v_offset = @ftell($this->zip_fd);
    2213     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
    2214 
    2215     // ----- Copy the block of file headers from the old archive
    2216     $v_size = $v_central_dir['size'];
    2217     while ($v_size != 0)
    2218     {
    2219       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    2220       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    2221       $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
    2222       @fwrite($this->zip_fd, $v_buffer, $v_read_size);
    2223       $v_size -= $v_read_size;
    2224     }
    2225 
    2226     // ----- Create the Central Dir files header
    2227     for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
    2228     {
    2229       // ----- Create the file header
    2230       if ($v_header_list[$i]['status'] == 'ok') {
    2231         if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
    2232           fclose($v_zip_temp_fd);
    2233           $this->privCloseFd();
    2234           @unlink($v_zip_temp_name);
    2235           $this->privSwapBackMagicQuotes();
    2236 
    2237           // ----- Return
    2238           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2239           return $v_result;
    2240         }
    2241         $v_count++;
    2242       }
    2243 
    2244       // ----- Transform the header to a 'usable' info
    2245       $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
    2246     }
    2247 
    2248     // ----- Zip file comment
    2249     $v_comment = $v_central_dir['comment'];
    2250     if (isset($p_options[PCLZIP_OPT_COMMENT])) {
    2251       $v_comment = $p_options[PCLZIP_OPT_COMMENT];
    2252     }
    2253     if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
    2254       $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
    2255     }
    2256     if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
    2257       $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
    2258     }
    2259 
    2260     // ----- Calculate the size of the central header
    2261     $v_size = @ftell($this->zip_fd)-$v_offset;
    2262 
    2263     // ----- Create the central dir footer
    2264     if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
    2265     {
    2266       // ----- Reset the file list
    2267       unset($v_header_list);
    2268       $this->privSwapBackMagicQuotes();
    2269 
    2270       // ----- Return
    2271       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2272       return $v_result;
    2273     }
    2274 
    2275     // ----- Swap back the file descriptor
    2276     $v_swap = $this->zip_fd;
    2277     $this->zip_fd = $v_zip_temp_fd;
    2278     $v_zip_temp_fd = $v_swap;
    2279 
    2280     // ----- Close
    2281     $this->privCloseFd();
    2282 
    2283     // ----- Close the temporary file
    2284     @fclose($v_zip_temp_fd);
    2285 
    2286     // ----- Magic quotes trick
    2287     $this->privSwapBackMagicQuotes();
    2288 
    2289     // ----- Delete the zip file
    2290     // TBC : I should test the result ...
    2291     @unlink($this->zipname);
    2292 
    2293     // ----- Rename the temporary file
    2294     // TBC : I should test the result ...
    2295     //@rename($v_zip_temp_name, $this->zipname);
    2296     PclZipUtilRename($v_zip_temp_name, $this->zipname);
    2297 
    2298     // ----- Return
    2299     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2300     return $v_result;
     2301    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list");
     2302    $v_result=1;
     2303    $v_list_detail = array();
     2304
     2305    // ----- Look if the archive exists or is empty
     2306    if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
     2307    {
     2308      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it.");
     2309
     2310      // ----- Do a create
     2311      $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);
     2312
     2313      // ----- Return
     2314      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2315      return $v_result;
     2316    }
     2317    // ----- Magic quotes trick
     2318    $this->privDisableMagicQuotes();
     2319
     2320    // ----- Open the zip file
     2321    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     2322    if (($v_result=$this->privOpenFd('rb')) != 1)
     2323    {
     2324      // ----- Magic quotes trick
     2325      $this->privSwapBackMagicQuotes();
     2326
     2327      // ----- Return
     2328      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2329      return $v_result;
     2330    }
     2331
     2332    // ----- Read the central directory informations
     2333    $v_central_dir = array();
     2334    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
     2335    {
     2336      $this->privCloseFd();
     2337      $this->privSwapBackMagicQuotes();
     2338      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2339      return $v_result;
     2340    }
     2341
     2342    // ----- Go to beginning of File
     2343    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
     2344    @rewind($this->zip_fd);
     2345    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
     2346
     2347    // ----- Creates a temporay file
     2348    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
     2349
     2350    // ----- Open the temporary file in write mode
     2351    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     2352    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
     2353    {
     2354      $this->privCloseFd();
     2355      $this->privSwapBackMagicQuotes();
     2356
     2357      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
     2358
     2359      // ----- Return
     2360      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2361      return PclZip::errorCode();
     2362    }
     2363
     2364    // ----- Copy the files from the archive to the temporary file
     2365    // TBC : Here I should better append the file and go back to erase the central dir
     2366    $v_size = $v_central_dir['offset'];
     2367    while ($v_size != 0)
     2368    {
     2369      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     2370      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     2371      $v_buffer = fread($this->zip_fd, $v_read_size);
     2372      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
     2373      $v_size -= $v_read_size;
     2374    }
     2375
     2376    // ----- Swap the file descriptor
     2377    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
     2378    // the following methods on the temporary fil and not the real archive
     2379    $v_swap = $this->zip_fd;
     2380    $this->zip_fd = $v_zip_temp_fd;
     2381    $v_zip_temp_fd = $v_swap;
     2382
     2383    // ----- Add the files
     2384    $v_header_list = array();
     2385    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
     2386    {
     2387      fclose($v_zip_temp_fd);
     2388      $this->privCloseFd();
     2389      @unlink($v_zip_temp_name);
     2390      $this->privSwapBackMagicQuotes();
     2391
     2392      // ----- Return
     2393      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2394      return $v_result;
     2395    }
     2396
     2397    // ----- Store the offset of the central dir
     2398    $v_offset = @ftell($this->zip_fd);
     2399    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
     2400
     2401    // ----- Copy the block of file headers from the old archive
     2402    $v_size = $v_central_dir['size'];
     2403    while ($v_size != 0)
     2404    {
     2405      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     2406      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     2407      $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
     2408      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
     2409      $v_size -= $v_read_size;
     2410    }
     2411
     2412    // ----- Create the Central Dir files header
     2413    for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
     2414    {
     2415      // ----- Create the file header
     2416      if ($v_header_list[$i]['status'] == 'ok') {
     2417        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
     2418          fclose($v_zip_temp_fd);
     2419          $this->privCloseFd();
     2420          @unlink($v_zip_temp_name);
     2421          $this->privSwapBackMagicQuotes();
     2422
     2423          // ----- Return
     2424          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2425          return $v_result;
     2426        }
     2427        $v_count++;
     2428      }
     2429
     2430      // ----- Transform the header to a 'usable' info
     2431      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
     2432    }
     2433
     2434    // ----- Zip file comment
     2435    $v_comment = $v_central_dir['comment'];
     2436    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
     2437      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
     2438    }
     2439    if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
     2440      $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
     2441    }
     2442    if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
     2443      $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
     2444    }
     2445
     2446    // ----- Calculate the size of the central header
     2447    $v_size = @ftell($this->zip_fd)-$v_offset;
     2448
     2449    // ----- Create the central dir footer
     2450    if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
     2451    {
     2452      // ----- Reset the file list
     2453      unset($v_header_list);
     2454      $this->privSwapBackMagicQuotes();
     2455
     2456      // ----- Return
     2457      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2458      return $v_result;
     2459    }
     2460
     2461    // ----- Swap back the file descriptor
     2462    $v_swap = $this->zip_fd;
     2463    $this->zip_fd = $v_zip_temp_fd;
     2464    $v_zip_temp_fd = $v_swap;
     2465
     2466    // ----- Close
     2467    $this->privCloseFd();
     2468
     2469    // ----- Close the temporary file
     2470    @fclose($v_zip_temp_fd);
     2471
     2472    // ----- Magic quotes trick
     2473    $this->privSwapBackMagicQuotes();
     2474
     2475    // ----- Delete the zip file
     2476    // TBC : I should test the result ...
     2477    @unlink($this->zipname);
     2478
     2479    // ----- Rename the temporary file
     2480    // TBC : I should test the result ...
     2481    //@rename($v_zip_temp_name, $this->zipname);
     2482    PclZipUtilRename($v_zip_temp_name, $this->zipname);
     2483
     2484    // ----- Return
     2485    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2486    return $v_result;
    23012487  }
    23022488  // --------------------------------------------------------------------------------
     
    23092495  function privOpenFd($p_mode)
    23102496  {
    2311     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode);
    2312     $v_result=1;
    2313 
    2314     // ----- Look if already open
    2315     if ($this->zip_fd != 0)
    2316     {
    2317       // ----- Error log
    2318       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');
    2319 
    2320       // ----- Return
    2321       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    2322       return PclZip::errorCode();
    2323     }
    2324 
    2325     // ----- Open the zip file
    2326     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode');
    2327     if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
    2328     {
    2329       // ----- Error log
    2330       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');
    2331 
    2332       // ----- Return
    2333       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    2334       return PclZip::errorCode();
    2335     }
    2336 
    2337     // ----- Return
    2338     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2339     return $v_result;
     2497    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode);
     2498    $v_result=1;
     2499
     2500    // ----- Look if already open
     2501    if ($this->zip_fd != 0)
     2502    {
     2503      // ----- Error log
     2504      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');
     2505
     2506      // ----- Return
     2507      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2508      return PclZip::errorCode();
     2509    }
     2510
     2511    // ----- Open the zip file
     2512    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode');
     2513    if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
     2514    {
     2515      // ----- Error log
     2516      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');
     2517
     2518      // ----- Return
     2519      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2520      return PclZip::errorCode();
     2521    }
     2522
     2523    // ----- Return
     2524    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2525    return $v_result;
    23402526  }
    23412527  // --------------------------------------------------------------------------------
     
    23482534  function privCloseFd()
    23492535  {
    2350     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", "");
    2351     $v_result=1;
    2352 
    2353     if ($this->zip_fd != 0)
    2354       @fclose($this->zip_fd);
    2355     $this->zip_fd = 0;
    2356 
    2357     // ----- Return
    2358     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2359     return $v_result;
     2536    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", "");
     2537    $v_result=1;
     2538
     2539    if ($this->zip_fd != 0)
     2540      @fclose($this->zip_fd);
     2541    $this->zip_fd = 0;
     2542
     2543    // ----- Return
     2544    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2545    return $v_result;
    23602546  }
    23612547  // --------------------------------------------------------------------------------
     
    23772563  function privAddList($p_filedescr_list, &$p_result_list, &$p_options)
    23782564  {
    2379     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list");
    2380     $v_result=1;
    2381 
    2382     // ----- Add the files
    2383     $v_header_list = array();
    2384     if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
    2385     {
    2386       // ----- Return
    2387       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2388       return $v_result;
    2389     }
    2390 
    2391     // ----- Store the offset of the central dir
    2392     $v_offset = @ftell($this->zip_fd);
    2393 
    2394     // ----- Create the Central Dir files header
    2395     for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
    2396     {
    2397       // ----- Create the file header
    2398       if ($v_header_list[$i]['status'] == 'ok') {
    2399         if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
    2400           // ----- Return
    2401           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2402           return $v_result;
    2403         }
    2404         $v_count++;
    2405       }
    2406 
    2407       // ----- Transform the header to a 'usable' info
    2408       $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
    2409     }
    2410 
    2411     // ----- Zip file comment
    2412     $v_comment = '';
    2413     if (isset($p_options[PCLZIP_OPT_COMMENT])) {
    2414       $v_comment = $p_options[PCLZIP_OPT_COMMENT];
    2415     }
    2416 
    2417     // ----- Calculate the size of the central header
    2418     $v_size = @ftell($this->zip_fd)-$v_offset;
    2419 
    2420     // ----- Create the central dir footer
    2421     if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
    2422     {
    2423       // ----- Reset the file list
    2424       unset($v_header_list);
    2425 
    2426       // ----- Return
    2427       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2428       return $v_result;
    2429     }
    2430 
    2431     // ----- Return
    2432     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2433     return $v_result;
     2565    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list");
     2566    $v_result=1;
     2567
     2568    // ----- Add the files
     2569    $v_header_list = array();
     2570    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
     2571    {
     2572      // ----- Return
     2573      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2574      return $v_result;
     2575    }
     2576
     2577    // ----- Store the offset of the central dir
     2578    $v_offset = @ftell($this->zip_fd);
     2579
     2580    // ----- Create the Central Dir files header
     2581    for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
     2582    {
     2583      // ----- Create the file header
     2584      if ($v_header_list[$i]['status'] == 'ok') {
     2585        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
     2586          // ----- Return
     2587          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2588          return $v_result;
     2589        }
     2590        $v_count++;
     2591      }
     2592
     2593      // ----- Transform the header to a 'usable' info
     2594      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
     2595    }
     2596
     2597    // ----- Zip file comment
     2598    $v_comment = '';
     2599    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
     2600      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
     2601    }
     2602
     2603    // ----- Calculate the size of the central header
     2604    $v_size = @ftell($this->zip_fd)-$v_offset;
     2605
     2606    // ----- Create the central dir footer
     2607    if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
     2608    {
     2609      // ----- Reset the file list
     2610      unset($v_header_list);
     2611
     2612      // ----- Return
     2613      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2614      return $v_result;
     2615    }
     2616
     2617    // ----- Return
     2618    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2619    return $v_result;
    24342620  }
    24352621  // --------------------------------------------------------------------------------
     
    24392625  // Description :
    24402626  // Parameters :
    2441   //   $p_filedescr_list : An array containing the file description
    2442   //                      or directory names to add in the zip
     2627  //   $p_filedescr_list : An array containing the file description 
     2628  //                      or directory names to add in the zip
    24432629  //   $p_result_list : list of added files with their properties (specially the status field)
    24442630  // Return Values :
     
    24462632  function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)
    24472633  {
    2448     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "filedescr_list");
    2449     $v_result=1;
    2450     $v_header = array();
    2451 
    2452     // ----- Recuperate the current number of elt in list
    2453     $v_nb = sizeof($p_result_list);
    2454     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have ".$v_nb." elements");
    2455 
    2456     // ----- Loop on the files
    2457     for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
    2458       // ----- Format the filename
    2459       $p_filedescr_list[$j]['filename']
    2460       = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
    2461 
    2462       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for file '".$p_filedescr_list[$j]['filename']."'");
    2463 
    2464       // ----- Skip empty file names
    2465       // TBC : Can this be possible ? not checked in DescrParseAtt ?
    2466       if ($p_filedescr_list[$j]['filename'] == "") {
    2467         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Skip empty filename");
    2468         continue;
    2469       }
    2470 
    2471       // ----- Check the filename
    2472       if (!file_exists($p_filedescr_list[$j]['filename'])) {
    2473         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
    2474         PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
    2475         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    2476         return PclZip::errorCode();
    2477       }
    2478 
    2479       // ----- Look if it is a file or a dir with no all path remove option
    2480       if (   (is_file($p_filedescr_list[$j]['filename']))
    2481           || (   is_dir($p_filedescr_list[$j]['filename'])
    2482               && (   !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
    2483                   || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {
    2484 
    2485         // ----- Add the file
    2486         $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
    2487                                        $p_options);
    2488         if ($v_result != 1) {
    2489           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2490           return $v_result;
    2491         }
    2492 
    2493         // ----- Store the file infos
    2494         $p_result_list[$v_nb++] = $v_header;
    2495       }
    2496     }
    2497     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have ".$v_nb." elements");
    2498 
    2499     // ----- Return
    2500     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2501     return $v_result;
     2634    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "filedescr_list");
     2635    $v_result=1;
     2636    $v_header = array();
     2637
     2638    // ----- Recuperate the current number of elt in list
     2639    $v_nb = sizeof($p_result_list);
     2640    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have ".$v_nb." elements");
     2641
     2642    // ----- Loop on the files
     2643    for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
     2644      // ----- Format the filename
     2645      $p_filedescr_list[$j]['filename']
     2646      = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
     2647     
     2648      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for file '".$p_filedescr_list[$j]['filename']."'");
     2649
     2650      // ----- Skip empty file names
     2651      // TBC : Can this be possible ? not checked in DescrParseAtt ?
     2652      if ($p_filedescr_list[$j]['filename'] == "") {
     2653        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Skip empty filename");
     2654        continue;
     2655      }
     2656
     2657      // ----- Check the filename
     2658      if (   ($p_filedescr_list[$j]['type'] != 'virtual_file')
     2659          && (!file_exists($p_filedescr_list[$j]['filename']))) {
     2660        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_filedescr_list[$j]['filename']."' does not exist");
     2661        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist");
     2662        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2663        return PclZip::errorCode();
     2664      }
     2665
     2666      // ----- Look if it is a file or a dir with no all path remove option
     2667      // or a dir with all its path removed
     2668//    if (   (is_file($p_filedescr_list[$j]['filename']))
     2669//        || (   is_dir($p_filedescr_list[$j]['filename'])
     2670      if (   ($p_filedescr_list[$j]['type'] == 'file')
     2671          || ($p_filedescr_list[$j]['type'] == 'virtual_file')
     2672          || (   ($p_filedescr_list[$j]['type'] == 'folder')
     2673              && (   !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
     2674                  || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))
     2675          ) {
     2676
     2677        // ----- Add the file
     2678        $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
     2679                                       $p_options);
     2680        if ($v_result != 1) {
     2681          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2682          return $v_result;
     2683        }
     2684
     2685        // ----- Store the file infos
     2686        $p_result_list[$v_nb++] = $v_header;
     2687      }
     2688    }
     2689    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have ".$v_nb." elements");
     2690
     2691    // ----- Return
     2692    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2693    return $v_result;
    25022694  }
    25032695  // --------------------------------------------------------------------------------
     
    25112703  function privAddFile($p_filedescr, &$p_header, &$p_options)
    25122704  {
    2513     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='".$p_filedescr['filename']."'");
    2514     $v_result=1;
    2515 
    2516     // ----- Working variable
    2517     $p_filename = $p_filedescr['filename'];
    2518 
    2519     // TBC : Already done in the fileAtt check ... ?
    2520     if ($p_filename == "") {
    2521       // ----- Error log
    2522       PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
    2523 
    2524       // ----- Return
    2525       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    2526       return PclZip::errorCode();
    2527     }
    2528 
    2529     // ----- Look for a stored different filename
    2530     if (isset($p_filedescr['stored_filename'])) {
    2531       $v_stored_filename = $p_filedescr['stored_filename'];
    2532       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is NOT the same "'.$v_stored_filename.'"');
    2533     }
    2534     else {
    2535       $v_stored_filename = $p_filedescr['stored_filename'];
    2536       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is the same');
    2537     }
    2538 
    2539     // ----- Set the file properties
    2540     clearstatcache();
    2541     $p_header['version'] = 20;
    2542     $p_header['version_extracted'] = 10;
    2543     $p_header['flag'] = 0;
    2544     $p_header['compression'] = 0;
    2545     $p_header['mtime'] = filemtime($p_filename);
    2546     $p_header['crc'] = 0;
    2547     $p_header['compressed_size'] = 0;
    2548     $p_header['size'] = filesize($p_filename);
    2549     $p_header['filename_len'] = strlen($p_filename);
    2550     $p_header['extra_len'] = 0;
    2551     $p_header['comment_len'] = 0;
    2552     $p_header['disk'] = 0;
    2553     $p_header['internal'] = 0;
    2554 //    $p_header['external'] = (is_file($p_filename)?0xFE49FFE0:0x41FF0010);
    2555     $p_header['external'] = (is_file($p_filename)?0x00000000:0x00000010);
    2556     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'");
    2557     $p_header['offset'] = 0;
    2558     $p_header['filename'] = $p_filename;
    2559     $p_header['stored_filename'] = $v_stored_filename;
    2560     $p_header['extra'] = '';
    2561     $p_header['comment'] = '';
    2562     $p_header['status'] = 'ok';
    2563     $p_header['index'] = -1;
    2564 
    2565     // ----- Look for pre-add callback
    2566     if (isset($p_options[PCLZIP_CB_PRE_ADD])) {
    2567       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction");
    2568 
    2569       // ----- Generate a local information
    2570       $v_local_header = array();
    2571       $this->privConvertHeader2FileInfo($p_header, $v_local_header);
    2572 
    2573       // ----- Call the callback
    2574       // Here I do not use call_user_func() because I need to send a reference to the
    2575       // header.
    2576       eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');
    2577       if ($v_result == 0) {
    2578         // ----- Change the file status
    2579         $p_header['status'] = "skipped";
    2580         $v_result = 1;
    2581       }
    2582 
    2583       // ----- Update the informations
    2584       // Only some fields can be modified
    2585       if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
    2586         $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
    2587         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'");
    2588       }
    2589     }
    2590 
    2591     // ----- Look for empty stored filename
    2592     if ($p_header['stored_filename'] == "") {
    2593       $p_header['status'] = "filtered";
    2594     }
    2595 
    2596     // ----- Check the path length
    2597     if (strlen($p_header['stored_filename']) > 0xFF) {
    2598       $p_header['status'] = 'filename_too_long';
    2599     }
    2600 
    2601     // ----- Look if no error, or file not skipped
    2602     if ($p_header['status'] == 'ok') {
    2603 
    2604       // ----- Look for a file
    2605       if (is_file($p_filename))
    2606       {
    2607         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file");
    2608         // ----- Open the source file
    2609         if (($v_file = @fopen($p_filename, "rb")) == 0) {
    2610           PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
    2611           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    2612           return PclZip::errorCode();
    2613         }
    2614 
    2615         if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
    2616           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed");
    2617           // ----- Read the file content
    2618           $v_content_compressed = @fread($v_file, $p_header['size']);
    2619 
    2620           // ----- Calculate the CRC
    2621           $p_header['crc'] = @crc32($v_content_compressed);
    2622 
    2623           // ----- Set header parameters
    2624           $p_header['compressed_size'] = $p_header['size'];
    2625           $p_header['compression'] = 0;
    2626         }
    2627         else {
    2628           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed");
    2629           // ----- Read the file content
    2630           $v_content = @fread($v_file, $p_header['size']);
    2631 
    2632           // ----- Calculate the CRC
    2633           $p_header['crc'] = @crc32($v_content);
    2634 
    2635           // ----- Compress the file
    2636           $v_content_compressed = @gzdeflate($v_content);
    2637 
    2638           // ----- Set header parameters
    2639           $p_header['compressed_size'] = strlen($v_content_compressed);
    2640           $p_header['compression'] = 8;
    2641         }
    2642 
    2643         // ----- Look for encryption
    2644         /*
    2645         if ((isset($p_options[PCLZIP_OPT_CRYPT]))
    2646             && ($p_options[PCLZIP_OPT_CRYPT] != "")) {
    2647           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ....");
    2648 
    2649           // Should be a random header
    2650           $v_header = 'xxxxxxxxxxxx';
    2651           $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed,
    2652                                                    $p_header['compressed_size'],
    2653                                                    $v_header,
     2705    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='".$p_filedescr['filename']."'");
     2706    $v_result=1;
     2707   
     2708    // ----- Working variable
     2709    $p_filename = $p_filedescr['filename'];
     2710
     2711    // TBC : Already done in the fileAtt check ... ?
     2712    if ($p_filename == "") {
     2713      // ----- Error log
     2714      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
     2715
     2716      // ----- Return
     2717      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2718      return PclZip::errorCode();
     2719    }
     2720 
     2721    // ----- Look for a stored different filename
     2722    /* TBC : Removed
     2723    if (isset($p_filedescr['stored_filename'])) {
     2724      $v_stored_filename = $p_filedescr['stored_filename'];
     2725      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is NOT the same "'.$v_stored_filename.'"');
     2726    }
     2727    else {
     2728      $v_stored_filename = $p_filedescr['stored_filename'];
     2729      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is the same');
     2730    }
     2731    */
     2732
     2733    // ----- Set the file properties
     2734    clearstatcache();
     2735    $p_header['version'] = 20;
     2736    $p_header['version_extracted'] = 10;
     2737    $p_header['flag'] = 0;
     2738    $p_header['compression'] = 0;
     2739    $p_header['crc'] = 0;
     2740    $p_header['compressed_size'] = 0;
     2741    $p_header['filename_len'] = strlen($p_filename);
     2742    $p_header['extra_len'] = 0;
     2743    $p_header['disk'] = 0;
     2744    $p_header['internal'] = 0;
     2745    $p_header['offset'] = 0;
     2746    $p_header['filename'] = $p_filename;
     2747// TBC : Removed    $p_header['stored_filename'] = $v_stored_filename;
     2748    $p_header['stored_filename'] = $p_filedescr['stored_filename'];
     2749    $p_header['extra'] = '';
     2750    $p_header['status'] = 'ok';
     2751    $p_header['index'] = -1;
     2752
     2753    // ----- Look for regular file
     2754    if ($p_filedescr['type']=='file') {
     2755      $p_header['external'] = 0x00000000;
     2756      $p_header['size'] = filesize($p_filename);
     2757    }
     2758   
     2759    // ----- Look for regular folder
     2760    else if ($p_filedescr['type']=='folder') {
     2761      $p_header['external'] = 0x00000010;
     2762      $p_header['mtime'] = filemtime($p_filename);
     2763      $p_header['size'] = filesize($p_filename);
     2764    }
     2765   
     2766    // ----- Look for virtual file
     2767    else if ($p_filedescr['type'] == 'virtual_file') {
     2768      $p_header['external'] = 0x00000000;
     2769      $p_header['size'] = strlen($p_filedescr['content']);
     2770    }
     2771   
     2772    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'");
     2773
     2774    // ----- Look for filetime
     2775    if (isset($p_filedescr['mtime'])) {
     2776      $p_header['mtime'] = $p_filedescr['mtime'];
     2777    }
     2778    else if ($p_filedescr['type'] == 'virtual_file') {
     2779      $p_header['mtime'] = time();
     2780    }
     2781    else {
     2782      $p_header['mtime'] = filemtime($p_filename);
     2783    }
     2784
     2785    // ------ Look for file comment
     2786    if (isset($p_filedescr['comment'])) {
     2787      $p_header['comment_len'] = strlen($p_filedescr['comment']);
     2788      $p_header['comment'] = $p_filedescr['comment'];
     2789    }
     2790    else {
     2791      $p_header['comment_len'] = 0;
     2792      $p_header['comment'] = '';
     2793    }
     2794
     2795    // ----- Look for pre-add callback
     2796    if (isset($p_options[PCLZIP_CB_PRE_ADD])) {
     2797      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction");
     2798
     2799      // ----- Generate a local information
     2800      $v_local_header = array();
     2801      $this->privConvertHeader2FileInfo($p_header, $v_local_header);
     2802
     2803      // ----- Call the callback
     2804      // Here I do not use call_user_func() because I need to send a reference to the
     2805      // header.
     2806      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');
     2807      if ($v_result == 0) {
     2808        // ----- Change the file status
     2809        $p_header['status'] = "skipped";
     2810        $v_result = 1;
     2811      }
     2812
     2813      // ----- Update the informations
     2814      // Only some fields can be modified
     2815      if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
     2816        $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
     2817        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'");
     2818      }
     2819    }
     2820
     2821    // ----- Look for empty stored filename
     2822    if ($p_header['stored_filename'] == "") {
     2823      $p_header['status'] = "filtered";
     2824    }
     2825   
     2826    // ----- Check the path length
     2827    if (strlen($p_header['stored_filename']) > 0xFF) {
     2828      $p_header['status'] = 'filename_too_long';
     2829    }
     2830
     2831    // ----- Look if no error, or file not skipped
     2832    if ($p_header['status'] == 'ok') {
     2833
     2834      // ----- Look for a file
     2835      if ($p_filedescr['type'] == 'file') {
     2836        // ----- Look for using temporary file to zip
     2837        if ( (!isset($p_options[PCLZIP_OPT_ADD_TEMP_FILE_OFF]))
     2838            && (isset($p_options[PCLZIP_OPT_ADD_TEMP_FILE_ON])
     2839                || (isset($p_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD])
     2840                    && ($p_options[PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) {
     2841          $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);
     2842          if ($v_result >= PCLZIP_ERR_NO_ERROR) {
     2843            return $v_result;
     2844          }
     2845        }
     2846       
     2847        // ----- Use "in memory" zip algo
     2848        else {
     2849         
     2850        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file");
     2851
     2852        // ----- Open the source file
     2853        if (($v_file = @fopen($p_filename, "rb")) == 0) {
     2854          PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
     2855          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     2856          return PclZip::errorCode();
     2857        }
     2858
     2859        // ----- Read the file content
     2860        $v_content = @fread($v_file, $p_header['size']);
     2861
     2862        // ----- Close the file
     2863        @fclose($v_file);
     2864
     2865        // ----- Calculate the CRC
     2866        $p_header['crc'] = @crc32($v_content);
     2867       
     2868        // ----- Look for no compression
     2869        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
     2870          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed");
     2871          // ----- Set header parameters
     2872          $p_header['compressed_size'] = $p_header['size'];
     2873          $p_header['compression'] = 0;
     2874        }
     2875       
     2876        // ----- Look for normal compression
     2877        else {
     2878          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed");
     2879          // ----- Compress the content
     2880          $v_content = @gzdeflate($v_content);
     2881
     2882          // ----- Set header parameters
     2883          $p_header['compressed_size'] = strlen($v_content);
     2884          $p_header['compression'] = 8;
     2885        }
     2886       
     2887        // ----- Look for encryption
     2888        /*
     2889        if ((isset($p_options[PCLZIP_OPT_CRYPT]))
     2890            && ($p_options[PCLZIP_OPT_CRYPT] != "")) {
     2891          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ....");
     2892         
     2893          // Should be a random header
     2894          $v_header = 'xxxxxxxxxxxx';
     2895          $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed,
     2896                                                   $p_header['compressed_size'],
     2897                                                   $v_header,
    26542898                                                   $p_header['crc'],
    26552899                                                   "test");
    2656 
    2657           $p_header['compressed_size'] += 12;
    2658           $p_header['flag'] = 1;
    2659 
    2660           // ----- Add the header to the data
    2661           $v_content_compressed = $v_header.$v_content_compressed;
    2662           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed)."");
    2663         }
    2664         */
    2665 
    2666         // ----- Call the header generation
    2667         if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
    2668           @fclose($v_file);
    2669           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2670           return $v_result;
    2671         }
    2672 
    2673         // ----- Write the compressed (or not) content
    2674         @fwrite($this->zip_fd,
    2675                     $v_content_compressed, $p_header['compressed_size']);
    2676 
    2677         // ----- Close the file
    2678         @fclose($v_file);
    2679       }
    2680 
    2681       // ----- Look for a directory
    2682       else {
    2683         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder");
    2684         // ----- Look for directory last '/'
    2685         if (@substr($p_header['stored_filename'], -1) != '/') {
    2686           $p_header['stored_filename'] .= '/';
    2687         }
    2688 
    2689         // ----- Set the file properties
    2690         $p_header['size'] = 0;
    2691         //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
    2692         $p_header['external'] = 0x00000010;   // Value for a folder : to be checked
    2693 
    2694         // ----- Call the header generation
    2695         if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
    2696         {
    2697           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2698           return $v_result;
    2699         }
    2700       }
    2701     }
    2702 
    2703     // ----- Look for post-add callback
    2704     if (isset($p_options[PCLZIP_CB_POST_ADD])) {
    2705       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction");
    2706 
    2707       // ----- Generate a local information
    2708       $v_local_header = array();
    2709       $this->privConvertHeader2FileInfo($p_header, $v_local_header);
    2710 
    2711       // ----- Call the callback
    2712       // Here I do not use call_user_func() because I need to send a reference to the
    2713       // header.
    2714       eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');
    2715       if ($v_result == 0) {
    2716         // ----- Ignored
    2717         $v_result = 1;
    2718       }
    2719 
    2720       // ----- Update the informations
    2721       // Nothing can be modified
    2722     }
    2723 
    2724     // ----- Return
    2725     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2726     return $v_result;
     2900                                                   
     2901          $p_header['compressed_size'] += 12;
     2902          $p_header['flag'] = 1;
     2903         
     2904          // ----- Add the header to the data
     2905          $v_content_compressed = $v_header.$v_content_compressed;
     2906          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed)."");
     2907        }
     2908        */
     2909
     2910        // ----- Call the header generation
     2911        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
     2912          @fclose($v_file);
     2913          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2914          return $v_result;
     2915        }
     2916
     2917        // ----- Write the compressed (or not) content
     2918        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
     2919
     2920        }
     2921
     2922      }
     2923
     2924      // ----- Look for a virtual file (a file from string)
     2925      else if ($p_filedescr['type'] == 'virtual_file') {
     2926         
     2927        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Add by string");
     2928        $v_content = $p_filedescr['content'];
     2929
     2930        // ----- Calculate the CRC
     2931        $p_header['crc'] = @crc32($v_content);
     2932       
     2933        // ----- Look for no compression
     2934        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
     2935          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed");
     2936          // ----- Set header parameters
     2937          $p_header['compressed_size'] = $p_header['size'];
     2938          $p_header['compression'] = 0;
     2939        }
     2940       
     2941        // ----- Look for normal compression
     2942        else {
     2943          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed");
     2944          // ----- Compress the content
     2945          $v_content = @gzdeflate($v_content);
     2946
     2947          // ----- Set header parameters
     2948          $p_header['compressed_size'] = strlen($v_content);
     2949          $p_header['compression'] = 8;
     2950        }
     2951       
     2952        // ----- Look for encryption
     2953        /*
     2954        if ((isset($p_options[PCLZIP_OPT_CRYPT]))
     2955            && ($p_options[PCLZIP_OPT_CRYPT] != "")) {
     2956          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ....");
     2957         
     2958          // Should be a random header
     2959          $v_header = 'xxxxxxxxxxxx';
     2960          $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed,
     2961                                                   $p_header['compressed_size'],
     2962                                                   $v_header,
     2963                                                   $p_header['crc'],
     2964                                                   "test");
     2965                                                   
     2966          $p_header['compressed_size'] += 12;
     2967          $p_header['flag'] = 1;
     2968         
     2969          // ----- Add the header to the data
     2970          $v_content_compressed = $v_header.$v_content_compressed;
     2971          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed)."");
     2972        }
     2973        */
     2974
     2975        // ----- Call the header generation
     2976        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
     2977          @fclose($v_file);
     2978          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     2979          return $v_result;
     2980        }
     2981
     2982        // ----- Write the compressed (or not) content
     2983        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
     2984      }
     2985
     2986      // ----- Look for a directory
     2987      else if ($p_filedescr['type'] == 'folder') {
     2988        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder");
     2989        // ----- Look for directory last '/'
     2990        if (@substr($p_header['stored_filename'], -1) != '/') {
     2991          $p_header['stored_filename'] .= '/';
     2992        }
     2993
     2994        // ----- Set the file properties
     2995        $p_header['size'] = 0;
     2996        //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
     2997        $p_header['external'] = 0x00000010;   // Value for a folder : to be checked
     2998
     2999        // ----- Call the header generation
     3000        if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
     3001        {
     3002          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3003          return $v_result;
     3004        }
     3005      }
     3006    }
     3007
     3008    // ----- Look for post-add callback
     3009    if (isset($p_options[PCLZIP_CB_POST_ADD])) {
     3010      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction");
     3011
     3012      // ----- Generate a local information
     3013      $v_local_header = array();
     3014      $this->privConvertHeader2FileInfo($p_header, $v_local_header);
     3015
     3016      // ----- Call the callback
     3017      // Here I do not use call_user_func() because I need to send a reference to the
     3018      // header.
     3019      eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');
     3020      if ($v_result == 0) {
     3021        // ----- Ignored
     3022        $v_result = 1;
     3023      }
     3024
     3025      // ----- Update the informations
     3026      // Nothing can be modified
     3027    }
     3028
     3029    // ----- Return
     3030    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3031    return $v_result;
     3032  }
     3033  // --------------------------------------------------------------------------------
     3034
     3035  // --------------------------------------------------------------------------------
     3036  // Function : privAddFileUsingTempFile()
     3037  // Description :
     3038  // Parameters :
     3039  // Return Values :
     3040  // --------------------------------------------------------------------------------
     3041  function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)
     3042  {
     3043    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileUsingTempFile", "filename='".$p_filedescr['filename']."'");
     3044    $v_result=PCLZIP_ERR_NO_ERROR;
     3045   
     3046    // ----- Working variable
     3047    $p_filename = $p_filedescr['filename'];
     3048
     3049    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file");
     3050
     3051    // ----- Open the source file
     3052    if (($v_file = @fopen($p_filename, "rb")) == 0) {
     3053      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
     3054      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3055      return PclZip::errorCode();
     3056    }
     3057
     3058    // ----- Creates a compressed temporary file
     3059    $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
     3060    if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) {
     3061      fclose($v_file);
     3062      PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');
     3063      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3064      return PclZip::errorCode();
     3065    }
     3066
     3067    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
     3068    $v_size = filesize($p_filename);
     3069    while ($v_size != 0) {
     3070      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     3071      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes");
     3072      $v_buffer = fread($v_file, $v_read_size);
     3073      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
     3074      @gzputs($v_file_compressed, $v_buffer, $v_read_size);
     3075      $v_size -= $v_read_size;
     3076    }
     3077
     3078    // ----- Close the file
     3079    @fclose($v_file);
     3080    @gzclose($v_file_compressed);
     3081
     3082    // ----- Check the minimum file size
     3083    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "gzip file size ".filesize($v_gzip_temp_name));
     3084    if (filesize($v_gzip_temp_name) < 18) {
     3085      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes');
     3086      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3087      return PclZip::errorCode();
     3088    }
     3089
     3090    // ----- Extract the compressed attributes
     3091    if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) {
     3092      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
     3093      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3094      return PclZip::errorCode();
     3095    }
     3096
     3097    // ----- Read the gzip file header
     3098    $v_binary_data = @fread($v_file_compressed, 10);
     3099    $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);
     3100
     3101    // ----- Check some parameters
     3102    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[id1]='.bin2hex($v_data_header['id1']));
     3103    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[id2]='.bin2hex($v_data_header['id2']));
     3104    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[cm]='.bin2hex($v_data_header['cm']));
     3105    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[flag]='.bin2hex($v_data_header['flag']));
     3106    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[mtime]='.$v_data_header['mtime']);
     3107    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[xfl]='.bin2hex($v_data_header['xfl']));
     3108    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[os]='.bin2hex($v_data_header['os']));
     3109    $v_data_header['os'] = bin2hex($v_data_header['os']);
     3110
     3111    // ----- Read the gzip file footer
     3112    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File position after header ".ftell($v_file_compressed));
     3113    @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8);
     3114    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File position at beginning of footer ".ftell($v_file_compressed));
     3115    $v_binary_data = @fread($v_file_compressed, 8);
     3116    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File position after footer ".ftell($v_file_compressed));
     3117    $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);
     3118
     3119    // ----- Set the attributes
     3120    $p_header['compression'] = ord($v_data_header['cm']);
     3121    //$p_header['mtime'] = $v_data_header['mtime'];
     3122    $p_header['crc'] = $v_data_footer['crc'];
     3123    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Compressed size ".(filesize($v_gzip_temp_name)-18));
     3124    $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18;
     3125
     3126    // ----- Close the file
     3127    @fclose($v_file_compressed);
     3128
     3129    // ----- Call the header generation
     3130    if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
     3131      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3132      return $v_result;
     3133    }
     3134
     3135    // ----- Add the compressed data
     3136    if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0)
     3137    {
     3138      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
     3139      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3140      return PclZip::errorCode();
     3141    }
     3142
     3143    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
     3144    fseek($v_file_compressed, 10);
     3145    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File position before reading compressed data ".ftell($v_file_compressed));
     3146    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, ' '.$p_header['compressed_size'].' bytes to read');
     3147    $v_size = $p_header['compressed_size'];
     3148    while ($v_size != 0)
     3149    {
     3150      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     3151      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes");
     3152      $v_buffer = fread($v_file_compressed, $v_read_size);
     3153      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
     3154      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
     3155      $v_size -= $v_read_size;
     3156    }
     3157
     3158    // ----- Close the file
     3159    @fclose($v_file_compressed);
     3160
     3161    // ----- Unlink the temporary file
     3162    @unlink($v_gzip_temp_name);
     3163   
     3164    // ----- Return
     3165    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3166    return $v_result;
    27273167  }
    27283168  // --------------------------------------------------------------------------------
     
    27383178  function privCalculateStoredFilename(&$p_filedescr, &$p_options)
    27393179  {
    2740     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCalculateStoredFilename", "filename='".$p_filedescr['filename']."'");
    2741     $v_result=1;
    2742 
    2743     // ----- Working variables
    2744     $p_filename = $p_filedescr['filename'];
    2745     if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
    2746       $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
    2747     }
    2748     else {
    2749       $p_add_dir = '';
    2750     }
    2751     if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
    2752       $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
    2753     }
    2754     else {
    2755       $p_remove_dir = '';
    2756     }
    2757     if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
    2758       $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
    2759     }
    2760     else {
    2761       $p_remove_all_dir = 0;
    2762     }
    2763 
    2764     // ----- Look for full name change
    2765     if (isset($p_filedescr['new_full_name'])) {
    2766       $v_stored_filename = $p_filedescr['new_full_name'];
    2767       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing full name of '".$p_filename."' for '".$v_stored_filename."'");
    2768     }
    2769 
    2770     // ----- Look for path and/or short name change
    2771     else {
    2772 
    2773       // ----- Look for short name change
    2774       if (isset($p_filedescr['new_short_name'])) {
    2775         $v_path_info = pathinfo($p_filename);
    2776         $v_dir = '';
    2777         if ($v_path_info['dirname'] != '') {
    2778           $v_dir = $v_path_info['dirname'].'/';
    2779         }
    2780         $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
    2781         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing short name of '".$p_filename."' for '".$v_stored_filename."'");
    2782       }
    2783       else {
    2784         // ----- Calculate the stored filename
    2785         $v_stored_filename = $p_filename;
    2786       }
    2787 
    2788       // ----- Look for all path to remove
    2789       if ($p_remove_all_dir) {
    2790         $v_stored_filename = basename($p_filename);
    2791         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove all path selected change '".$p_filename."' for '".$v_stored_filename."'");
    2792       }
    2793       // ----- Look for partial path remove
    2794       else if ($p_remove_dir != "") {
    2795         if (substr($p_remove_dir, -1) != '/')
    2796           $p_remove_dir .= "/";
    2797 
    2798         if (   (substr($p_filename, 0, 2) == "./")
    2799             || (substr($p_remove_dir, 0, 2) == "./")) {
    2800 
    2801           if (   (substr($p_filename, 0, 2) == "./")
    2802               && (substr($p_remove_dir, 0, 2) != "./")) {
    2803             $p_remove_dir = "./".$p_remove_dir;
    2804           }
    2805           if (   (substr($p_filename, 0, 2) != "./")
    2806               && (substr($p_remove_dir, 0, 2) == "./")) {
    2807             $p_remove_dir = substr($p_remove_dir, 2);
    2808           }
    2809         }
    2810 
    2811         $v_compare = PclZipUtilPathInclusion($p_remove_dir,
    2812                                              $v_stored_filename);
    2813         if ($v_compare > 0) {
    2814           if ($v_compare == 2) {
    2815             $v_stored_filename = "";
    2816             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder");
    2817           }
    2818           else {
    2819             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$v_stored_filename'");
    2820             $v_stored_filename = substr($v_stored_filename,
    2821                                         strlen($p_remove_dir));
    2822             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Result is '$v_stored_filename'");
    2823           }
    2824         }
    2825       }
    2826       // ----- Look for path to add
    2827       if ($p_add_dir != "") {
    2828         if (substr($p_add_dir, -1) == "/")
    2829           $v_stored_filename = $p_add_dir.$v_stored_filename;
    2830         else
    2831           $v_stored_filename = $p_add_dir."/".$v_stored_filename;
    2832         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'");
    2833       }
    2834     }
    2835 
    2836     // ----- Filename (reduce the path of stored name)
    2837     $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
    2838     $p_filedescr['stored_filename'] = $v_stored_filename;
    2839     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Stored filename will be '".$p_filedescr['stored_filename']."', strlen ".strlen($p_filedescr['stored_filename']));
    2840 
    2841     // ----- Return
    2842     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2843     return $v_result;
     3180    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCalculateStoredFilename", "filename='".$p_filedescr['filename']."'");
     3181    $v_result=1;
     3182   
     3183    // ----- Working variables
     3184    $p_filename = $p_filedescr['filename'];
     3185    if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
     3186      $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
     3187    }
     3188    else {
     3189      $p_add_dir = '';
     3190    }
     3191    if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
     3192      $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
     3193    }
     3194    else {
     3195      $p_remove_dir = '';
     3196    }
     3197    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Remove path ='".$p_remove_dir."'");
     3198    if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
     3199      $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
     3200    }
     3201    else {
     3202      $p_remove_all_dir = 0;
     3203    }
     3204
     3205    // ----- Look for full name change
     3206    if (isset($p_filedescr['new_full_name'])) {
     3207      // ----- Remove drive letter if any
     3208      $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);
     3209      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing full name of '".$p_filename."' for '".$v_stored_filename."'");
     3210    }
     3211   
     3212    // ----- Look for path and/or short name change
     3213    else {
     3214
     3215      // ----- Look for short name change
     3216      // Its when we cahnge just the filename but not the path
     3217      if (isset($p_filedescr['new_short_name'])) {
     3218        $v_path_info = pathinfo($p_filename);
     3219        $v_dir = '';
     3220        if ($v_path_info['dirname'] != '') {
     3221          $v_dir = $v_path_info['dirname'].'/';
     3222        }
     3223        $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
     3224        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing short name of '".$p_filename."' for '".$v_stored_filename."'");
     3225      }
     3226      else {
     3227        // ----- Calculate the stored filename
     3228        $v_stored_filename = $p_filename;
     3229      }
     3230
     3231      // ----- Look for all path to remove
     3232      if ($p_remove_all_dir) {
     3233        $v_stored_filename = basename($p_filename);
     3234        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove all path selected change '".$p_filename."' for '".$v_stored_filename."'");
     3235      }
     3236      // ----- Look for partial path remove
     3237      else if ($p_remove_dir != "") {
     3238        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Partial path to remove");
     3239        if (substr($p_remove_dir, -1) != '/')
     3240          $p_remove_dir .= "/";
     3241
     3242        if (   (substr($p_filename, 0, 2) == "./")
     3243            || (substr($p_remove_dir, 0, 2) == "./")) {
     3244           
     3245          if (   (substr($p_filename, 0, 2) == "./")
     3246              && (substr($p_remove_dir, 0, 2) != "./")) {
     3247            $p_remove_dir = "./".$p_remove_dir;
     3248          }
     3249          if (   (substr($p_filename, 0, 2) != "./")
     3250              && (substr($p_remove_dir, 0, 2) == "./")) {
     3251            $p_remove_dir = substr($p_remove_dir, 2);
     3252          }
     3253        }
     3254
     3255        $v_compare = PclZipUtilPathInclusion($p_remove_dir,
     3256                                             $v_stored_filename);
     3257        if ($v_compare > 0) {
     3258          if ($v_compare == 2) {
     3259            $v_stored_filename = "";
     3260            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder");
     3261          }
     3262          else {
     3263            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$v_stored_filename'");
     3264            $v_stored_filename = substr($v_stored_filename,
     3265                                        strlen($p_remove_dir));
     3266            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Result is '$v_stored_filename'");
     3267          }
     3268        }
     3269      }
     3270     
     3271      // ----- Remove drive letter if any
     3272      $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);
     3273     
     3274      // ----- Look for path to add
     3275      if ($p_add_dir != "") {
     3276        if (substr($p_add_dir, -1) == "/")
     3277          $v_stored_filename = $p_add_dir.$v_stored_filename;
     3278        else
     3279          $v_stored_filename = $p_add_dir."/".$v_stored_filename;
     3280        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'");
     3281      }
     3282    }
     3283
     3284    // ----- Filename (reduce the path of stored name)
     3285    $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
     3286    $p_filedescr['stored_filename'] = $v_stored_filename;
     3287    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Stored filename will be '".$p_filedescr['stored_filename']."', strlen ".strlen($p_filedescr['stored_filename']));
     3288   
     3289    // ----- Return
     3290    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3291    return $v_result;
    28443292  }
    28453293  // --------------------------------------------------------------------------------
     
    28533301  function privWriteFileHeader(&$p_header)
    28543302  {
    2855     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
    2856     $v_result=1;
    2857 
    2858     // ----- Store the offset position of the file
    2859     $p_header['offset'] = ftell($this->zip_fd);
    2860     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'File offset of the header :'.$p_header['offset']);
    2861 
    2862     // ----- Transform UNIX mtime to DOS format mdate/mtime
    2863     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
    2864     $v_date = getdate($p_header['mtime']);
    2865     $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
    2866     $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
    2867 
    2868     // ----- Packed data
    2869     $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,
    2870                           $p_header['version_extracted'], $p_header['flag'],
    2871                           $p_header['compression'], $v_mtime, $v_mdate,
    2872                           $p_header['crc'], $p_header['compressed_size'],
     3303    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
     3304    $v_result=1;
     3305
     3306    // ----- Store the offset position of the file
     3307    $p_header['offset'] = ftell($this->zip_fd);
     3308    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'File offset of the header :'.$p_header['offset']);
     3309
     3310    // ----- Transform UNIX mtime to DOS format mdate/mtime
     3311    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
     3312    $v_date = getdate($p_header['mtime']);
     3313    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
     3314    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
     3315
     3316    // ----- Packed data
     3317    $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,
     3318                          $p_header['version_extracted'], $p_header['flag'],
     3319                          $p_header['compression'], $v_mtime, $v_mdate,
     3320                          $p_header['crc'], $p_header['compressed_size'],
    28733321                          $p_header['size'],
    2874                           strlen($p_header['stored_filename']),
     3322                          strlen($p_header['stored_filename']),
    28753323                          $p_header['extra_len']);
    28763324
    2877     // ----- Write the first 148 bytes of the header in the archive
    2878     fputs($this->zip_fd, $v_binary_data, 30);
    2879 
    2880     // ----- Write the variable fields
    2881     if (strlen($p_header['stored_filename']) != 0)
    2882     {
    2883       fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
    2884     }
    2885     if ($p_header['extra_len'] != 0)
    2886     {
    2887       fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
    2888     }
    2889 
    2890     // ----- Return
    2891     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2892     return $v_result;
     3325    // ----- Write the first 148 bytes of the header in the archive
     3326    fputs($this->zip_fd, $v_binary_data, 30);
     3327
     3328    // ----- Write the variable fields
     3329    if (strlen($p_header['stored_filename']) != 0)
     3330    {
     3331      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
     3332    }
     3333    if ($p_header['extra_len'] != 0)
     3334    {
     3335      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
     3336    }
     3337
     3338    // ----- Return
     3339    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3340    return $v_result;
    28933341  }
    28943342  // --------------------------------------------------------------------------------
     
    29023350  function privWriteCentralFileHeader(&$p_header)
    29033351  {
    2904     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
    2905     $v_result=1;
    2906 
    2907     // TBC
    2908     //for(reset($p_header); $key = key($p_header); next($p_header)) {
    2909     //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]);
    2910     //}
    2911 
    2912     // ----- Transform UNIX mtime to DOS format mdate/mtime
    2913     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
    2914     $v_date = getdate($p_header['mtime']);
    2915     $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
    2916     $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
    2917 
    2918     // ----- Packed data
    2919     $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,
    2920                           $p_header['version'], $p_header['version_extracted'],
    2921                           $p_header['flag'], $p_header['compression'],
     3352    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
     3353    $v_result=1;
     3354
     3355    // TBC
     3356    //for(reset($p_header); $key = key($p_header); next($p_header)) {
     3357    //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]);
     3358    //}
     3359
     3360    // ----- Transform UNIX mtime to DOS format mdate/mtime
     3361    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
     3362    $v_date = getdate($p_header['mtime']);
     3363    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
     3364    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
     3365
     3366    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment size : \''.$p_header['comment_len'].'\'');
     3367
     3368    // ----- Packed data
     3369    $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,
     3370                          $p_header['version'], $p_header['version_extracted'],
     3371                          $p_header['flag'], $p_header['compression'],
    29223372                          $v_mtime, $v_mdate, $p_header['crc'],
    2923                           $p_header['compressed_size'], $p_header['size'],
    2924                           strlen($p_header['stored_filename']),
     3373                          $p_header['compressed_size'], $p_header['size'],
     3374                          strlen($p_header['stored_filename']),
    29253375                          $p_header['extra_len'], $p_header['comment_len'],
    2926                           $p_header['disk'], $p_header['internal'],
     3376                          $p_header['disk'], $p_header['internal'],
    29273377                          $p_header['external'], $p_header['offset']);
    29283378
    2929     // ----- Write the 42 bytes of the header in the zip file
    2930     fputs($this->zip_fd, $v_binary_data, 46);
    2931 
    2932     // ----- Write the variable fields
    2933     if (strlen($p_header['stored_filename']) != 0)
    2934     {
    2935       fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
    2936     }
    2937     if ($p_header['extra_len'] != 0)
    2938     {
    2939       fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
    2940     }
    2941     if ($p_header['comment_len'] != 0)
    2942     {
    2943       fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);
    2944     }
    2945 
    2946     // ----- Return
    2947     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2948     return $v_result;
     3379    // ----- Write the 42 bytes of the header in the zip file
     3380    fputs($this->zip_fd, $v_binary_data, 46);
     3381
     3382    // ----- Write the variable fields
     3383    if (strlen($p_header['stored_filename']) != 0)
     3384    {
     3385      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
     3386    }
     3387    if ($p_header['extra_len'] != 0)
     3388    {
     3389      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
     3390    }
     3391    if ($p_header['comment_len'] != 0)
     3392    {
     3393      fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);
     3394    }
     3395
     3396    // ----- Return
     3397    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3398    return $v_result;
    29493399  }
    29503400  // --------------------------------------------------------------------------------
     
    29583408  function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)
    29593409  {
    2960     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralHeader", 'nb_entries='.$p_nb_entries.', size='.$p_size.', offset='.$p_offset.', comment="'.$p_comment.'"');
    2961     $v_result=1;
    2962 
    2963     // ----- Packed data
    2964     $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,
    2965                           $p_nb_entries, $p_size,
     3410    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralHeader", 'nb_entries='.$p_nb_entries.', size='.$p_size.', offset='.$p_offset.', comment="'.$p_comment.'"');
     3411    $v_result=1;
     3412
     3413    // ----- Packed data
     3414    $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,
     3415                          $p_nb_entries, $p_size,
    29663416                          $p_offset, strlen($p_comment));
    29673417
    2968     // ----- Write the 22 bytes of the header in the zip file
    2969     fputs($this->zip_fd, $v_binary_data, 22);
    2970 
    2971     // ----- Write the variable fields
    2972     if (strlen($p_comment) != 0)
    2973     {
    2974       fputs($this->zip_fd, $p_comment, strlen($p_comment));
    2975     }
    2976 
    2977     // ----- Return
    2978     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    2979     return $v_result;
     3418    // ----- Write the 22 bytes of the header in the zip file
     3419    fputs($this->zip_fd, $v_binary_data, 22);
     3420
     3421    // ----- Write the variable fields
     3422    if (strlen($p_comment) != 0)
     3423    {
     3424      fputs($this->zip_fd, $p_comment, strlen($p_comment));
     3425    }
     3426
     3427    // ----- Return
     3428    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3429    return $v_result;
    29803430  }
    29813431  // --------------------------------------------------------------------------------
     
    29893439  function privList(&$p_list)
    29903440  {
    2991     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privList", "list");
    2992     $v_result=1;
    2993 
    2994     // ----- Magic quotes trick
    2995     $this->privDisableMagicQuotes();
    2996 
    2997     // ----- Open the zip file
    2998     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    2999     if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
    3000     {
    3001       // ----- Magic quotes trick
    3002       $this->privSwapBackMagicQuotes();
    3003 
    3004       // ----- Error log
    3005       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
    3006 
    3007       // ----- Return
    3008       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3009       return PclZip::errorCode();
    3010     }
    3011 
    3012     // ----- Read the central directory informations
    3013     $v_central_dir = array();
    3014     if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    3015     {
    3016       $this->privSwapBackMagicQuotes();
    3017       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3018       return $v_result;
    3019     }
    3020 
    3021     // ----- Go to beginning of Central Dir
    3022     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Offset : ".$v_central_dir['offset']."'");
    3023     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
    3024     @rewind($this->zip_fd);
    3025     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
    3026     if (@fseek($this->zip_fd, $v_central_dir['offset']))
    3027     {
    3028       $this->privSwapBackMagicQuotes();
    3029 
    3030       // ----- Error log
    3031       PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
    3032 
    3033       // ----- Return
    3034       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3035       return PclZip::errorCode();
    3036     }
    3037     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
    3038 
    3039     // ----- Read each entry
    3040     for ($i=0; $i<$v_central_dir['entries']; $i++)
    3041     {
    3042       // ----- Read the file header
    3043       if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
    3044       {
    3045         $this->privSwapBackMagicQuotes();
    3046         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3047         return $v_result;
    3048       }
    3049       $v_header['index'] = $i;
    3050 
    3051       // ----- Get the only interesting attributes
    3052       $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);
    3053       unset($v_header);
    3054     }
    3055 
    3056     // ----- Close the zip file
    3057     $this->privCloseFd();
    3058 
    3059     // ----- Magic quotes trick
    3060     $this->privSwapBackMagicQuotes();
    3061 
    3062     // ----- Return
    3063     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3064     return $v_result;
     3441    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privList", "list");
     3442    $v_result=1;
     3443
     3444    // ----- Magic quotes trick
     3445    $this->privDisableMagicQuotes();
     3446
     3447    // ----- Open the zip file
     3448    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     3449    if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
     3450    {
     3451      // ----- Magic quotes trick
     3452      $this->privSwapBackMagicQuotes();
     3453     
     3454      // ----- Error log
     3455      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
     3456
     3457      // ----- Return
     3458      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3459      return PclZip::errorCode();
     3460    }
     3461
     3462    // ----- Read the central directory informations
     3463    $v_central_dir = array();
     3464    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
     3465    {
     3466      $this->privSwapBackMagicQuotes();
     3467      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3468      return $v_result;
     3469    }
     3470
     3471    // ----- Go to beginning of Central Dir
     3472    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Offset : ".$v_central_dir['offset']."'");
     3473    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
     3474    @rewind($this->zip_fd);
     3475    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
     3476    if (@fseek($this->zip_fd, $v_central_dir['offset']))
     3477    {
     3478      $this->privSwapBackMagicQuotes();
     3479
     3480      // ----- Error log
     3481      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
     3482
     3483      // ----- Return
     3484      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3485      return PclZip::errorCode();
     3486    }
     3487    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
     3488
     3489    // ----- Read each entry
     3490    for ($i=0; $i<$v_central_dir['entries']; $i++)
     3491    {
     3492      // ----- Read the file header
     3493      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
     3494      {
     3495        $this->privSwapBackMagicQuotes();
     3496        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3497        return $v_result;
     3498      }
     3499      $v_header['index'] = $i;
     3500
     3501      // ----- Get the only interesting attributes
     3502      $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);
     3503      unset($v_header);
     3504    }
     3505
     3506    // ----- Close the zip file
     3507    $this->privCloseFd();
     3508
     3509    // ----- Magic quotes trick
     3510    $this->privSwapBackMagicQuotes();
     3511
     3512    // ----- Return
     3513    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3514    return $v_result;
    30653515  }
    30663516  // --------------------------------------------------------------------------------
     
    30723522  //   entries and extract the interesting parameters that will be given back.
    30733523  //   The resulting file infos are set in the array $p_info
    3074   //     $p_info['filename'] : Filename with full path. Given by user (add),
    3075   //                           extracted in the filesystem (extract).
    3076   //     $p_info['stored_filename'] : Stored filename in the archive.
    3077   //     $p_info['size'] = Size of the file.
    3078   //     $p_info['compressed_size'] = Compressed size of the file.
    3079   //     $p_info['mtime'] = Last modification date of the file.
    3080   //     $p_info['comment'] = Comment associated with the file.
    3081   //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.
    3082   //     $p_info['status'] = status of the action on the file.
     3524  //     $p_info['filename'] : Filename with full path. Given by user (add),
     3525  //                           extracted in the filesystem (extract).
     3526  //     $p_info['stored_filename'] : Stored filename in the archive.
     3527  //     $p_info['size'] = Size of the file.
     3528  //     $p_info['compressed_size'] = Compressed size of the file.
     3529  //     $p_info['mtime'] = Last modification date of the file.
     3530  //     $p_info['comment'] = Comment associated with the file.
     3531  //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.
     3532  //     $p_info['status'] = status of the action on the file.
     3533  //     $p_info['crc'] = CRC of the file content.
    30833534  // Parameters :
    30843535  // Return Values :
     
    30863537  function privConvertHeader2FileInfo($p_header, &$p_info)
    30873538  {
    3088     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privConvertHeader2FileInfo", "Filename='".$p_header['filename']."'");
    3089     $v_result=1;
    3090 
    3091     // ----- Get the interesting attributes
    3092     $p_info['filename'] = $p_header['filename'];
    3093     $p_info['stored_filename'] = $p_header['stored_filename'];
    3094     $p_info['size'] = $p_header['size'];
    3095     $p_info['compressed_size'] = $p_header['compressed_size'];
    3096     $p_info['mtime'] = $p_header['mtime'];
    3097     $p_info['comment'] = $p_header['comment'];
    3098     $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
    3099     $p_info['index'] = $p_header['index'];
    3100     $p_info['status'] = $p_header['status'];
    3101 
    3102     // ----- Return
    3103     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3104     return $v_result;
     3539    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privConvertHeader2FileInfo", "Filename='".$p_header['filename']."'");
     3540    $v_result=1;
     3541
     3542    // ----- Get the interesting attributes
     3543    $p_info['filename'] = $p_header['filename'];
     3544    $p_info['stored_filename'] = $p_header['stored_filename'];
     3545    $p_info['size'] = $p_header['size'];
     3546    $p_info['compressed_size'] = $p_header['compressed_size'];
     3547    $p_info['mtime'] = $p_header['mtime'];
     3548    $p_info['comment'] = $p_header['comment'];
     3549    $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
     3550    $p_info['index'] = $p_header['index'];
     3551    $p_info['status'] = $p_header['status'];
     3552    $p_info['crc'] = $p_header['crc'];
     3553
     3554    // ----- Return
     3555    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3556    return $v_result;
    31053557  }
    31063558  // --------------------------------------------------------------------------------
     
    31123564  // Parameters :
    31133565  //   $p_file_list : An array where will be placed the properties of each
    3114   //                  extracted file
     3566  //                  extracted file
    31153567  //   $p_path : Path to add while writing the extracted files
    31163568  //   $p_remove_path : Path to remove (from the file memorized path) while writing the
    3117   //                    extracted files. If the path does not match the file path,
    3118   //                    the file is extracted with its memorized path.
    3119   //                    $p_remove_path does not apply to 'list' mode.
    3120   //                    $p_path and $p_remove_path are commulative.
     3569  //                    extracted files. If the path does not match the file path,
     3570  //                    the file is extracted with its memorized path.
     3571  //                    $p_remove_path does not apply to 'list' mode.
     3572  //                    $p_path and $p_remove_path are commulative.
    31213573  // Return Values :
    31223574  //   1 on success,0 or less on error (see error code list)
     
    31243576  function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
    31253577  {
    3126     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privExtractByRule", "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
    3127     $v_result=1;
    3128 
    3129     // ----- Magic quotes trick
    3130     $this->privDisableMagicQuotes();
    3131 
    3132     // ----- Check the path
    3133     if (   ($p_path == "")
    3134         || (   (substr($p_path, 0, 1) != "/")
    3135             && (substr($p_path, 0, 3) != "../")
     3578    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privExtractByRule", "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
     3579    $v_result=1;
     3580
     3581    // ----- Magic quotes trick
     3582    $this->privDisableMagicQuotes();
     3583
     3584    // ----- Check the path
     3585    if (   ($p_path == "")
     3586        || (   (substr($p_path, 0, 1) != "/")
     3587            && (substr($p_path, 0, 3) != "../")
    31363588            && (substr($p_path,1,2)!=":/")))
    3137       $p_path = "./".$p_path;
    3138 
    3139     // ----- Reduce the path last (and duplicated) '/'
    3140     if (($p_path != "./") && ($p_path != "/"))
    3141     {
    3142       // ----- Look for the path end '/'
    3143       while (substr($p_path, -1) == "/")
    3144       {
    3145         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'");
    3146         $p_path = substr($p_path, 0, strlen($p_path)-1);
    3147         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]");
    3148       }
    3149     }
    3150 
    3151     // ----- Look for path to remove format (should end by /)
    3152     if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
    3153     {
    3154       $p_remove_path .= '/';
    3155     }
    3156     $p_remove_path_size = strlen($p_remove_path);
    3157 
    3158     // ----- Open the zip file
    3159     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    3160     if (($v_result = $this->privOpenFd('rb')) != 1)
    3161     {
    3162       $this->privSwapBackMagicQuotes();
    3163       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3164       return $v_result;
    3165     }
    3166 
    3167     // ----- Read the central directory informations
    3168     $v_central_dir = array();
    3169     if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    3170     {
    3171       // ----- Close the zip file
    3172       $this->privCloseFd();
    3173       $this->privSwapBackMagicQuotes();
    3174 
    3175       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3176       return $v_result;
    3177     }
    3178 
    3179     // ----- Start at beginning of Central Dir
    3180     $v_pos_entry = $v_central_dir['offset'];
    3181 
    3182     // ----- Read each entry
    3183     $j_start = 0;
    3184     for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
    3185     {
    3186       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry : '$i'");
    3187 
    3188       // ----- Read next Central dir entry
    3189       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position before rewind : ".ftell($this->zip_fd)."'");
    3190       @rewind($this->zip_fd);
    3191       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position after rewind : ".ftell($this->zip_fd)."'");
    3192       if (@fseek($this->zip_fd, $v_pos_entry))
    3193       {
    3194         // ----- Close the zip file
    3195         $this->privCloseFd();
    3196         $this->privSwapBackMagicQuotes();
    3197 
    3198         // ----- Error log
    3199         PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
    3200 
    3201         // ----- Return
    3202         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3203         return PclZip::errorCode();
    3204       }
    3205       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position after fseek : ".ftell($this->zip_fd)."'");
    3206 
    3207       // ----- Read the file header
    3208       $v_header = array();
    3209       if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
    3210       {
    3211         // ----- Close the zip file
    3212         $this->privCloseFd();
    3213         $this->privSwapBackMagicQuotes();
    3214 
    3215         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3216         return $v_result;
    3217       }
    3218 
    3219       // ----- Store the index
    3220       $v_header['index'] = $i;
    3221 
    3222       // ----- Store the file position
    3223       $v_pos_entry = ftell($this->zip_fd);
    3224 
    3225       // ----- Look for the specific extract rules
    3226       $v_extract = false;
    3227 
    3228       // ----- Look for extract by name rule
    3229       if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
    3230           && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
    3231           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
    3232 
    3233           // ----- Look if the filename is in the list
    3234           for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {
    3235               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
    3236 
    3237               // ----- Look for a directory
    3238               if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
    3239                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
    3240 
    3241                   // ----- Look if the directory is in the filename path
    3242                   if (   (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
    3243                       && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
    3244                       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
    3245                       $v_extract = true;
    3246                   }
    3247               }
    3248               // ----- Look for a filename
    3249               elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
    3250                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
    3251                   $v_extract = true;
    3252               }
    3253           }
    3254       }
    3255 
    3256       // ----- Look for extract by ereg rule
    3257       else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
    3258                && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
    3259           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
    3260 
    3261           if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {
    3262               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
    3263               $v_extract = true;
    3264           }
    3265       }
    3266 
    3267       // ----- Look for extract by preg rule
    3268       else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
    3269                && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
    3270           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
    3271 
    3272           if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
    3273               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
    3274               $v_extract = true;
    3275           }
    3276       }
    3277 
    3278       // ----- Look for extract by index rule
    3279       else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
    3280                && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
    3281           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
    3282 
    3283           // ----- Look if the index is in the list
    3284           for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {
    3285               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look if index '$i' is in [".$p_options[PCLZIP_OPT_BY_INDEX][$j]['start'].",".$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']."]");
    3286 
    3287               if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
    3288                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
    3289                   $v_extract = true;
    3290               }
    3291               if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
    3292                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
    3293                   $j_start = $j+1;
    3294               }
    3295 
    3296               if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
    3297                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
    3298                   break;
    3299               }
    3300           }
    3301       }
    3302 
    3303       // ----- Look for no rule, which means extract all the archive
    3304       else {
    3305           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with no rule (extract all)");
    3306           $v_extract = true;
    3307       }
     3589      $p_path = "./".$p_path;
     3590
     3591    // ----- Reduce the path last (and duplicated) '/'
     3592    if (($p_path != "./") && ($p_path != "/"))
     3593    {
     3594      // ----- Look for the path end '/'
     3595      while (substr($p_path, -1) == "/")
     3596      {
     3597        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'");
     3598        $p_path = substr($p_path, 0, strlen($p_path)-1);
     3599        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]");
     3600      }
     3601    }
     3602
     3603    // ----- Look for path to remove format (should end by /)
     3604    if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
     3605    {
     3606      $p_remove_path .= '/';
     3607    }
     3608    $p_remove_path_size = strlen($p_remove_path);
     3609
     3610    // ----- Open the zip file
     3611    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     3612    if (($v_result = $this->privOpenFd('rb')) != 1)
     3613    {
     3614      $this->privSwapBackMagicQuotes();
     3615      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3616      return $v_result;
     3617    }
     3618
     3619    // ----- Read the central directory informations
     3620    $v_central_dir = array();
     3621    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
     3622    {
     3623      // ----- Close the zip file
     3624      $this->privCloseFd();
     3625      $this->privSwapBackMagicQuotes();
     3626
     3627      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3628      return $v_result;
     3629    }
     3630
     3631    // ----- Start at beginning of Central Dir
     3632    $v_pos_entry = $v_central_dir['offset'];
     3633
     3634    // ----- Read each entry
     3635    $j_start = 0;
     3636    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
     3637    {
     3638      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry : '$i'");
     3639
     3640      // ----- Read next Central dir entry
     3641      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position before rewind : ".ftell($this->zip_fd)."'");
     3642      @rewind($this->zip_fd);
     3643      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position after rewind : ".ftell($this->zip_fd)."'");
     3644      if (@fseek($this->zip_fd, $v_pos_entry))
     3645      {
     3646        // ----- Close the zip file
     3647        $this->privCloseFd();
     3648        $this->privSwapBackMagicQuotes();
     3649
     3650        // ----- Error log
     3651        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
     3652
     3653        // ----- Return
     3654        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3655        return PclZip::errorCode();
     3656      }
     3657      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position after fseek : ".ftell($this->zip_fd)."'");
     3658
     3659      // ----- Read the file header
     3660      $v_header = array();
     3661      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
     3662      {
     3663        // ----- Close the zip file
     3664        $this->privCloseFd();
     3665        $this->privSwapBackMagicQuotes();
     3666
     3667        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3668        return $v_result;
     3669      }
     3670
     3671      // ----- Store the index
     3672      $v_header['index'] = $i;
     3673
     3674      // ----- Store the file position
     3675      $v_pos_entry = ftell($this->zip_fd);
     3676
     3677      // ----- Look for the specific extract rules
     3678      $v_extract = false;
     3679
     3680      // ----- Look for extract by name rule
     3681      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
     3682          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
     3683          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
     3684
     3685          // ----- Look if the filename is in the list
     3686          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {
     3687              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
     3688
     3689              // ----- Look for a directory
     3690              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
     3691                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
     3692
     3693                  // ----- Look if the directory is in the filename path
     3694                  if (   (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
     3695                      && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
     3696                      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
     3697                      $v_extract = true;
     3698                  }
     3699              }
     3700              // ----- Look for a filename
     3701              elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
     3702                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
     3703                  $v_extract = true;
     3704              }
     3705          }
     3706      }
     3707
     3708      // ----- Look for extract by ereg rule
     3709      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
     3710               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
     3711          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
     3712
     3713          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {
     3714              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
     3715              $v_extract = true;
     3716          }
     3717      }
     3718
     3719      // ----- Look for extract by preg rule
     3720      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
     3721               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
     3722          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
     3723
     3724          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
     3725              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
     3726              $v_extract = true;
     3727          }
     3728      }
     3729
     3730      // ----- Look for extract by index rule
     3731      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
     3732               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
     3733          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
     3734         
     3735          // ----- Look if the index is in the list
     3736          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {
     3737              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look if index '$i' is in [".$p_options[PCLZIP_OPT_BY_INDEX][$j]['start'].",".$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']."]");
     3738
     3739              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
     3740                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
     3741                  $v_extract = true;
     3742              }
     3743              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
     3744                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
     3745                  $j_start = $j+1;
     3746              }
     3747
     3748              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
     3749                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
     3750                  break;
     3751              }
     3752          }
     3753      }
     3754
     3755      // ----- Look for no rule, which means extract all the archive
     3756      else {
     3757          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with no rule (extract all)");
     3758          $v_extract = true;
     3759      }
    33083760
    33093761      // ----- Check compression method
    33103762      if (   ($v_extract)
    3311           && (   ($v_header['compression'] != 8)
    3312               && ($v_header['compression'] != 0))) {
    3313           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported compression method (".$v_header['compression'].")");
    3314           $v_header['status'] = 'unsupported_compression';
    3315 
    3316           // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
    3317           if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
    3318               && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
    3319               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
    3320 
    3321               $this->privSwapBackMagicQuotes();
    3322 
    3323               PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
    3324                                    "Filename '".$v_header['stored_filename']."' is "
    3325                                    ."compressed by an unsupported compression "
    3326                                    ."method (".$v_header['compression'].") ");
    3327 
    3328               //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3329               return PclZip::errorCode();
    3330           }
    3331       }
    3332 
     3763          && (   ($v_header['compression'] != 8)
     3764              && ($v_header['compression'] != 0))) {
     3765          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported compression method (".$v_header['compression'].")");
     3766          $v_header['status'] = 'unsupported_compression';
     3767
     3768          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
     3769          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
     3770              && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
     3771              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
     3772
     3773              $this->privSwapBackMagicQuotes();
     3774             
     3775              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
     3776                                   "Filename '".$v_header['stored_filename']."' is "
     3777                                   ."compressed by an unsupported compression "
     3778                                   ."method (".$v_header['compression'].") ");
     3779
     3780              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3781              return PclZip::errorCode();
     3782          }
     3783      }
     3784     
    33333785      // ----- Check encrypted files
    33343786      if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
    3335           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported file encryption");
    3336           $v_header['status'] = 'unsupported_encryption';
    3337 
    3338           // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
    3339           if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
    3340               && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
    3341               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
    3342 
    3343               $this->privSwapBackMagicQuotes();
    3344 
    3345               PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
    3346                                    "Unsupported encryption for "
    3347                                    ." filename '".$v_header['stored_filename']
     3787          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported file encryption");
     3788          $v_header['status'] = 'unsupported_encryption';
     3789
     3790          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
     3791          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
     3792              && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
     3793              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
     3794
     3795              $this->privSwapBackMagicQuotes();
     3796
     3797              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
     3798                                   "Unsupported encryption for "
     3799                                   ." filename '".$v_header['stored_filename']
    33483800                                   ."'");
    33493801
    3350               //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3351               return PclZip::errorCode();
    3352           }
    3353     }
    3354 
    3355       // ----- Look for real extraction
    3356       if (($v_extract) && ($v_header['status'] != 'ok')) {
    3357           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "No need for extract");
    3358           $v_result = $this->privConvertHeader2FileInfo($v_header,
    3359                                                 $p_file_list[$v_nb_extracted++]);
    3360           if ($v_result != 1) {
    3361               $this->privCloseFd();
    3362               $this->privSwapBackMagicQuotes();
    3363               //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3364               return $v_result;
    3365           }
    3366 
    3367           $v_extract = false;
    3368       }
    3369 
    3370       // ----- Look for real extraction
    3371       if ($v_extract)
    3372       {
    3373         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file '".$v_header['filename']."', index '$i'");
    3374 
    3375         // ----- Go to the file position
    3376         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
    3377         @rewind($this->zip_fd);
    3378         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
    3379         if (@fseek($this->zip_fd, $v_header['offset']))
    3380         {
    3381           // ----- Close the zip file
    3382           $this->privCloseFd();
    3383 
    3384           $this->privSwapBackMagicQuotes();
    3385 
    3386           // ----- Error log
    3387           PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
    3388 
    3389           // ----- Return
    3390           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3391           return PclZip::errorCode();
    3392         }
    3393         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
    3394 
    3395         // ----- Look for extraction as string
    3396         if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {
    3397 
    3398           // ----- Extracting the file
    3399           $v_result1 = $this->privExtractFileAsString($v_header, $v_string);
    3400           if ($v_result1 < 1) {
    3401             $this->privCloseFd();
    3402             $this->privSwapBackMagicQuotes();
    3403             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
    3404             return $v_result1;
    3405           }
    3406 
    3407           // ----- Get the only interesting attributes
    3408           if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
    3409           {
    3410             // ----- Close the zip file
    3411             $this->privCloseFd();
    3412             $this->privSwapBackMagicQuotes();
    3413 
    3414             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3415             return $v_result;
    3416           }
    3417 
    3418           // ----- Set the file content
    3419           $p_file_list[$v_nb_extracted]['content'] = $v_string;
    3420 
    3421           // ----- Next extracted file
    3422           $v_nb_extracted++;
    3423 
    3424           // ----- Look for user callback abort
    3425           if ($v_result1 == 2) {
    3426             break;
    3427           }
    3428         }
    3429         // ----- Look for extraction in standard output
    3430         elseif (   (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
    3431                 && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
    3432           // ----- Extracting the file in standard output
    3433           $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
    3434           if ($v_result1 < 1) {
    3435             $this->privCloseFd();
    3436             $this->privSwapBackMagicQuotes();
    3437             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
    3438             return $v_result1;
    3439           }
    3440 
    3441           // ----- Get the only interesting attributes
    3442           if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
    3443             $this->privCloseFd();
    3444             $this->privSwapBackMagicQuotes();
    3445             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3446             return $v_result;
    3447           }
    3448 
    3449           // ----- Look for user callback abort
    3450           if ($v_result1 == 2) {
    3451             break;
    3452           }
    3453         }
    3454         // ----- Look for normal extraction
    3455         else {
    3456           // ----- Extracting the file
    3457           $v_result1 = $this->privExtractFile($v_header,
    3458                                               $p_path, $p_remove_path,
     3802              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3803              return PclZip::errorCode();
     3804          }
     3805    }
     3806
     3807      // ----- Look for real extraction
     3808      if (($v_extract) && ($v_header['status'] != 'ok')) {
     3809          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "No need for extract");
     3810          $v_result = $this->privConvertHeader2FileInfo($v_header,
     3811                                                $p_file_list[$v_nb_extracted++]);
     3812          if ($v_result != 1) {
     3813              $this->privCloseFd();
     3814              $this->privSwapBackMagicQuotes();
     3815              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3816              return $v_result;
     3817          }
     3818
     3819          $v_extract = false;
     3820      }
     3821     
     3822      // ----- Look for real extraction
     3823      if ($v_extract)
     3824      {
     3825        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file '".$v_header['filename']."', index '$i'");
     3826
     3827        // ----- Go to the file position
     3828        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
     3829        @rewind($this->zip_fd);
     3830        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
     3831        if (@fseek($this->zip_fd, $v_header['offset']))
     3832        {
     3833          // ----- Close the zip file
     3834          $this->privCloseFd();
     3835
     3836          $this->privSwapBackMagicQuotes();
     3837
     3838          // ----- Error log
     3839          PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
     3840
     3841          // ----- Return
     3842          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     3843          return PclZip::errorCode();
     3844        }
     3845        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
     3846
     3847        // ----- Look for extraction as string
     3848        if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {
     3849
     3850          // ----- Extracting the file
     3851          $v_result1 = $this->privExtractFileAsString($v_header, $v_string);
     3852          if ($v_result1 < 1) {
     3853            $this->privCloseFd();
     3854            $this->privSwapBackMagicQuotes();
     3855            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
     3856            return $v_result1;
     3857          }
     3858
     3859          // ----- Get the only interesting attributes
     3860          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
     3861          {
     3862            // ----- Close the zip file
     3863            $this->privCloseFd();
     3864            $this->privSwapBackMagicQuotes();
     3865
     3866            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3867            return $v_result;
     3868          }
     3869
     3870          // ----- Set the file content
     3871          $p_file_list[$v_nb_extracted]['content'] = $v_string;
     3872
     3873          // ----- Next extracted file
     3874          $v_nb_extracted++;
     3875         
     3876          // ----- Look for user callback abort
     3877          if ($v_result1 == 2) {
     3878            break;
     3879          }
     3880        }
     3881        // ----- Look for extraction in standard output
     3882        elseif (   (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
     3883                && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
     3884          // ----- Extracting the file in standard output
     3885          $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
     3886          if ($v_result1 < 1) {
     3887            $this->privCloseFd();
     3888            $this->privSwapBackMagicQuotes();
     3889            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
     3890            return $v_result1;
     3891          }
     3892
     3893          // ----- Get the only interesting attributes
     3894          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
     3895            $this->privCloseFd();
     3896            $this->privSwapBackMagicQuotes();
     3897            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3898            return $v_result;
     3899          }
     3900
     3901          // ----- Look for user callback abort
     3902          if ($v_result1 == 2) {
     3903            break;
     3904          }
     3905        }
     3906        // ----- Look for normal extraction
     3907        else {
     3908          // ----- Extracting the file
     3909          $v_result1 = $this->privExtractFile($v_header,
     3910                                              $p_path, $p_remove_path,
    34593911                                              $p_remove_all_path,
    34603912                                              $p_options);
    3461           if ($v_result1 < 1) {
    3462             $this->privCloseFd();
    3463             $this->privSwapBackMagicQuotes();
    3464             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
    3465             return $v_result1;
    3466           }
    3467 
    3468           // ----- Get the only interesting attributes
    3469           if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
    3470           {
    3471             // ----- Close the zip file
    3472             $this->privCloseFd();
    3473             $this->privSwapBackMagicQuotes();
    3474 
    3475             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3476             return $v_result;
    3477           }
    3478 
    3479           // ----- Look for user callback abort
    3480           if ($v_result1 == 2) {
    3481             break;
    3482           }
    3483         }
    3484       }
    3485     }
    3486 
    3487     // ----- Close the zip file
    3488     $this->privCloseFd();
    3489     $this->privSwapBackMagicQuotes();
    3490 
    3491     // ----- Return
    3492     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3493     return $v_result;
     3913          if ($v_result1 < 1) {
     3914            $this->privCloseFd();
     3915            $this->privSwapBackMagicQuotes();
     3916            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
     3917            return $v_result1;
     3918          }
     3919
     3920          // ----- Get the only interesting attributes
     3921          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
     3922          {
     3923            // ----- Close the zip file
     3924            $this->privCloseFd();
     3925            $this->privSwapBackMagicQuotes();
     3926
     3927            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3928            return $v_result;
     3929          }
     3930
     3931          // ----- Look for user callback abort
     3932          if ($v_result1 == 2) {
     3933            break;
     3934          }
     3935        }
     3936      }
     3937    }
     3938
     3939    // ----- Close the zip file
     3940    $this->privCloseFd();
     3941    $this->privSwapBackMagicQuotes();
     3942
     3943    // ----- Return
     3944    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3945    return $v_result;
    34943946  }
    34953947  // --------------------------------------------------------------------------------
     
    35063958  function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
    35073959  {
    3508     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFile', "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
    3509     $v_result=1;
    3510 
    3511     // ----- Read the file header
    3512     if (($v_result = $this->privReadFileHeader($v_header)) != 1)
    3513     {
    3514       // ----- Return
    3515       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3516       return $v_result;
    3517     }
    3518 
    3519     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
    3520 
    3521     // ----- Check that the file header is coherent with $p_entry info
    3522     if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
    3523         // TBC
    3524     }
    3525 
    3526     // ----- Look for all path to remove
    3527     if ($p_remove_all_path == true) {
    3528         // ----- Look for folder entry that not need to be extracted
    3529         if (($p_entry['external']&0x00000010)==0x00000010) {
    3530             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The entry is a folder : need to be filtered");
    3531 
    3532             $p_entry['status'] = "filtered";
    3533 
    3534             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3535             return $v_result;
    3536         }
    3537 
    3538         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "All path is removed");
    3539         // ----- Get the basename of the path
    3540         $p_entry['filename'] = basename($p_entry['filename']);
    3541     }
    3542 
    3543     // ----- Look for path to remove
    3544     else if ($p_remove_path != "")
    3545     {
    3546       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look for some path to remove");
    3547       if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)
    3548       {
    3549         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The folder is the same as the removed path '".$p_entry['filename']."'");
    3550 
    3551         // ----- Change the file status
    3552         $p_entry['status'] = "filtered";
    3553 
    3554         // ----- Return
    3555         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3556         return $v_result;
    3557       }
    3558 
    3559       $p_remove_path_size = strlen($p_remove_path);
    3560       if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
    3561       {
    3562         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '".$p_entry['filename']."'");
    3563 
    3564         // ----- Remove the path
    3565         $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
    3566 
    3567         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Resulting file is '".$p_entry['filename']."'");
    3568       }
    3569     }
    3570 
    3571     // ----- Add the path
    3572     if ($p_path != '') {
    3573       $p_entry['filename'] = $p_path."/".$p_entry['filename'];
    3574     }
    3575 
    3576     // ----- Check a base_dir_restriction
    3577     if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
    3578       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Check the extract directory restriction");
    3579       $v_inclusion
    3580       = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
    3581                                 $p_entry['filename']);
    3582       if ($v_inclusion == 0) {
    3583         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_EXTRACT_DIR_RESTRICTION is selected, file is outside restriction");
    3584 
    3585         PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
    3586                                 "Filename '".$p_entry['filename']."' is "
     3960    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFile', "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
     3961    $v_result=1;
     3962
     3963    // ----- Read the file header
     3964    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
     3965    {
     3966      // ----- Return
     3967      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3968      return $v_result;
     3969    }
     3970
     3971    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
     3972
     3973    // ----- Check that the file header is coherent with $p_entry info
     3974    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
     3975        // TBC
     3976    }
     3977
     3978    // ----- Look for all path to remove
     3979    if ($p_remove_all_path == true) {
     3980        // ----- Look for folder entry that not need to be extracted
     3981        if (($p_entry['external']&0x00000010)==0x00000010) {
     3982            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The entry is a folder : need to be filtered");
     3983
     3984            $p_entry['status'] = "filtered";
     3985
     3986            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     3987            return $v_result;
     3988        }
     3989
     3990        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "All path is removed");
     3991        // ----- Get the basename of the path
     3992        $p_entry['filename'] = basename($p_entry['filename']);
     3993    }
     3994
     3995    // ----- Look for path to remove
     3996    else if ($p_remove_path != "")
     3997    {
     3998      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look for some path to remove");
     3999      if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)
     4000      {
     4001        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The folder is the same as the removed path '".$p_entry['filename']."'");
     4002
     4003        // ----- Change the file status
     4004        $p_entry['status'] = "filtered";
     4005
     4006        // ----- Return
     4007        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4008        return $v_result;
     4009      }
     4010
     4011      $p_remove_path_size = strlen($p_remove_path);
     4012      if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
     4013      {
     4014        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '".$p_entry['filename']."'");
     4015
     4016        // ----- Remove the path
     4017        $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
     4018
     4019        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Resulting file is '".$p_entry['filename']."'");
     4020      }
     4021    }
     4022
     4023    // ----- Add the path
     4024    if ($p_path != '') {
     4025      $p_entry['filename'] = $p_path."/".$p_entry['filename'];
     4026    }
     4027   
     4028    // ----- Check a base_dir_restriction
     4029    if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
     4030      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Check the extract directory restriction");
     4031      $v_inclusion
     4032      = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
     4033                                $p_entry['filename']);
     4034      if ($v_inclusion == 0) {
     4035        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_EXTRACT_DIR_RESTRICTION is selected, file is outside restriction");
     4036
     4037        PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
     4038                                "Filename '".$p_entry['filename']."' is "
    35874039                                 ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");
    35884040
    3589         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3590         return PclZip::errorCode();
    3591       }
    3592     }
    3593 
    3594     // ----- Look for pre-extract callback
    3595     if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
    3596       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
    3597 
    3598       // ----- Generate a local information
    3599       $v_local_header = array();
    3600       $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
    3601 
    3602       // ----- Call the callback
    3603       // Here I do not use call_user_func() because I need to send a reference to the
    3604       // header.
    3605       eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
    3606       if ($v_result == 0) {
    3607         // ----- Change the file status
    3608         $p_entry['status'] = "skipped";
    3609         $v_result = 1;
    3610       }
    3611 
    3612       // ----- Look for abort result
    3613       if ($v_result == 2) {
    3614         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
    3615         // ----- This status is internal and will be changed in 'skipped'
    3616         $p_entry['status'] = "aborted";
    3617         $v_result = PCLZIP_ERR_USER_ABORTED;
    3618       }
    3619 
    3620       // ----- Update the informations
    3621       // Only some fields can be modified
    3622       $p_entry['filename'] = $v_local_header['filename'];
    3623       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
    3624     }
    3625 
    3626     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
    3627 
    3628     // ----- Look if extraction should be done
    3629     if ($p_entry['status'] == 'ok') {
    3630 
    3631     // ----- Look for specific actions while the file exist
    3632     if (file_exists($p_entry['filename']))
    3633     {
    3634       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_entry['filename']."' already exists");
    3635 
    3636       // ----- Look if file is a directory
    3637       if (is_dir($p_entry['filename']))
    3638       {
    3639         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is a directory");
    3640 
    3641         // ----- Change the file status
    3642         $p_entry['status'] = "already_a_directory";
    3643 
    3644         // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
    3645         // For historical reason first PclZip implementation does not stop
    3646         // when this kind of error occurs.
    3647         if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
    3648             && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
    3649             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
    3650 
    3651             PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,
    3652                                 "Filename '".$p_entry['filename']."' is "
     4041        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4042        return PclZip::errorCode();
     4043      }
     4044    }
     4045
     4046    // ----- Look for pre-extract callback
     4047    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
     4048      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
     4049
     4050      // ----- Generate a local information
     4051      $v_local_header = array();
     4052      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
     4053
     4054      // ----- Call the callback
     4055      // Here I do not use call_user_func() because I need to send a reference to the
     4056      // header.
     4057      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
     4058      if ($v_result == 0) {
     4059        // ----- Change the file status
     4060        $p_entry['status'] = "skipped";
     4061        $v_result = 1;
     4062      }
     4063     
     4064      // ----- Look for abort result
     4065      if ($v_result == 2) {
     4066        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
     4067        // ----- This status is internal and will be changed in 'skipped'
     4068        $p_entry['status'] = "aborted";
     4069        $v_result = PCLZIP_ERR_USER_ABORTED;
     4070      }
     4071
     4072      // ----- Update the informations
     4073      // Only some fields can be modified
     4074      $p_entry['filename'] = $v_local_header['filename'];
     4075      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
     4076    }
     4077
     4078    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
     4079
     4080    // ----- Look if extraction should be done
     4081    if ($p_entry['status'] == 'ok') {
     4082
     4083    // ----- Look for specific actions while the file exist
     4084    if (file_exists($p_entry['filename']))
     4085    {
     4086      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_entry['filename']."' already exists");
     4087
     4088      // ----- Look if file is a directory
     4089      if (is_dir($p_entry['filename']))
     4090      {
     4091        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is a directory");
     4092
     4093        // ----- Change the file status
     4094        $p_entry['status'] = "already_a_directory";
     4095       
     4096        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
     4097        // For historical reason first PclZip implementation does not stop
     4098        // when this kind of error occurs.
     4099        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
     4100            && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
     4101            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
     4102
     4103            PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,
     4104                                "Filename '".$p_entry['filename']."' is "
    36534105                                 ."already used by an existing directory");
    36544106
    3655             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3656             return PclZip::errorCode();
    3657         }
    3658       }
    3659       // ----- Look if file is write protected
    3660       else if (!is_writeable($p_entry['filename']))
    3661       {
    3662         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is write protected");
    3663 
    3664         // ----- Change the file status
    3665         $p_entry['status'] = "write_protected";
    3666 
    3667         // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
    3668         // For historical reason first PclZip implementation does not stop
    3669         // when this kind of error occurs.
    3670         if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
    3671             && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
    3672             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
    3673 
    3674             PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
    3675                                 "Filename '".$p_entry['filename']."' exists "
     4107            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4108            return PclZip::errorCode();
     4109            }
     4110      }
     4111      // ----- Look if file is write protected
     4112      else if (!is_writeable($p_entry['filename']))
     4113      {
     4114        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is write protected");
     4115
     4116        // ----- Change the file status
     4117        $p_entry['status'] = "write_protected";
     4118
     4119        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
     4120        // For historical reason first PclZip implementation does not stop
     4121        // when this kind of error occurs.
     4122        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
     4123            && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
     4124            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
     4125
     4126            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
     4127                                "Filename '".$p_entry['filename']."' exists "
    36764128                                 ."and is write protected");
    36774129
    3678             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3679             return PclZip::errorCode();
    3680         }
    3681       }
    3682 
    3683       // ----- Look if the extracted file is older
    3684       else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
    3685       {
    3686         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is newer (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")");
    3687         // ----- Change the file status
    3688         if (   (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))
    3689             && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {
    3690             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_REPLACE_NEWER is selected, file will be replaced");
     4130            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4131            return PclZip::errorCode();
     4132            }
     4133      }
     4134
     4135      // ----- Look if the extracted file is older
     4136      else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
     4137      {
     4138        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is newer (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")");
     4139        // ----- Change the file status
     4140        if (   (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))
     4141            && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {
     4142            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_REPLACE_NEWER is selected, file will be replaced");
     4143          }
     4144            else {
     4145            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be replaced");
     4146            $p_entry['status'] = "newer_exist";
     4147
     4148            // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
     4149            // For historical reason first PclZip implementation does not stop
     4150            // when this kind of error occurs.
     4151            if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
     4152                && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
     4153                //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
     4154
     4155                PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
     4156                         "Newer version of '".$p_entry['filename']."' exists "
     4157                        ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");
     4158
     4159                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4160                return PclZip::errorCode();
     4161              }
     4162            }
     4163      }
     4164      else {
     4165        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is older than the extrated one - will be replaced by the extracted one (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")");
     4166      }
     4167    }
     4168
     4169    // ----- Check the directory availability and create it if necessary
     4170    else {
     4171      if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
     4172        $v_dir_to_check = $p_entry['filename'];
     4173      else if (!strstr($p_entry['filename'], "/"))
     4174        $v_dir_to_check = "";
     4175      else
     4176        $v_dir_to_check = dirname($p_entry['filename']);
     4177
     4178        if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
     4179          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '".$p_entry['filename']."'");
     4180 
     4181          // ----- Change the file status
     4182          $p_entry['status'] = "path_creation_fail";
     4183 
     4184          // ----- Return
     4185          ////--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4186          //return $v_result;
     4187          $v_result = 1;
     4188        }
     4189      }
     4190    }
     4191
     4192    // ----- Look if extraction should be done
     4193    if ($p_entry['status'] == 'ok') {
     4194
     4195      // ----- Do the extraction (if not a folder)
     4196      if (!(($p_entry['external']&0x00000010)==0x00000010))
     4197      {
     4198        // ----- Look for not compressed file
     4199        if ($p_entry['compression'] == 0) {
     4200          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
     4201
     4202          // ----- Opening destination file
     4203          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
     4204          {
     4205            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
     4206
     4207            // ----- Change the file status
     4208            $p_entry['status'] = "write_error";
     4209
     4210            // ----- Return
     4211            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4212            return $v_result;
     4213          }
     4214
     4215          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read '".$p_entry['size']."' bytes");
     4216
     4217          // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
     4218          $v_size = $p_entry['compressed_size'];
     4219          while ($v_size != 0)
     4220          {
     4221            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     4222            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes");
     4223            $v_buffer = @fread($this->zip_fd, $v_read_size);
     4224            /* Try to speed up the code
     4225            $v_binary_data = pack('a'.$v_read_size, $v_buffer);
     4226            @fwrite($v_dest_file, $v_binary_data, $v_read_size);
     4227            */
     4228            @fwrite($v_dest_file, $v_buffer, $v_read_size);         
     4229            $v_size -= $v_read_size;
     4230          }
     4231
     4232          // ----- Closing the destination file
     4233          fclose($v_dest_file);
     4234
     4235          // ----- Change the file mtime
     4236          touch($p_entry['filename'], $p_entry['mtime']);
     4237         
     4238
    36914239        }
    36924240        else {
    3693             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be replaced");
    3694             $p_entry['status'] = "newer_exist";
    3695 
    3696             // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
    3697             // For historical reason first PclZip implementation does not stop
    3698             // when this kind of error occurs.
    3699             if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
    3700                 && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
    3701                 //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
    3702 
    3703                 PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
    3704                          "Newer version of '".$p_entry['filename']."' exists "
    3705                         ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");
    3706 
    3707                 //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    3708                 return PclZip::errorCode();
    3709             }
    3710         }
    3711       }
    3712       else {
    3713         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is older than the extrated one - will be replaced by the extracted one (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")");
    3714       }
    3715     }
    3716 
    3717     // ----- Check the directory availability and create it if necessary
    3718     else {
    3719       if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
    3720         $v_dir_to_check = $p_entry['filename'];
    3721       else if (!strstr($p_entry['filename'], "/"))
    3722         $v_dir_to_check = "";
    3723       else
    3724         $v_dir_to_check = dirname($p_entry['filename']);
    3725 
    3726       if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
    3727         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '".$p_entry['filename']."'");
    3728 
    3729         // ----- Change the file status
    3730         $p_entry['status'] = "path_creation_fail";
    3731 
    3732         // ----- Return
    3733         ////--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3734         //return $v_result;
    3735         $v_result = 1;
    3736       }
    3737     }
    3738     }
    3739 
    3740     // ----- Look if extraction should be done
    3741     if ($p_entry['status'] == 'ok') {
    3742 
    3743       // ----- Do the extraction (if not a folder)
    3744       if (!(($p_entry['external']&0x00000010)==0x00000010))
    3745       {
    3746         // ----- Look for not compressed file
    3747         if ($p_entry['compression'] == 0) {
    3748           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
    3749 
     4241          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (Compression method ".$p_entry['compression'].")");
     4242          // ----- TBC
     4243          // Need to be finished
     4244          if (($p_entry['flag'] & 1) == 1) {
     4245              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File is encrypted");
     4246            /*
     4247              // ----- Read the encryption header
     4248              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read 12 encryption header bytes");
     4249              $v_encryption_header = @fread($this->zip_fd, 12);
     4250             
     4251              // ----- Read the encrypted & compressed file in a buffer
     4252              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".($p_entry['compressed_size']-12)."' compressed & encrypted bytes");
     4253              $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']-12);
     4254             
     4255              // ----- Decrypt the buffer
     4256              $this->privDecrypt($v_encryption_header, $v_buffer,
     4257                                 $p_entry['compressed_size']-12, $p_entry['crc']);
     4258              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Buffer is '".$v_buffer."'");
     4259              */
     4260          }
     4261          else {
     4262              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".$p_entry['compressed_size']."' compressed bytes");
     4263              // ----- Read the compressed file in a buffer (one shot)
     4264              $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
     4265          }
     4266         
     4267          // ----- Decompress the file
     4268          $v_file_content = @gzinflate($v_buffer);
     4269          unset($v_buffer);
     4270          if ($v_file_content === FALSE) {
     4271            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to inflate compressed file");
     4272
     4273            // ----- Change the file status
     4274            // TBC
     4275            $p_entry['status'] = "error";
     4276           
     4277            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4278            return $v_result;
     4279          }
     4280         
    37504281          // ----- Opening destination file
    3751           if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
    3752           {
    3753             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
    3754 
    3755             // ----- Change the file status
    3756             $p_entry['status'] = "write_error";
    3757 
    3758             // ----- Return
    3759             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3760             return $v_result;
    3761           }
    3762 
    3763           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read '".$p_entry['size']."' bytes");
    3764 
    3765           // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
    3766           $v_size = $p_entry['compressed_size'];
    3767           while ($v_size != 0)
    3768           {
    3769             $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    3770             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes");
    3771             $v_buffer = @fread($this->zip_fd, $v_read_size);
    3772             /* Try to speed up the code
    3773             $v_binary_data = pack('a'.$v_read_size, $v_buffer);
    3774             @fwrite($v_dest_file, $v_binary_data, $v_read_size);
    3775             */
    3776             @fwrite($v_dest_file, $v_buffer, $v_read_size);
    3777             $v_size -= $v_read_size;
    3778           }
    3779 
    3780           // ----- Closing the destination file
    3781           fclose($v_dest_file);
    3782 
    3783           // ----- Change the file mtime
    3784           touch($p_entry['filename'], $p_entry['mtime']);
    3785 
    3786 
    3787         }
    3788         else {
    3789           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (Compression method ".$p_entry['compression'].")");
    3790           // ----- TBC
    3791           // Need to be finished
    3792           if (($p_entry['flag'] & 1) == 1) {
    3793               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File is encrypted");
    3794             /*
    3795               // ----- Read the encryption header
    3796               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read 12 encryption header bytes");
    3797               $v_encryption_header = @fread($this->zip_fd, 12);
    3798 
    3799               // ----- Read the encrypted & compressed file in a buffer
    3800               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".($p_entry['compressed_size']-12)."' compressed & encrypted bytes");
    3801               $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']-12);
    3802 
    3803               // ----- Decrypt the buffer
    3804               $this->privDecrypt($v_encryption_header, $v_buffer,
    3805                                  $p_entry['compressed_size']-12, $p_entry['crc']);
    3806               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Buffer is '".$v_buffer."'");
    3807               */
    3808           }
    3809           else {
    3810               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".$p_entry['compressed_size']."' compressed bytes");
    3811               // ----- Read the compressed file in a buffer (one shot)
    3812               $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
    3813           }
    3814 
    3815           // ----- Decompress the file
    3816           $v_file_content = @gzinflate($v_buffer);
    3817           unset($v_buffer);
    3818           if ($v_file_content === FALSE) {
    3819             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to inflate compressed file");
    3820 
    3821             // ----- Change the file status
    3822             // TBC
    3823             $p_entry['status'] = "error";
    3824 
    3825             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3826             return $v_result;
    3827           }
    3828 
    3829           // ----- Opening destination file
    3830           if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
    3831             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
    3832 
    3833             // ----- Change the file status
    3834             $p_entry['status'] = "write_error";
    3835 
    3836             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3837             return $v_result;
    3838           }
    3839 
    3840           // ----- Write the uncompressed data
    3841           @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
    3842           unset($v_file_content);
    3843 
    3844           // ----- Closing the destination file
    3845           @fclose($v_dest_file);
    3846 
    3847           // ----- Change the file mtime
    3848           @touch($p_entry['filename'], $p_entry['mtime']);
    3849         }
    3850 
    3851         // ----- Look for chmod option
    3852         if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {
    3853           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "chmod option activated '".$p_options[PCLZIP_OPT_SET_CHMOD]."'");
    3854 
    3855           // ----- Change the mode of the file
    3856           @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);
    3857         }
    3858 
    3859         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
    3860       }
    3861     }
     4282          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
     4283            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
     4284
     4285            // ----- Change the file status
     4286            $p_entry['status'] = "write_error";
     4287
     4288            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4289            return $v_result;
     4290          }
     4291
     4292          // ----- Write the uncompressed data
     4293          @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
     4294          unset($v_file_content);
     4295
     4296          // ----- Closing the destination file
     4297          @fclose($v_dest_file);
     4298
     4299          // ----- Change the file mtime
     4300          @touch($p_entry['filename'], $p_entry['mtime']);
     4301        }
     4302
     4303        // ----- Look for chmod option
     4304        if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {
     4305          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "chmod option activated '".$p_options[PCLZIP_OPT_SET_CHMOD]."'");
     4306
     4307          // ----- Change the mode of the file
     4308          @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);
     4309        }
     4310
     4311        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
     4312      }
     4313    }
    38624314
    38634315    // ----- Change abort status
    38644316    if ($p_entry['status'] == "aborted") {
    3865       $p_entry['status'] = "skipped";
    3866     }
    3867 
    3868     // ----- Look for post-extract callback
    3869     elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
    3870       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
    3871 
    3872       // ----- Generate a local information
    3873       $v_local_header = array();
    3874       $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
    3875 
    3876       // ----- Call the callback
    3877       // Here I do not use call_user_func() because I need to send a reference to the
    3878       // header.
    3879       eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
    3880 
    3881       // ----- Look for abort result
    3882       if ($v_result == 2) {
    3883         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
    3884         $v_result = PCLZIP_ERR_USER_ABORTED;
    3885       }
    3886     }
    3887 
    3888     // ----- Return
    3889     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3890     return $v_result;
     4317      $p_entry['status'] = "skipped";
     4318    }
     4319   
     4320    // ----- Look for post-extract callback
     4321    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
     4322      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
     4323
     4324      // ----- Generate a local information
     4325      $v_local_header = array();
     4326      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
     4327
     4328      // ----- Call the callback
     4329      // Here I do not use call_user_func() because I need to send a reference to the
     4330      // header.
     4331      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
     4332
     4333      // ----- Look for abort result
     4334      if ($v_result == 2) {
     4335        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
     4336        $v_result = PCLZIP_ERR_USER_ABORTED;
     4337      }
     4338    }
     4339
     4340    // ----- Return
     4341    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4342    return $v_result;
    38914343  }
    38924344  // --------------------------------------------------------------------------------
     
    39004352  function privExtractFileInOutput(&$p_entry, &$p_options)
    39014353  {
    3902     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileInOutput', "");
    3903     $v_result=1;
    3904 
    3905     // ----- Read the file header
    3906     if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
    3907       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    3908       return $v_result;
    3909     }
    3910 
    3911     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
    3912 
    3913     // ----- Check that the file header is coherent with $p_entry info
    3914     if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
    3915         // TBC
    3916     }
    3917 
    3918     // ----- Look for pre-extract callback
    3919     if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
    3920       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
    3921 
    3922       // ----- Generate a local information
    3923       $v_local_header = array();
    3924       $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
    3925 
    3926       // ----- Call the callback
    3927       // Here I do not use call_user_func() because I need to send a reference to the
    3928       // header.
    3929       eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
    3930       if ($v_result == 0) {
    3931         // ----- Change the file status
    3932         $p_entry['status'] = "skipped";
    3933         $v_result = 1;
    3934       }
    3935 
    3936       // ----- Look for abort result
    3937       if ($v_result == 2) {
    3938         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
    3939         // ----- This status is internal and will be changed in 'skipped'
    3940         $p_entry['status'] = "aborted";
    3941         $v_result = PCLZIP_ERR_USER_ABORTED;
    3942       }
    3943 
    3944       // ----- Update the informations
    3945       // Only some fields can be modified
    3946       $p_entry['filename'] = $v_local_header['filename'];
    3947       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
    3948     }
    3949 
    3950     // ----- Trace
    3951     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
    3952 
    3953     // ----- Look if extraction should be done
    3954     if ($p_entry['status'] == 'ok') {
    3955 
    3956       // ----- Do the extraction (if not a folder)
    3957       if (!(($p_entry['external']&0x00000010)==0x00000010)) {
    3958         // ----- Look for not compressed file
    3959         if ($p_entry['compressed_size'] == $p_entry['size']) {
    3960           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
    3961           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
    3962 
    3963           // ----- Read the file in a buffer (one shot)
    3964           $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
    3965 
    3966           // ----- Send the file to the output
    3967           echo $v_buffer;
    3968           unset($v_buffer);
    3969         }
    3970         else {
    3971           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file");
    3972           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Reading '".$p_entry['size']."' bytes");
    3973 
    3974           // ----- Read the compressed file in a buffer (one shot)
    3975           $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
    3976 
    3977           // ----- Decompress the file
    3978           $v_file_content = gzinflate($v_buffer);
    3979           unset($v_buffer);
    3980 
    3981           // ----- Send the file to the output
    3982           echo $v_file_content;
    3983           unset($v_file_content);
    3984         }
    3985         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
    3986       }
    3987     }
     4354    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileInOutput', "");
     4355    $v_result=1;
     4356
     4357    // ----- Read the file header
     4358    if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
     4359      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4360      return $v_result;
     4361    }
     4362
     4363    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
     4364
     4365    // ----- Check that the file header is coherent with $p_entry info
     4366    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
     4367        // TBC
     4368    }
     4369
     4370    // ----- Look for pre-extract callback
     4371    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
     4372      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
     4373
     4374      // ----- Generate a local information
     4375      $v_local_header = array();
     4376      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
     4377
     4378      // ----- Call the callback
     4379      // Here I do not use call_user_func() because I need to send a reference to the
     4380      // header.
     4381      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
     4382      if ($v_result == 0) {
     4383        // ----- Change the file status
     4384        $p_entry['status'] = "skipped";
     4385        $v_result = 1;
     4386      }
     4387
     4388      // ----- Look for abort result
     4389      if ($v_result == 2) {
     4390        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
     4391        // ----- This status is internal and will be changed in 'skipped'
     4392        $p_entry['status'] = "aborted";
     4393        $v_result = PCLZIP_ERR_USER_ABORTED;
     4394      }
     4395
     4396      // ----- Update the informations
     4397      // Only some fields can be modified
     4398      $p_entry['filename'] = $v_local_header['filename'];
     4399      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
     4400    }
     4401
     4402    // ----- Trace
     4403    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
     4404
     4405    // ----- Look if extraction should be done
     4406    if ($p_entry['status'] == 'ok') {
     4407
     4408      // ----- Do the extraction (if not a folder)
     4409      if (!(($p_entry['external']&0x00000010)==0x00000010)) {
     4410        // ----- Look for not compressed file
     4411        if ($p_entry['compressed_size'] == $p_entry['size']) {
     4412          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
     4413          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
     4414
     4415          // ----- Read the file in a buffer (one shot)
     4416          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
     4417
     4418          // ----- Send the file to the output
     4419          echo $v_buffer;
     4420          unset($v_buffer);
     4421        }
     4422        else {
     4423          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file");
     4424          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Reading '".$p_entry['size']."' bytes");
     4425
     4426          // ----- Read the compressed file in a buffer (one shot)
     4427          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
     4428         
     4429          // ----- Decompress the file
     4430          $v_file_content = gzinflate($v_buffer);
     4431          unset($v_buffer);
     4432
     4433          // ----- Send the file to the output
     4434          echo $v_file_content;
     4435          unset($v_file_content);
     4436        }
     4437        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
     4438      }
     4439    }
    39884440
    39894441    // ----- Change abort status
    39904442    if ($p_entry['status'] == "aborted") {
    3991       $p_entry['status'] = "skipped";
    3992     }
    3993 
    3994     // ----- Look for post-extract callback
    3995     elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
    3996       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
    3997 
    3998       // ----- Generate a local information
    3999       $v_local_header = array();
    4000       $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
    4001 
    4002       // ----- Call the callback
    4003       // Here I do not use call_user_func() because I need to send a reference to the
    4004       // header.
    4005       eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
    4006 
    4007       // ----- Look for abort result
    4008       if ($v_result == 2) {
    4009         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
    4010         $v_result = PCLZIP_ERR_USER_ABORTED;
    4011       }
    4012     }
    4013 
    4014     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4015     return $v_result;
     4443      $p_entry['status'] = "skipped";
     4444    }
     4445
     4446    // ----- Look for post-extract callback
     4447    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
     4448      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
     4449
     4450      // ----- Generate a local information
     4451      $v_local_header = array();
     4452      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
     4453
     4454      // ----- Call the callback
     4455      // Here I do not use call_user_func() because I need to send a reference to the
     4456      // header.
     4457      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
     4458
     4459      // ----- Look for abort result
     4460      if ($v_result == 2) {
     4461        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
     4462        $v_result = PCLZIP_ERR_USER_ABORTED;
     4463      }
     4464    }
     4465
     4466    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4467    return $v_result;
    40164468  }
    40174469  // --------------------------------------------------------------------------------
     
    40254477  function privExtractFileAsString(&$p_entry, &$p_string)
    40264478  {
    4027     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileAsString', "p_entry['filename']='".$p_entry['filename']."'");
    4028     $v_result=1;
    4029 
    4030     // ----- Read the file header
    4031     $v_header = array();
    4032     if (($v_result = $this->privReadFileHeader($v_header)) != 1)
    4033     {
    4034       // ----- Return
    4035       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4036       return $v_result;
    4037     }
    4038 
    4039     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
    4040 
    4041     // ----- Check that the file header is coherent with $p_entry info
    4042     if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
    4043         // TBC
    4044     }
    4045 
    4046     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file in string (with path) '".$p_entry['filename']."', size '$v_header[size]'");
    4047 
    4048     // ----- Do the extraction (if not a folder)
    4049     if (!(($p_entry['external']&0x00000010)==0x00000010))
    4050     {
    4051       // ----- Look for not compressed file
    4052 //      if ($p_entry['compressed_size'] == $p_entry['size'])
    4053       if ($p_entry['compression'] == 0) {
    4054         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
    4055         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
    4056 
    4057         // ----- Reading the file
    4058         $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
    4059       }
    4060       else {
    4061         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (compression method '".$p_entry['compression']."')");
    4062 
    4063         // ----- Reading the file
    4064         $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
    4065 
    4066         // ----- Decompress the file
    4067         if (($p_string = @gzinflate($v_data)) === FALSE) {
    4068             // TBC
    4069         }
    4070       }
    4071 
    4072       // ----- Trace
    4073       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
    4074     }
    4075     else {
    4076         // TBC : error : can not extract a folder in a string
    4077     }
    4078 
    4079     // ----- Return
    4080     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4081     return $v_result;
     4479    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileAsString', "p_entry['filename']='".$p_entry['filename']."'");
     4480    $v_result=1;
     4481
     4482    // ----- Read the file header
     4483    $v_header = array();
     4484    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
     4485    {
     4486      // ----- Return
     4487      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4488      return $v_result;
     4489    }
     4490
     4491    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
     4492
     4493    // ----- Check that the file header is coherent with $p_entry info
     4494    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
     4495        // TBC
     4496    }
     4497
     4498    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file in string (with path) '".$p_entry['filename']."', size '$v_header[size]'");
     4499
     4500    // ----- Do the extraction (if not a folder)
     4501    if (!(($p_entry['external']&0x00000010)==0x00000010))
     4502    {
     4503      // ----- Look for not compressed file
     4504//    if ($p_entry['compressed_size'] == $p_entry['size'])
     4505      if ($p_entry['compression'] == 0) {
     4506        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
     4507        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
     4508
     4509        // ----- Reading the file
     4510        $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
     4511      }
     4512      else {
     4513        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (compression method '".$p_entry['compression']."')");
     4514
     4515        // ----- Reading the file
     4516        $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
     4517       
     4518        // ----- Decompress the file
     4519        if (($p_string = @gzinflate($v_data)) === FALSE) {
     4520            // TBC
     4521        }
     4522      }
     4523
     4524      // ----- Trace
     4525      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
     4526    }
     4527    else {
     4528        // TBC : error : can not extract a folder in a string
     4529    }
     4530
     4531    // ----- Return
     4532    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4533    return $v_result;
    40824534  }
    40834535  // --------------------------------------------------------------------------------
     
    40914543  function privReadFileHeader(&$p_header)
    40924544  {
    4093     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadFileHeader", "");
    4094     $v_result=1;
    4095 
    4096     // ----- Read the 4 bytes signature
    4097     $v_binary_data = @fread($this->zip_fd, 4);
    4098     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
    4099     $v_data = unpack('Vid', $v_binary_data);
    4100     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
    4101 
    4102     // ----- Check signature
    4103     if ($v_data['id'] != 0x04034b50)
    4104     {
    4105       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid File header");
    4106 
    4107       // ----- Error log
    4108       PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
    4109 
    4110       // ----- Return
    4111       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4112       return PclZip::errorCode();
    4113     }
    4114 
    4115     // ----- Read the first 42 bytes of the header
    4116     $v_binary_data = fread($this->zip_fd, 26);
    4117 
    4118     // ----- Look for invalid block size
    4119     if (strlen($v_binary_data) != 26)
    4120     {
    4121       $p_header['filename'] = "";
    4122       $p_header['status'] = "invalid_header";
    4123       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
    4124 
    4125       // ----- Error log
    4126       PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
    4127 
    4128       // ----- Return
    4129       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4130       return PclZip::errorCode();
    4131     }
    4132 
    4133     // ----- Extract the values
    4134     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header : '".$v_binary_data."'");
    4135     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header (Hex) : '".bin2hex($v_binary_data)."'");
    4136     $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
    4137 
    4138     // ----- Get filename
    4139     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "File name length : ".$v_data['filename_len']);
    4140     $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);
    4141     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename : \''.$p_header['filename'].'\'');
    4142 
    4143     // ----- Get extra_fields
    4144     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extra field length : ".$v_data['extra_len']);
    4145     if ($v_data['extra_len'] != 0) {
    4146       $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
    4147     }
    4148     else {
    4149       $p_header['extra'] = '';
    4150     }
    4151     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Extra field : \''.bin2hex($p_header['extra']).'\'');
    4152 
    4153     // ----- Extract properties
    4154     $p_header['version_extracted'] = $v_data['version'];
    4155     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : ('.$p_header['version_extracted'].') \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
    4156     $p_header['compression'] = $v_data['compression'];
    4157     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compression method : \''.$p_header['compression'].'\'');
    4158     $p_header['size'] = $v_data['size'];
    4159     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_header['size'].'\'');
    4160     $p_header['compressed_size'] = $v_data['compressed_size'];
    4161     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
    4162     $p_header['crc'] = $v_data['crc'];
    4163     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
    4164     $p_header['flag'] = $v_data['flag'];
    4165     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag : \''.$p_header['flag'].'\'');
    4166     $p_header['filename_len'] = $v_data['filename_len'];
    4167     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename_len : \''.$p_header['filename_len'].'\'');
    4168 
    4169     // ----- Recuperate date in UNIX format
    4170     $p_header['mdate'] = $v_data['mdate'];
    4171     $p_header['mtime'] = $v_data['mtime'];
    4172     if ($p_header['mdate'] && $p_header['mtime'])
    4173     {
    4174       // ----- Extract time
    4175       $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
    4176       $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
    4177       $v_seconde = ($p_header['mtime'] & 0x001F)*2;
    4178 
    4179       // ----- Extract date
    4180       $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
    4181       $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
    4182       $v_day = $p_header['mdate'] & 0x001F;
    4183 
    4184       // ----- Get UNIX date format
    4185       $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
    4186 
    4187       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
    4188     }
    4189     else
    4190     {
    4191       $p_header['mtime'] = time();
    4192       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
    4193     }
    4194 
    4195     // TBC
    4196     //for(reset($v_data); $key = key($v_data); next($v_data)) {
    4197     //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Attribut[$key] = ".$v_data[$key]);
    4198     //}
    4199 
    4200     // ----- Set the stored filename
    4201     $p_header['stored_filename'] = $p_header['filename'];
    4202 
    4203     // ----- Set the status field
    4204     $p_header['status'] = "ok";
    4205 
    4206     // ----- Return
    4207     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4208     return $v_result;
     4545    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadFileHeader", "");
     4546    $v_result=1;
     4547
     4548    // ----- Read the 4 bytes signature
     4549    $v_binary_data = @fread($this->zip_fd, 4);
     4550    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
     4551    $v_data = unpack('Vid', $v_binary_data);
     4552    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
     4553
     4554    // ----- Check signature
     4555    if ($v_data['id'] != 0x04034b50)
     4556    {
     4557      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid File header");
     4558
     4559      // ----- Error log
     4560      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
     4561
     4562      // ----- Return
     4563      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4564      return PclZip::errorCode();
     4565    }
     4566
     4567    // ----- Read the first 42 bytes of the header
     4568    $v_binary_data = fread($this->zip_fd, 26);
     4569
     4570    // ----- Look for invalid block size
     4571    if (strlen($v_binary_data) != 26)
     4572    {
     4573      $p_header['filename'] = "";
     4574      $p_header['status'] = "invalid_header";
     4575      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
     4576
     4577      // ----- Error log
     4578      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
     4579
     4580      // ----- Return
     4581      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4582      return PclZip::errorCode();
     4583    }
     4584
     4585    // ----- Extract the values
     4586    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header : '".$v_binary_data."'");
     4587    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header (Hex) : '".bin2hex($v_binary_data)."'");
     4588    $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
     4589
     4590    // ----- Get filename
     4591    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "File name length : ".$v_data['filename_len']);
     4592    $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);
     4593    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename : \''.$p_header['filename'].'\'');
     4594
     4595    // ----- Get extra_fields
     4596    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extra field length : ".$v_data['extra_len']);
     4597    if ($v_data['extra_len'] != 0) {
     4598      $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
     4599    }
     4600    else {
     4601      $p_header['extra'] = '';
     4602    }
     4603    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Extra field : \''.bin2hex($p_header['extra']).'\'');
     4604
     4605    // ----- Extract properties
     4606    $p_header['version_extracted'] = $v_data['version'];
     4607    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : ('.$p_header['version_extracted'].') \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
     4608    $p_header['compression'] = $v_data['compression'];
     4609    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compression method : \''.$p_header['compression'].'\'');
     4610    $p_header['size'] = $v_data['size'];
     4611    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_header['size'].'\'');
     4612    $p_header['compressed_size'] = $v_data['compressed_size'];
     4613    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
     4614    $p_header['crc'] = $v_data['crc'];
     4615    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
     4616    $p_header['flag'] = $v_data['flag'];
     4617    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag : \''.$p_header['flag'].'\'');
     4618    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag bit 11 (from right) : \''.($p_header['flag']&0x0400).'\'');
     4619    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag bit 11 (from left) : \''.($p_header['flag']&0x0020).'\'');
     4620    $p_header['filename_len'] = $v_data['filename_len'];
     4621    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename_len : \''.$p_header['filename_len'].'\'');
     4622
     4623    // ----- Recuperate date in UNIX format
     4624    $p_header['mdate'] = $v_data['mdate'];
     4625    $p_header['mtime'] = $v_data['mtime'];
     4626    if ($p_header['mdate'] && $p_header['mtime'])
     4627    {
     4628      // ----- Extract time
     4629      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
     4630      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
     4631      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
     4632
     4633      // ----- Extract date
     4634      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
     4635      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
     4636      $v_day = $p_header['mdate'] & 0x001F;
     4637
     4638      // ----- Get UNIX date format
     4639      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
     4640
     4641      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
     4642    }
     4643    else
     4644    {
     4645      $p_header['mtime'] = time();
     4646      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
     4647    }
     4648
     4649    // TBC
     4650    //for(reset($v_data); $key = key($v_data); next($v_data)) {
     4651    //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Attribut[$key] = ".$v_data[$key]);
     4652    //}
     4653
     4654    // ----- Set the stored filename
     4655    $p_header['stored_filename'] = $p_header['filename'];
     4656
     4657    // ----- Set the status field
     4658    $p_header['status'] = "ok";
     4659
     4660    // ----- Return
     4661    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4662    return $v_result;
    42094663  }
    42104664  // --------------------------------------------------------------------------------
     
    42184672  function privReadCentralFileHeader(&$p_header)
    42194673  {
    4220     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadCentralFileHeader", "");
    4221     $v_result=1;
    4222 
    4223     // ----- Read the 4 bytes signature
    4224     $v_binary_data = @fread($this->zip_fd, 4);
    4225     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
    4226     $v_data = unpack('Vid', $v_binary_data);
    4227     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
    4228 
    4229     // ----- Check signature
    4230     if ($v_data['id'] != 0x02014b50)
    4231     {
    4232       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid Central Dir File signature");
    4233 
    4234       // ----- Error log
    4235       PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
    4236 
    4237       // ----- Return
    4238       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4239       return PclZip::errorCode();
    4240     }
    4241 
    4242     // ----- Read the first 42 bytes of the header
    4243     $v_binary_data = fread($this->zip_fd, 42);
    4244 
    4245     // ----- Look for invalid block size
    4246     if (strlen($v_binary_data) != 42)
    4247     {
    4248       $p_header['filename'] = "";
    4249       $p_header['status'] = "invalid_header";
    4250       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
    4251 
    4252       // ----- Error log
    4253       PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
    4254 
    4255       // ----- Return
    4256       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4257       return PclZip::errorCode();
    4258     }
    4259 
    4260     // ----- Extract the values
    4261     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header : '".$v_binary_data."'");
    4262     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header (Hex) : '".bin2hex($v_binary_data)."'");
    4263     $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);
    4264 
    4265     // ----- Get filename
    4266     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']);
    4267     if ($p_header['filename_len'] != 0)
    4268       $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
    4269     else
    4270       $p_header['filename'] = '';
    4271     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Filename : \''.$p_header['filename'].'\'');
    4272 
    4273     // ----- Get extra
    4274     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Extra length : ".$p_header['extra_len']);
    4275     if ($p_header['extra_len'] != 0)
    4276       $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
    4277     else
    4278       $p_header['extra'] = '';
    4279     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Extra : \''.$p_header['extra'].'\'');
    4280 
    4281     // ----- Get comment
    4282     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Comment length : ".$p_header['comment_len']);
    4283     if ($p_header['comment_len'] != 0)
    4284       $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
    4285     else
    4286       $p_header['comment'] = '';
    4287     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Comment : \''.$p_header['comment'].'\'');
    4288 
    4289     // ----- Extract properties
    4290     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version : \''.($p_header['version']/10).'.'.($p_header['version']%10).'\'');
    4291     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
    4292     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Size : \''.$p_header['size'].'\'');
    4293     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
    4294     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
    4295     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Flag : \''.$p_header['flag'].'\'');
    4296     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Offset : \''.$p_header['offset'].'\'');
    4297 
    4298     // ----- Recuperate date in UNIX format
    4299     if ($p_header['mdate'] && $p_header['mtime'])
    4300     {
    4301       // ----- Extract time
    4302       $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
    4303       $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
    4304       $v_seconde = ($p_header['mtime'] & 0x001F)*2;
    4305 
    4306       // ----- Extract date
    4307       $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
    4308       $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
    4309       $v_day = $p_header['mdate'] & 0x001F;
    4310 
    4311       // ----- Get UNIX date format
    4312       $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
    4313 
    4314       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
    4315     }
    4316     else
    4317     {
    4318       $p_header['mtime'] = time();
    4319       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
    4320     }
    4321 
    4322     // ----- Set the stored filename
    4323     $p_header['stored_filename'] = $p_header['filename'];
    4324 
    4325     // ----- Set default status to ok
    4326     $p_header['status'] = 'ok';
    4327 
    4328     // ----- Look if it is a directory
    4329     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Internal (Hex) : '".sprintf("Ox%04X", $p_header['internal'])."'");
    4330     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "External (Hex) : '".sprintf("Ox%04X", $p_header['external'])."' (".(($p_header['external']&0x00000010)==0x00000010?'is a folder':'is a file').')');
    4331     if (substr($p_header['filename'], -1) == '/') {
    4332       //$p_header['external'] = 0x41FF0010;
    4333       $p_header['external'] = 0x00000010;
    4334       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Force folder external : \''.sprintf("Ox%04X", $p_header['external']).'\'');
    4335     }
    4336 
    4337     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Header of filename : \''.$p_header['filename'].'\'');
    4338 
    4339     // ----- Return
    4340     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4341     return $v_result;
     4674    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadCentralFileHeader", "");
     4675    $v_result=1;
     4676
     4677    // ----- Read the 4 bytes signature
     4678    $v_binary_data = @fread($this->zip_fd, 4);
     4679    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
     4680    $v_data = unpack('Vid', $v_binary_data);
     4681    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
     4682
     4683    // ----- Check signature
     4684    if ($v_data['id'] != 0x02014b50)
     4685    {
     4686      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid Central Dir File signature");
     4687
     4688      // ----- Error log
     4689      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
     4690
     4691      // ----- Return
     4692      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4693      return PclZip::errorCode();
     4694    }
     4695
     4696    // ----- Read the first 42 bytes of the header
     4697    $v_binary_data = fread($this->zip_fd, 42);
     4698
     4699    // ----- Look for invalid block size
     4700    if (strlen($v_binary_data) != 42)
     4701    {
     4702      $p_header['filename'] = "";
     4703      $p_header['status'] = "invalid_header";
     4704      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
     4705
     4706      // ----- Error log
     4707      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
     4708
     4709      // ----- Return
     4710      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4711      return PclZip::errorCode();
     4712    }
     4713
     4714    // ----- Extract the values
     4715    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header : '".$v_binary_data."'");
     4716    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header (Hex) : '".bin2hex($v_binary_data)."'");
     4717    $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);
     4718
     4719    // ----- Get filename
     4720    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']);
     4721    if ($p_header['filename_len'] != 0)
     4722      $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
     4723    else
     4724      $p_header['filename'] = '';
     4725    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Filename : \''.$p_header['filename'].'\'');
     4726
     4727    // ----- Get extra
     4728    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Extra length : ".$p_header['extra_len']);
     4729    if ($p_header['extra_len'] != 0)
     4730      $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
     4731    else
     4732      $p_header['extra'] = '';
     4733    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Extra : \''.$p_header['extra'].'\'');
     4734
     4735    // ----- Get comment
     4736    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Comment length : ".$p_header['comment_len']);
     4737    if ($p_header['comment_len'] != 0)
     4738      $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
     4739    else
     4740      $p_header['comment'] = '';
     4741    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Comment : \''.$p_header['comment'].'\'');
     4742
     4743    // ----- Extract properties
     4744    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version : \''.($p_header['version']/10).'.'.($p_header['version']%10).'\'');
     4745    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
     4746    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Size : \''.$p_header['size'].'\'');
     4747    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
     4748    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
     4749    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Flag : \''.$p_header['flag'].'\'');
     4750    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Offset : \''.$p_header['offset'].'\'');
     4751
     4752    // ----- Recuperate date in UNIX format
     4753    //if ($p_header['mdate'] && $p_header['mtime'])
     4754    // TBC : bug : this was ignoring time with 0/0/0
     4755    if (1)
     4756    {
     4757      // ----- Extract time
     4758      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
     4759      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
     4760      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
     4761
     4762      // ----- Extract date
     4763      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
     4764      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
     4765      $v_day = $p_header['mdate'] & 0x001F;
     4766
     4767      // ----- Get UNIX date format
     4768      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
     4769
     4770      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
     4771    }
     4772    else
     4773    {
     4774      $p_header['mtime'] = time();
     4775      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
     4776    }
     4777
     4778    // ----- Set the stored filename
     4779    $p_header['stored_filename'] = $p_header['filename'];
     4780
     4781    // ----- Set default status to ok
     4782    $p_header['status'] = 'ok';
     4783
     4784    // ----- Look if it is a directory
     4785    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Internal (Hex) : '".sprintf("Ox%04X", $p_header['internal'])."'");
     4786    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "External (Hex) : '".sprintf("Ox%04X", $p_header['external'])."' (".(($p_header['external']&0x00000010)==0x00000010?'is a folder':'is a file').')');
     4787    if (substr($p_header['filename'], -1) == '/') {
     4788      //$p_header['external'] = 0x41FF0010;
     4789      $p_header['external'] = 0x00000010;
     4790      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Force folder external : \''.sprintf("Ox%04X", $p_header['external']).'\'');
     4791    }
     4792
     4793    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Header of filename : \''.$p_header['filename'].'\'');
     4794
     4795    // ----- Return
     4796    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4797    return $v_result;
    43424798  }
    43434799  // --------------------------------------------------------------------------------
     
    43534809  function privCheckFileHeaders(&$p_local_header, &$p_central_header)
    43544810  {
    4355     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFileHeaders", "");
    4356     $v_result=1;
     4811    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFileHeaders", "");
     4812    $v_result=1;
    43574813
    43584814    // ----- Check the static values
    43594815    // TBC
    43604816    if ($p_local_header['filename'] != $p_central_header['filename']) {
    4361         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename" : TBC To Be Completed');
     4817        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename" : TBC To Be Completed');
    43624818    }
    43634819    if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {
    4364         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "version_extracted" : TBC To Be Completed');
     4820        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "version_extracted" : TBC To Be Completed');
    43654821    }
    43664822    if ($p_local_header['flag'] != $p_central_header['flag']) {
    4367         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "flag" : TBC To Be Completed');
     4823        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "flag" : TBC To Be Completed');
    43684824    }
    43694825    if ($p_local_header['compression'] != $p_central_header['compression']) {
    4370         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "compression" : TBC To Be Completed');
     4826        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "compression" : TBC To Be Completed');
    43714827    }
    43724828    if ($p_local_header['mtime'] != $p_central_header['mtime']) {
    4373         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "mtime" : TBC To Be Completed');
     4829        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "mtime" : TBC To Be Completed');
    43744830    }
    43754831    if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {
    4376         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename_len" : TBC To Be Completed');
     4832        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename_len" : TBC To Be Completed');
    43774833    }
    43784834
    43794835    // ----- Look for flag bit 3
    43804836    if (($p_local_header['flag'] & 8) == 8) {
    4381         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Purpose bit flag bit 3 set !');
    4382         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'File size, compression size and crc found in central header');
    4383         $p_local_header['size'] = $p_central_header['size'];
    4384         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_local_header['size'].'\'');
    4385         $p_local_header['compressed_size'] = $p_central_header['compressed_size'];
    4386         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_local_header['compressed_size'].'\'');
    4387         $p_local_header['crc'] = $p_central_header['crc'];
    4388         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_local_header['crc']).'\'');
    4389     }
    4390 
    4391     // ----- Return
    4392     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4393     return $v_result;
     4837        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Purpose bit flag bit 3 set !');
     4838        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'File size, compression size and crc found in central header');
     4839        $p_local_header['size'] = $p_central_header['size'];
     4840        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_local_header['size'].'\'');
     4841        $p_local_header['compressed_size'] = $p_central_header['compressed_size'];
     4842        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_local_header['compressed_size'].'\'');
     4843        $p_local_header['crc'] = $p_central_header['crc'];
     4844        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_local_header['crc']).'\'');
     4845    }
     4846
     4847    // ----- Return
     4848    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     4849    return $v_result;
    43944850  }
    43954851  // --------------------------------------------------------------------------------
     
    44034859  function privReadEndCentralDir(&$p_central_dir)
    44044860  {
    4405     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadEndCentralDir", "");
    4406     $v_result=1;
    4407 
    4408     // ----- Go to the end of the zip file
    4409     $v_size = filesize($this->zipname);
    4410     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size of the file :$v_size");
    4411     @fseek($this->zip_fd, $v_size);
    4412     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position at end of zip file : \''.ftell($this->zip_fd).'\'');
    4413     if (@ftell($this->zip_fd) != $v_size)
    4414     {
    4415       // ----- Error log
    4416       PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');
    4417 
    4418       // ----- Return
    4419       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4420       return PclZip::errorCode();
    4421     }
    4422 
    4423     // ----- First try : look if this is an archive with no commentaries (most of the time)
    4424     // in this case the end of central dir is at 22 bytes of the file end
    4425     $v_found = 0;
    4426     if ($v_size > 26) {
    4427       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Look for central dir with no comment');
    4428       @fseek($this->zip_fd, $v_size-22);
    4429       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after min central position : \''.ftell($this->zip_fd).'\'');
    4430       if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))
    4431       {
    4432         // ----- Error log
    4433         PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
    4434 
    4435         // ----- Return
    4436         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4437         return PclZip::errorCode();
    4438       }
    4439 
    4440       // ----- Read for bytes
    4441       $v_binary_data = @fread($this->zip_fd, 4);
    4442       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
    4443       $v_data = @unpack('Vid', $v_binary_data);
    4444       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
    4445 
    4446       // ----- Check signature
    4447       if ($v_data['id'] == 0x06054b50) {
    4448         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found central dir at the default position.");
    4449         $v_found = 1;
    4450       }
    4451 
    4452       $v_pos = ftell($this->zip_fd);
    4453     }
    4454 
    4455     // ----- Go back to the maximum possible size of the Central Dir End Record
    4456     if (!$v_found) {
    4457       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Start extended search of end central dir');
    4458       $v_maximum_size = 65557; // 0xFFFF + 22;
    4459       if ($v_maximum_size > $v_size)
    4460         $v_maximum_size = $v_size;
    4461       @fseek($this->zip_fd, $v_size-$v_maximum_size);
    4462       if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))
    4463       {
    4464         // ----- Error log
    4465         PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
    4466 
    4467         // ----- Return
    4468         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4469         return PclZip::errorCode();
    4470       }
    4471       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after max central position : \''.ftell($this->zip_fd).'\'');
    4472 
    4473       // ----- Read byte per byte in order to find the signature
    4474       $v_pos = ftell($this->zip_fd);
    4475       $v_bytes = 0x00000000;
    4476       while ($v_pos < $v_size)
    4477       {
    4478         // ----- Read a byte
    4479         $v_byte = @fread($this->zip_fd, 1);
    4480 
    4481         // -----  Add the byte
    4482         // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number
    4483         // Otherwise on systems where we have 64bit integers the check below for the magic number will fail.
    4484         $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);
    4485 
    4486         // ----- Compare the bytes
    4487         if ($v_bytes == 0x504b0506)
    4488         {
    4489           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Found End Central Dir signature at position : \''.ftell($this->zip_fd).'\'');
    4490           $v_pos++;
    4491           break;
    4492         }
    4493 
    4494         $v_pos++;
    4495       }
    4496 
    4497       // ----- Look if not found end of central dir
    4498       if ($v_pos == $v_size)
    4499       {
    4500         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to find End of Central Dir Record signature");
    4501 
    4502         // ----- Error log
    4503         PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");
    4504 
    4505         // ----- Return
    4506         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4507         return PclZip::errorCode();
    4508       }
    4509     }
    4510 
    4511     // ----- Read the first 18 bytes of the header
    4512     $v_binary_data = fread($this->zip_fd, 18);
    4513 
    4514     // ----- Look for invalid block size
    4515     if (strlen($v_binary_data) != 18)
    4516     {
    4517       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
    4518 
    4519       // ----- Error log
    4520       PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
    4521 
    4522       // ----- Return
    4523       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4524       return PclZip::errorCode();
    4525     }
    4526 
    4527     // ----- Extract the values
    4528     ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record : '".$v_binary_data."'");
    4529     ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record (Hex) : '".bin2hex($v_binary_data)."'");
    4530     $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
    4531 
    4532     // ----- Check the global size
    4533     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Comment length : ".$v_data['comment_size']);
    4534     if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
    4535       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The central dir is not at the end of the archive. Some trailing bytes exists after the archive.");
     4861    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadEndCentralDir", "");
     4862    $v_result=1;
     4863
     4864    // ----- Go to the end of the zip file
     4865    $v_size = filesize($this->zipname);
     4866    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size of the file :$v_size");
     4867    @fseek($this->zip_fd, $v_size);
     4868    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position at end of zip file : \''.ftell($this->zip_fd).'\'');
     4869    if (@ftell($this->zip_fd) != $v_size)
     4870    {
     4871      // ----- Error log
     4872      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');
     4873
     4874      // ----- Return
     4875      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4876      return PclZip::errorCode();
     4877    }
     4878
     4879    // ----- First try : look if this is an archive with no commentaries (most of the time)
     4880    // in this case the end of central dir is at 22 bytes of the file end
     4881    $v_found = 0;
     4882    if ($v_size > 26) {
     4883      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Look for central dir with no comment');
     4884      @fseek($this->zip_fd, $v_size-22);
     4885      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after min central position : \''.ftell($this->zip_fd).'\'');
     4886      if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))
     4887      {
     4888        // ----- Error log
     4889        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
     4890
     4891        // ----- Return
     4892        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4893        return PclZip::errorCode();
     4894      }
     4895
     4896      // ----- Read for bytes
     4897      $v_binary_data = @fread($this->zip_fd, 4);
     4898      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
     4899      $v_data = @unpack('Vid', $v_binary_data);
     4900      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
     4901
     4902      // ----- Check signature
     4903      if ($v_data['id'] == 0x06054b50) {
     4904        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found central dir at the default position.");
     4905        $v_found = 1;
     4906      }
     4907
     4908      $v_pos = ftell($this->zip_fd);
     4909    }
     4910
     4911    // ----- Go back to the maximum possible size of the Central Dir End Record
     4912    if (!$v_found) {
     4913      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Start extended search of end central dir');
     4914      $v_maximum_size = 65557; // 0xFFFF + 22;
     4915      if ($v_maximum_size > $v_size)
     4916        $v_maximum_size = $v_size;
     4917      @fseek($this->zip_fd, $v_size-$v_maximum_size);
     4918      if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))
     4919      {
     4920        // ----- Error log
     4921        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
     4922
     4923        // ----- Return
     4924        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4925        return PclZip::errorCode();
     4926      }
     4927      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after max central position : \''.ftell($this->zip_fd).'\'');
     4928
     4929      // ----- Read byte per byte in order to find the signature
     4930      $v_pos = ftell($this->zip_fd);
     4931      $v_bytes = 0x00000000;
     4932      while ($v_pos < $v_size)
     4933      {
     4934        // ----- Read a byte
     4935        $v_byte = @fread($this->zip_fd, 1);
     4936
     4937        // -----  Add the byte
     4938        $v_bytes = ($v_bytes << 8) | Ord($v_byte);
     4939
     4940        // ----- Compare the bytes
     4941        if ($v_bytes == 0x504b0506)
     4942        {
     4943          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Found End Central Dir signature at position : \''.ftell($this->zip_fd).'\'');
     4944          $v_pos++;
     4945          break;
     4946        }
     4947
     4948        $v_pos++;
     4949      }
     4950
     4951      // ----- Look if not found end of central dir
     4952      if ($v_pos == $v_size)
     4953      {
     4954        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to find End of Central Dir Record signature");
     4955
     4956        // ----- Error log
     4957        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");
     4958
     4959        // ----- Return
     4960        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4961        return PclZip::errorCode();
     4962      }
     4963    }
     4964
     4965    // ----- Read the first 18 bytes of the header
     4966    $v_binary_data = fread($this->zip_fd, 18);
     4967
     4968    // ----- Look for invalid block size
     4969    if (strlen($v_binary_data) != 18)
     4970    {
     4971      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
     4972
     4973      // ----- Error log
     4974      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
     4975
     4976      // ----- Return
     4977      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     4978      return PclZip::errorCode();
     4979    }
     4980
     4981    // ----- Extract the values
     4982    ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record : '".$v_binary_data."'");
     4983    ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record (Hex) : '".bin2hex($v_binary_data)."'");
     4984    $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
     4985
     4986    // ----- Check the global size
     4987    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Comment length : ".$v_data['comment_size']);
     4988    if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
     4989      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The central dir is not at the end of the archive. Some trailing bytes exists after the archive.");
    45364990
    45374991      // ----- Removed in release 2.2 see readme file
     
    45404994      // While decrypted, zip has training 0 bytes
    45414995      if (0) {
    4542       // ----- Error log
    4543       PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,
    4544                            'The central dir is not at the end of the archive.'
     4996      // ----- Error log
     4997      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,
     4998                           'The central dir is not at the end of the archive.'
    45454999                           .' Some trailing bytes exists after the archive.');
    45465000
    4547       // ----- Return
    4548       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4549       return PclZip::errorCode();
    4550       }
    4551     }
    4552 
    4553     // ----- Get comment
    4554     if ($v_data['comment_size'] != 0)
    4555       $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
    4556     else
    4557       $p_central_dir['comment'] = '';
    4558     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment : \''.$p_central_dir['comment'].'\'');
    4559 
    4560     $p_central_dir['entries'] = $v_data['entries'];
    4561     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries : \''.$p_central_dir['entries'].'\'');
    4562     $p_central_dir['disk_entries'] = $v_data['disk_entries'];
    4563     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries for this disk : \''.$p_central_dir['disk_entries'].'\'');
    4564     $p_central_dir['offset'] = $v_data['offset'];
    4565     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Offset of Central Dir : \''.$p_central_dir['offset'].'\'');
    4566     $p_central_dir['size'] = $v_data['size'];
    4567     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size of Central Dir : \''.$p_central_dir['size'].'\'');
    4568     $p_central_dir['disk'] = $v_data['disk'];
    4569     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Disk number : \''.$p_central_dir['disk'].'\'');
    4570     $p_central_dir['disk_start'] = $v_data['disk_start'];
    4571     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Start disk number : \''.$p_central_dir['disk_start'].'\'');
    4572 
    4573     // TBC
    4574     //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {
    4575     //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "central_dir[$key] = ".$p_central_dir[$key]);
    4576     //}
    4577 
    4578     // ----- Return
    4579     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4580     return $v_result;
     5001      // ----- Return
     5002      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     5003      return PclZip::errorCode();
     5004      }
     5005    }
     5006
     5007    // ----- Get comment
     5008    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment size : \''.$v_data['comment_size'].'\'');
     5009    if ($v_data['comment_size'] != 0) {
     5010      $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
     5011    }
     5012    else
     5013      $p_central_dir['comment'] = '';
     5014    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment : \''.$p_central_dir['comment'].'\'');
     5015
     5016    $p_central_dir['entries'] = $v_data['entries'];
     5017    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries : \''.$p_central_dir['entries'].'\'');
     5018    $p_central_dir['disk_entries'] = $v_data['disk_entries'];
     5019    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries for this disk : \''.$p_central_dir['disk_entries'].'\'');
     5020    $p_central_dir['offset'] = $v_data['offset'];
     5021    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Offset of Central Dir : \''.$p_central_dir['offset'].'\'');
     5022    $p_central_dir['size'] = $v_data['size'];
     5023    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size of Central Dir : \''.$p_central_dir['size'].'\'');
     5024    $p_central_dir['disk'] = $v_data['disk'];
     5025    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Disk number : \''.$p_central_dir['disk'].'\'');
     5026    $p_central_dir['disk_start'] = $v_data['disk_start'];
     5027    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Start disk number : \''.$p_central_dir['disk_start'].'\'');
     5028
     5029    // TBC
     5030    //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {
     5031    //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "central_dir[$key] = ".$p_central_dir[$key]);
     5032    //}
     5033
     5034    // ----- Return
     5035    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5036    return $v_result;
    45815037  }
    45825038  // --------------------------------------------------------------------------------
     
    45905046  function privDeleteByRule(&$p_result_list, &$p_options)
    45915047  {
    4592     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDeleteByRule", "");
    4593     $v_result=1;
    4594     $v_list_detail = array();
    4595 
    4596     // ----- Open the zip file
    4597     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    4598     if (($v_result=$this->privOpenFd('rb')) != 1)
    4599     {
    4600       // ----- Return
    4601       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4602       return $v_result;
    4603     }
    4604 
    4605     // ----- Read the central directory informations
    4606     $v_central_dir = array();
    4607     if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    4608     {
    4609       $this->privCloseFd();
    4610       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4611       return $v_result;
    4612     }
    4613 
    4614     // ----- Go to beginning of File
    4615     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
    4616     @rewind($this->zip_fd);
    4617     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
    4618 
    4619     // ----- Scan all the files
    4620     // ----- Start at beginning of Central Dir
    4621     $v_pos_entry = $v_central_dir['offset'];
    4622     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
    4623     @rewind($this->zip_fd);
    4624     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
    4625     if (@fseek($this->zip_fd, $v_pos_entry))
    4626     {
    4627       // ----- Close the zip file
    4628       $this->privCloseFd();
    4629 
    4630       // ----- Error log
    4631       PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
    4632 
    4633       // ----- Return
    4634       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4635       return PclZip::errorCode();
    4636     }
    4637     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
    4638 
    4639     // ----- Read each entry
    4640     $v_header_list = array();
    4641     $j_start = 0;
    4642     for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
    4643     {
    4644       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry (index '$i')");
    4645 
    4646       // ----- Read the file header
    4647       $v_header_list[$v_nb_extracted] = array();
    4648       if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)
    4649       {
    4650         // ----- Close the zip file
    4651         $this->privCloseFd();
    4652 
    4653         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4654         return $v_result;
    4655       }
    4656 
    4657       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename (index '$i') : '".$v_header_list[$v_nb_extracted]['stored_filename']."'");
    4658 
    4659       // ----- Store the index
    4660       $v_header_list[$v_nb_extracted]['index'] = $i;
    4661 
    4662       // ----- Look for the specific extract rules
    4663       $v_found = false;
    4664 
    4665       // ----- Look for extract by name rule
    4666       if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
    4667           && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
    4668           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
    4669 
    4670           // ----- Look if the filename is in the list
    4671           for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {
    4672               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
    4673 
    4674               // ----- Look for a directory
    4675               if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
    4676                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
    4677 
    4678                   // ----- Look if the directory is in the filename path
    4679                   if (   (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
    4680                       && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
    4681                       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
    4682                       $v_found = true;
    4683                   }
    4684                   elseif (   (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */
    4685                           && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
    4686                       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The entry is the searched directory");
    4687                       $v_found = true;
    4688                   }
    4689               }
    4690               // ----- Look for a filename
    4691               elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
    4692                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
    4693                   $v_found = true;
    4694               }
    4695           }
    4696       }
    4697 
    4698       // ----- Look for extract by ereg rule
    4699       else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
    4700                && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
    4701           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
    4702 
    4703           if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
    4704               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
    4705               $v_found = true;
    4706           }
    4707       }
    4708 
    4709       // ----- Look for extract by preg rule
    4710       else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
    4711                && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
    4712           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
    4713 
    4714           if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
    4715               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
    4716               $v_found = true;
    4717           }
    4718       }
    4719 
    4720       // ----- Look for extract by index rule
    4721       else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
    4722                && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
    4723           //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
    4724 
    4725           // ----- Look if the index is in the list
    4726           for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {
    4727               //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look if index '$i' is in [".$p_options[PCLZIP_OPT_BY_INDEX][$j]['start'].",".$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']."]");
    4728 
    4729               if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
    4730                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
    4731                   $v_found = true;
    4732               }
    4733               if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
    4734                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
    4735                   $j_start = $j+1;
    4736               }
    4737 
    4738               if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
    4739                   //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
    4740                   break;
    4741               }
    4742           }
    4743       }
    4744       else {
    4745         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "No argument mean remove all file");
    4746         $v_found = true;
    4747       }
    4748 
    4749       // ----- Look for deletion
    4750       if ($v_found)
    4751       {
    4752         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' need to be deleted");
    4753         unset($v_header_list[$v_nb_extracted]);
    4754       }
    4755       else
    4756       {
    4757         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' will not be deleted");
    4758         $v_nb_extracted++;
    4759       }
    4760     }
    4761 
    4762     // ----- Look if something need to be deleted
    4763     if ($v_nb_extracted > 0) {
    4764 
    4765         // ----- Creates a temporay file
    4766         $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
    4767 
    4768         // ----- Creates a temporary zip archive
    4769         $v_temp_zip = new PclZip($v_zip_temp_name);
    4770 
    4771         // ----- Open the temporary zip file in write mode
    4772         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary write mode");
    4773         if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
    4774             $this->privCloseFd();
    4775 
    4776             // ----- Return
    4777             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4778             return $v_result;
    4779         }
    4780 
    4781         // ----- Look which file need to be kept
    4782         for ($i=0; $i<sizeof($v_header_list); $i++) {
    4783             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Keep entry index '$i' : '".$v_header_list[$i]['filename']."'");
    4784 
    4785             // ----- Calculate the position of the header
    4786             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset='". $v_header_list[$i]['offset']."'");
    4787             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
    4788             @rewind($this->zip_fd);
    4789             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
    4790             if (@fseek($this->zip_fd,  $v_header_list[$i]['offset'])) {
    4791                 // ----- Close the zip file
    4792                 $this->privCloseFd();
    4793                 $v_temp_zip->privCloseFd();
    4794                 @unlink($v_zip_temp_name);
    4795 
    4796                 // ----- Error log
    4797                 PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
    4798 
    4799                 // ----- Return
    4800                 //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4801                 return PclZip::errorCode();
    4802             }
    4803             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
    4804 
    4805             // ----- Read the file header
    4806             $v_local_header = array();
    4807             if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
    4808                 // ----- Close the zip file
    4809                 $this->privCloseFd();
    4810                 $v_temp_zip->privCloseFd();
    4811                 @unlink($v_zip_temp_name);
    4812 
    4813                 // ----- Return
    4814                 //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4815                 return $v_result;
    4816             }
    4817 
    4818             // ----- Check that local file header is same as central file header
    4819             if ($this->privCheckFileHeaders($v_local_header,
    4820                                             $v_header_list[$i]) != 1) {
    4821                 // TBC
    4822             }
    4823             unset($v_local_header);
    4824 
    4825             // ----- Write the file header
    4826             if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
    4827                 // ----- Close the zip file
    4828                 $this->privCloseFd();
    4829                 $v_temp_zip->privCloseFd();
    4830                 @unlink($v_zip_temp_name);
    4831 
    4832                 // ----- Return
    4833                 //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4834                 return $v_result;
    4835             }
    4836             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset for this file is '".$v_header_list[$i]['offset']."'");
    4837 
    4838             // ----- Read/write the data block
    4839             if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
    4840                 // ----- Close the zip file
    4841                 $this->privCloseFd();
    4842                 $v_temp_zip->privCloseFd();
    4843                 @unlink($v_zip_temp_name);
    4844 
    4845                 // ----- Return
    4846                 //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4847                 return $v_result;
    4848             }
    4849         }
    4850 
    4851         // ----- Store the offset of the central dir
    4852         $v_offset = @ftell($v_temp_zip->zip_fd);
    4853         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "New offset of central dir : $v_offset");
    4854 
    4855         // ----- Re-Create the Central Dir files header
    4856         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the new central directory");
    4857         for ($i=0; $i<sizeof($v_header_list); $i++) {
    4858             // ----- Create the file header
    4859             //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset of file : ".$v_header_list[$i]['offset']);
    4860             if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
    4861                 $v_temp_zip->privCloseFd();
    4862                 $this->privCloseFd();
    4863                 @unlink($v_zip_temp_name);
    4864 
    4865                 // ----- Return
    4866                 //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4867                 return $v_result;
    4868             }
    4869 
    4870             // ----- Transform the header to a 'usable' info
    4871             $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
    4872         }
    4873 
    4874         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the central directory footer");
    4875 
    4876         // ----- Zip file comment
    4877         $v_comment = '';
    4878         if (isset($p_options[PCLZIP_OPT_COMMENT])) {
    4879           $v_comment = $p_options[PCLZIP_OPT_COMMENT];
    4880         }
    4881 
    4882         // ----- Calculate the size of the central header
    4883         $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;
    4884 
    4885         // ----- Create the central dir footer
    4886         if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
    4887             // ----- Reset the file list
    4888             unset($v_header_list);
    4889             $v_temp_zip->privCloseFd();
    4890             $this->privCloseFd();
    4891             @unlink($v_zip_temp_name);
    4892 
    4893             // ----- Return
    4894             //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4895             return $v_result;
    4896         }
    4897 
    4898         // ----- Close
    4899         $v_temp_zip->privCloseFd();
    4900         $this->privCloseFd();
    4901 
    4902         // ----- Delete the zip file
    4903         // TBC : I should test the result ...
    4904         @unlink($this->zipname);
    4905 
    4906         // ----- Rename the temporary file
    4907         // TBC : I should test the result ...
    4908         //@rename($v_zip_temp_name, $this->zipname);
    4909         PclZipUtilRename($v_zip_temp_name, $this->zipname);
    4910 
    4911         // ----- Destroy the temporary archive
    4912         unset($v_temp_zip);
    4913     }
    4914 
    4915     // ----- Remove every files : reset the file
    4916     else if ($v_central_dir['entries'] != 0) {
    4917         $this->privCloseFd();
    4918 
    4919         if (($v_result = $this->privOpenFd('wb')) != 1) {
    4920           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4921           return $v_result;
    4922         }
    4923 
    4924         if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
    4925           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4926           return $v_result;
    4927         }
    4928 
    4929         $this->privCloseFd();
    4930     }
    4931 
    4932     // ----- Return
    4933     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4934     return $v_result;
     5048    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDeleteByRule", "");
     5049    $v_result=1;
     5050    $v_list_detail = array();
     5051
     5052    // ----- Open the zip file
     5053    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     5054    if (($v_result=$this->privOpenFd('rb')) != 1)
     5055    {
     5056      // ----- Return
     5057      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5058      return $v_result;
     5059    }
     5060
     5061    // ----- Read the central directory informations
     5062    $v_central_dir = array();
     5063    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
     5064    {
     5065      $this->privCloseFd();
     5066      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5067      return $v_result;
     5068    }
     5069
     5070    // ----- Go to beginning of File
     5071    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
     5072    @rewind($this->zip_fd);
     5073    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
     5074
     5075    // ----- Scan all the files
     5076    // ----- Start at beginning of Central Dir
     5077    $v_pos_entry = $v_central_dir['offset'];
     5078    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
     5079    @rewind($this->zip_fd);
     5080    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
     5081    if (@fseek($this->zip_fd, $v_pos_entry))
     5082    {
     5083      // ----- Close the zip file
     5084      $this->privCloseFd();
     5085
     5086      // ----- Error log
     5087      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
     5088
     5089      // ----- Return
     5090      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     5091      return PclZip::errorCode();
     5092    }
     5093    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
     5094
     5095    // ----- Read each entry
     5096    $v_header_list = array();
     5097    $j_start = 0;
     5098    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
     5099    {
     5100      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry (index '$i')");
     5101
     5102      // ----- Read the file header
     5103      $v_header_list[$v_nb_extracted] = array();
     5104      if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)
     5105      {
     5106        // ----- Close the zip file
     5107        $this->privCloseFd();
     5108
     5109        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5110        return $v_result;
     5111      }
     5112
     5113      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename (index '$i') : '".$v_header_list[$v_nb_extracted]['stored_filename']."'");
     5114
     5115      // ----- Store the index
     5116      $v_header_list[$v_nb_extracted]['index'] = $i;
     5117
     5118      // ----- Look for the specific extract rules
     5119      $v_found = false;
     5120
     5121      // ----- Look for extract by name rule
     5122      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
     5123          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
     5124          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
     5125
     5126          // ----- Look if the filename is in the list
     5127          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {
     5128              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
     5129
     5130              // ----- Look for a directory
     5131              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
     5132                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
     5133
     5134                  // ----- Look if the directory is in the filename path
     5135                  if (   (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
     5136                      && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
     5137                      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
     5138                      $v_found = true;
     5139                  }
     5140                  elseif (   (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */
     5141                          && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
     5142                      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The entry is the searched directory");
     5143                      $v_found = true;
     5144                  }
     5145              }
     5146              // ----- Look for a filename
     5147              elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
     5148                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
     5149                  $v_found = true;
     5150              }
     5151          }
     5152      }
     5153
     5154      // ----- Look for extract by ereg rule
     5155      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
     5156               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
     5157          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
     5158
     5159          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
     5160              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
     5161              $v_found = true;
     5162          }
     5163      }
     5164
     5165      // ----- Look for extract by preg rule
     5166      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
     5167               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
     5168          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
     5169
     5170          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
     5171              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
     5172              $v_found = true;
     5173          }
     5174      }
     5175
     5176      // ----- Look for extract by index rule
     5177      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
     5178               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
     5179          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
     5180
     5181          // ----- Look if the index is in the list
     5182          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {
     5183              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look if index '$i' is in [".$p_options[PCLZIP_OPT_BY_INDEX][$j]['start'].",".$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']."]");
     5184
     5185              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
     5186                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
     5187                  $v_found = true;
     5188              }
     5189              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
     5190                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
     5191                  $j_start = $j+1;
     5192              }
     5193
     5194              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
     5195                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
     5196                  break;
     5197              }
     5198          }
     5199      }
     5200      else {
     5201        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "No argument mean remove all file");
     5202        $v_found = true;
     5203      }
     5204
     5205      // ----- Look for deletion
     5206      if ($v_found)
     5207      {
     5208        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' need to be deleted");
     5209        unset($v_header_list[$v_nb_extracted]);
     5210      }
     5211      else
     5212      {
     5213        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' will not be deleted");
     5214        $v_nb_extracted++;
     5215      }
     5216    }
     5217
     5218    // ----- Look if something need to be deleted
     5219    if ($v_nb_extracted > 0) {
     5220
     5221        // ----- Creates a temporay file
     5222        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
     5223
     5224        // ----- Creates a temporary zip archive
     5225        $v_temp_zip = new PclZip($v_zip_temp_name);
     5226
     5227        // ----- Open the temporary zip file in write mode
     5228        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary write mode");
     5229        if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
     5230            $this->privCloseFd();
     5231
     5232            // ----- Return
     5233            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5234            return $v_result;
     5235        }
     5236
     5237        // ----- Look which file need to be kept
     5238        for ($i=0; $i<sizeof($v_header_list); $i++) {
     5239            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Keep entry index '$i' : '".$v_header_list[$i]['filename']."'");
     5240
     5241            // ----- Calculate the position of the header
     5242            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset='". $v_header_list[$i]['offset']."'");
     5243            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
     5244            @rewind($this->zip_fd);
     5245            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
     5246            if (@fseek($this->zip_fd,  $v_header_list[$i]['offset'])) {
     5247                // ----- Close the zip file
     5248                $this->privCloseFd();
     5249                $v_temp_zip->privCloseFd();
     5250                @unlink($v_zip_temp_name);
     5251
     5252                // ----- Error log
     5253                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
     5254
     5255                // ----- Return
     5256                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     5257                return PclZip::errorCode();
     5258            }
     5259            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
     5260
     5261            // ----- Read the file header
     5262            $v_local_header = array();
     5263            if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
     5264                // ----- Close the zip file
     5265                $this->privCloseFd();
     5266                $v_temp_zip->privCloseFd();
     5267                @unlink($v_zip_temp_name);
     5268
     5269                // ----- Return
     5270                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5271                return $v_result;
     5272            }
     5273           
     5274            // ----- Check that local file header is same as central file header
     5275            if ($this->privCheckFileHeaders($v_local_header,
     5276                                            $v_header_list[$i]) != 1) {
     5277                // TBC
     5278            }
     5279            unset($v_local_header);
     5280
     5281            // ----- Write the file header
     5282            if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
     5283                // ----- Close the zip file
     5284                $this->privCloseFd();
     5285                $v_temp_zip->privCloseFd();
     5286                @unlink($v_zip_temp_name);
     5287
     5288                // ----- Return
     5289                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5290                return $v_result;
     5291            }
     5292            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset for this file is '".$v_header_list[$i]['offset']."'");
     5293
     5294            // ----- Read/write the data block
     5295            if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
     5296                // ----- Close the zip file
     5297                $this->privCloseFd();
     5298                $v_temp_zip->privCloseFd();
     5299                @unlink($v_zip_temp_name);
     5300
     5301                // ----- Return
     5302                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5303                return $v_result;
     5304            }
     5305        }
     5306
     5307        // ----- Store the offset of the central dir
     5308        $v_offset = @ftell($v_temp_zip->zip_fd);
     5309        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "New offset of central dir : $v_offset");
     5310
     5311        // ----- Re-Create the Central Dir files header
     5312        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the new central directory");
     5313        for ($i=0; $i<sizeof($v_header_list); $i++) {
     5314            // ----- Create the file header
     5315            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset of file : ".$v_header_list[$i]['offset']);
     5316            if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
     5317                $v_temp_zip->privCloseFd();
     5318                $this->privCloseFd();
     5319                @unlink($v_zip_temp_name);
     5320
     5321                // ----- Return
     5322                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5323                return $v_result;
     5324            }
     5325
     5326            // ----- Transform the header to a 'usable' info
     5327            $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
     5328        }
     5329
     5330        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the central directory footer");
     5331
     5332        // ----- Zip file comment
     5333        $v_comment = '';
     5334        if (isset($p_options[PCLZIP_OPT_COMMENT])) {
     5335          $v_comment = $p_options[PCLZIP_OPT_COMMENT];
     5336        }
     5337
     5338        // ----- Calculate the size of the central header
     5339        $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;
     5340
     5341        // ----- Create the central dir footer
     5342        if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
     5343            // ----- Reset the file list
     5344            unset($v_header_list);
     5345            $v_temp_zip->privCloseFd();
     5346            $this->privCloseFd();
     5347            @unlink($v_zip_temp_name);
     5348
     5349            // ----- Return
     5350            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5351            return $v_result;
     5352        }
     5353
     5354        // ----- Close
     5355        $v_temp_zip->privCloseFd();
     5356        $this->privCloseFd();
     5357
     5358        // ----- Delete the zip file
     5359        // TBC : I should test the result ...
     5360        @unlink($this->zipname);
     5361
     5362        // ----- Rename the temporary file
     5363        // TBC : I should test the result ...
     5364        //@rename($v_zip_temp_name, $this->zipname);
     5365        PclZipUtilRename($v_zip_temp_name, $this->zipname);
     5366   
     5367        // ----- Destroy the temporary archive
     5368        unset($v_temp_zip);
     5369    }
     5370   
     5371    // ----- Remove every files : reset the file
     5372    else if ($v_central_dir['entries'] != 0) {
     5373        $this->privCloseFd();
     5374
     5375        if (($v_result = $this->privOpenFd('wb')) != 1) {
     5376          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5377          return $v_result;
     5378        }
     5379
     5380        if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
     5381          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5382          return $v_result;
     5383        }
     5384
     5385        $this->privCloseFd();
     5386    }
     5387
     5388    // ----- Return
     5389    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5390    return $v_result;
    49355391  }
    49365392  // --------------------------------------------------------------------------------
     
    49445400  //   $p_dir : Directory path to check.
    49455401  // Return Values :
    4946   //    1 : OK
     5402  //    1 : OK
    49475403  //   -1 : Unable to create directory
    49485404  // --------------------------------------------------------------------------------
    49495405  function privDirCheck($p_dir, $p_is_dir=false)
    49505406  {
    4951     $v_result = 1;
    4952 
    4953     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'");
    4954 
    4955     // ----- Remove the final '/'
    4956     if (($p_is_dir) && (substr($p_dir, -1)=='/'))
    4957     {
    4958       $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
    4959     }
    4960     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'");
    4961 
    4962     // ----- Check the directory availability
    4963     if ((is_dir($p_dir)) || ($p_dir == ""))
    4964     {
    4965       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory");
    4966       return 1;
    4967     }
    4968 
    4969     // ----- Extract parent directory
    4970     $p_parent_dir = dirname($p_dir);
    4971     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'");
    4972 
    4973     // ----- Just a check
    4974     if ($p_parent_dir != $p_dir)
    4975     {
    4976       // ----- Look for parent directory
    4977       if ($p_parent_dir != "")
    4978       {
    4979         if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)
    4980         {
    4981           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    4982           return $v_result;
    4983         }
    4984       }
    4985     }
    4986 
    4987     // ----- Create the directory
    4988     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'");
    4989     if (!@mkdir($p_dir, 0777))
    4990     {
    4991       // ----- Error log
    4992       PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");
    4993 
    4994       // ----- Return
    4995       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    4996       return PclZip::errorCode();
    4997     }
    4998 
    4999     // ----- Return
    5000     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created");
    5001     return $v_result;
     5407    $v_result = 1;
     5408
     5409    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'");
     5410
     5411    // ----- Remove the final '/'
     5412    if (($p_is_dir) && (substr($p_dir, -1)=='/'))
     5413    {
     5414      $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
     5415    }
     5416    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'");
     5417
     5418    // ----- Check the directory availability
     5419    if ((is_dir($p_dir)) || ($p_dir == ""))
     5420    {
     5421      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory");
     5422      return 1;
     5423    }
     5424
     5425    // ----- Extract parent directory
     5426    $p_parent_dir = dirname($p_dir);
     5427    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'");
     5428
     5429    // ----- Just a check
     5430    if ($p_parent_dir != $p_dir)
     5431    {
     5432      // ----- Look for parent directory
     5433      if ($p_parent_dir != "")
     5434      {
     5435        if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)
     5436        {
     5437          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5438          return $v_result;
     5439        }
     5440      }
     5441    }
     5442
     5443    // ----- Create the directory
     5444    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'");
     5445    if (!@mkdir($p_dir, 0777))
     5446    {
     5447      // ----- Error log
     5448      PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");
     5449
     5450      // ----- Return
     5451      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     5452      return PclZip::errorCode();
     5453    }
     5454
     5455    // ----- Return
     5456    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created");
     5457    return $v_result;
    50025458  }
    50035459  // --------------------------------------------------------------------------------
     
    50125468  function privMerge(&$p_archive_to_add)
    50135469  {
    5014     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privMerge", "archive='".$p_archive_to_add->zipname."'");
    5015     $v_result=1;
    5016 
    5017     // ----- Look if the archive_to_add exists
    5018     if (!is_file($p_archive_to_add->zipname))
    5019     {
    5020       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to add does not exist. End of merge.");
    5021 
    5022       // ----- Nothing to merge, so merge is a success
    5023       $v_result = 1;
    5024 
    5025       // ----- Return
    5026       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5027       return $v_result;
    5028     }
    5029 
    5030     // ----- Look if the archive exists
    5031     if (!is_file($this->zipname))
    5032     {
    5033       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, duplicate the archive_to_add.");
    5034 
    5035       // ----- Do a duplicate
    5036       $v_result = $this->privDuplicate($p_archive_to_add->zipname);
    5037 
    5038       // ----- Return
    5039       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5040       return $v_result;
    5041     }
    5042 
    5043     // ----- Open the zip file
    5044     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    5045     if (($v_result=$this->privOpenFd('rb')) != 1)
    5046     {
    5047       // ----- Return
    5048       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5049       return $v_result;
    5050     }
    5051 
    5052     // ----- Read the central directory informations
    5053     $v_central_dir = array();
    5054     if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    5055     {
    5056       $this->privCloseFd();
    5057       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5058       return $v_result;
    5059     }
    5060 
    5061     // ----- Go to beginning of File
    5062     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
    5063     @rewind($this->zip_fd);
    5064     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
    5065 
    5066     // ----- Open the archive_to_add file
    5067     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open archive_to_add in binary read mode");
    5068     if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)
    5069     {
    5070       $this->privCloseFd();
    5071 
    5072       // ----- Return
    5073       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5074       return $v_result;
    5075     }
    5076 
    5077     // ----- Read the central directory informations
    5078     $v_central_dir_to_add = array();
    5079     if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)
    5080     {
    5081       $this->privCloseFd();
    5082       $p_archive_to_add->privCloseFd();
    5083 
    5084       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5085       return $v_result;
    5086     }
    5087 
    5088     // ----- Go to beginning of File
    5089     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
    5090     @rewind($p_archive_to_add->zip_fd);
    5091     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
    5092 
    5093     // ----- Creates a temporay file
    5094     $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
    5095 
    5096     // ----- Open the temporary file in write mode
    5097     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    5098     if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
    5099     {
    5100       $this->privCloseFd();
    5101       $p_archive_to_add->privCloseFd();
    5102 
    5103       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
    5104 
    5105       // ----- Return
    5106       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    5107       return PclZip::errorCode();
    5108     }
    5109 
    5110     // ----- Copy the files from the archive to the temporary file
    5111     // TBC : Here I should better append the file and go back to erase the central dir
    5112     $v_size = $v_central_dir['offset'];
    5113     while ($v_size != 0)
    5114     {
    5115       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    5116       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5117       $v_buffer = fread($this->zip_fd, $v_read_size);
    5118       @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
    5119       $v_size -= $v_read_size;
    5120     }
    5121 
    5122     // ----- Copy the files from the archive_to_add into the temporary file
    5123     $v_size = $v_central_dir_to_add['offset'];
    5124     while ($v_size != 0)
    5125     {
    5126       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    5127       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5128       $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);
    5129       @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
    5130       $v_size -= $v_read_size;
    5131     }
    5132 
    5133     // ----- Store the offset of the central dir
    5134     $v_offset = @ftell($v_zip_temp_fd);
    5135     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
    5136 
    5137     // ----- Copy the block of file headers from the old archive
    5138     $v_size = $v_central_dir['size'];
    5139     while ($v_size != 0)
    5140     {
    5141       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    5142       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5143       $v_buffer = @fread($this->zip_fd, $v_read_size);
    5144       @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
    5145       $v_size -= $v_read_size;
    5146     }
    5147 
    5148     // ----- Copy the block of file headers from the archive_to_add
    5149     $v_size = $v_central_dir_to_add['size'];
    5150     while ($v_size != 0)
    5151     {
    5152       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    5153       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5154       $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);
    5155       @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
    5156       $v_size -= $v_read_size;
    5157     }
    5158 
    5159     // ----- Merge the file comments
    5160     $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];
    5161 
    5162     // ----- Calculate the size of the (new) central header
    5163     $v_size = @ftell($v_zip_temp_fd)-$v_offset;
    5164 
    5165     // ----- Swap the file descriptor
    5166     // Here is a trick : I swap the temporary fd with the zip fd, in order to use
    5167     // the following methods on the temporary fil and not the real archive fd
    5168     $v_swap = $this->zip_fd;
    5169     $this->zip_fd = $v_zip_temp_fd;
    5170     $v_zip_temp_fd = $v_swap;
    5171 
    5172     // ----- Create the central dir footer
    5173     if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)
    5174     {
    5175       $this->privCloseFd();
    5176       $p_archive_to_add->privCloseFd();
    5177       @fclose($v_zip_temp_fd);
    5178       $this->zip_fd = null;
    5179 
    5180       // ----- Reset the file list
    5181       unset($v_header_list);
    5182 
    5183       // ----- Return
    5184       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5185       return $v_result;
    5186     }
    5187 
    5188     // ----- Swap back the file descriptor
    5189     $v_swap = $this->zip_fd;
    5190     $this->zip_fd = $v_zip_temp_fd;
    5191     $v_zip_temp_fd = $v_swap;
    5192 
    5193     // ----- Close
    5194     $this->privCloseFd();
    5195     $p_archive_to_add->privCloseFd();
    5196 
    5197     // ----- Close the temporary file
    5198     @fclose($v_zip_temp_fd);
    5199 
    5200     // ----- Delete the zip file
    5201     // TBC : I should test the result ...
    5202     @unlink($this->zipname);
    5203 
    5204     // ----- Rename the temporary file
    5205     // TBC : I should test the result ...
    5206     //@rename($v_zip_temp_name, $this->zipname);
    5207     PclZipUtilRename($v_zip_temp_name, $this->zipname);
    5208 
    5209     // ----- Return
    5210     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5211     return $v_result;
     5470    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privMerge", "archive='".$p_archive_to_add->zipname."'");
     5471    $v_result=1;
     5472
     5473    // ----- Look if the archive_to_add exists
     5474    if (!is_file($p_archive_to_add->zipname))
     5475    {
     5476      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to add does not exist. End of merge.");
     5477
     5478      // ----- Nothing to merge, so merge is a success
     5479      $v_result = 1;
     5480
     5481      // ----- Return
     5482      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5483      return $v_result;
     5484    }
     5485
     5486    // ----- Look if the archive exists
     5487    if (!is_file($this->zipname))
     5488    {
     5489      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, duplicate the archive_to_add.");
     5490
     5491      // ----- Do a duplicate
     5492      $v_result = $this->privDuplicate($p_archive_to_add->zipname);
     5493
     5494      // ----- Return
     5495      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5496      return $v_result;
     5497    }
     5498
     5499    // ----- Open the zip file
     5500    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     5501    if (($v_result=$this->privOpenFd('rb')) != 1)
     5502    {
     5503      // ----- Return
     5504      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5505      return $v_result;
     5506    }
     5507
     5508    // ----- Read the central directory informations
     5509    $v_central_dir = array();
     5510    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
     5511    {
     5512      $this->privCloseFd();
     5513      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5514      return $v_result;
     5515    }
     5516
     5517    // ----- Go to beginning of File
     5518    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
     5519    @rewind($this->zip_fd);
     5520    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
     5521
     5522    // ----- Open the archive_to_add file
     5523    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open archive_to_add in binary read mode");
     5524    if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)
     5525    {
     5526      $this->privCloseFd();
     5527
     5528      // ----- Return
     5529      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5530      return $v_result;
     5531    }
     5532
     5533    // ----- Read the central directory informations
     5534    $v_central_dir_to_add = array();
     5535    if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)
     5536    {
     5537      $this->privCloseFd();
     5538      $p_archive_to_add->privCloseFd();
     5539
     5540      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5541      return $v_result;
     5542    }
     5543
     5544    // ----- Go to beginning of File
     5545    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
     5546    @rewind($p_archive_to_add->zip_fd);
     5547    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
     5548
     5549    // ----- Creates a temporay file
     5550    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
     5551
     5552    // ----- Open the temporary file in write mode
     5553    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     5554    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
     5555    {
     5556      $this->privCloseFd();
     5557      $p_archive_to_add->privCloseFd();
     5558
     5559      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
     5560
     5561      // ----- Return
     5562      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     5563      return PclZip::errorCode();
     5564    }
     5565
     5566    // ----- Copy the files from the archive to the temporary file
     5567    // TBC : Here I should better append the file and go back to erase the central dir
     5568    $v_size = $v_central_dir['offset'];
     5569    while ($v_size != 0)
     5570    {
     5571      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     5572      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     5573      $v_buffer = fread($this->zip_fd, $v_read_size);
     5574      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
     5575      $v_size -= $v_read_size;
     5576    }
     5577
     5578    // ----- Copy the files from the archive_to_add into the temporary file
     5579    $v_size = $v_central_dir_to_add['offset'];
     5580    while ($v_size != 0)
     5581    {
     5582      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     5583      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     5584      $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);
     5585      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
     5586      $v_size -= $v_read_size;
     5587    }
     5588
     5589    // ----- Store the offset of the central dir
     5590    $v_offset = @ftell($v_zip_temp_fd);
     5591    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
     5592
     5593    // ----- Copy the block of file headers from the old archive
     5594    $v_size = $v_central_dir['size'];
     5595    while ($v_size != 0)
     5596    {
     5597      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     5598      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     5599      $v_buffer = @fread($this->zip_fd, $v_read_size);
     5600      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
     5601      $v_size -= $v_read_size;
     5602    }
     5603
     5604    // ----- Copy the block of file headers from the archive_to_add
     5605    $v_size = $v_central_dir_to_add['size'];
     5606    while ($v_size != 0)
     5607    {
     5608      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     5609      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     5610      $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);
     5611      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
     5612      $v_size -= $v_read_size;
     5613    }
     5614
     5615    // ----- Merge the file comments
     5616    $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];
     5617
     5618    // ----- Calculate the size of the (new) central header
     5619    $v_size = @ftell($v_zip_temp_fd)-$v_offset;
     5620
     5621    // ----- Swap the file descriptor
     5622    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
     5623    // the following methods on the temporary fil and not the real archive fd
     5624    $v_swap = $this->zip_fd;
     5625    $this->zip_fd = $v_zip_temp_fd;
     5626    $v_zip_temp_fd = $v_swap;
     5627
     5628    // ----- Create the central dir footer
     5629    if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)
     5630    {
     5631      $this->privCloseFd();
     5632      $p_archive_to_add->privCloseFd();
     5633      @fclose($v_zip_temp_fd);
     5634      $this->zip_fd = null;
     5635
     5636      // ----- Reset the file list
     5637      unset($v_header_list);
     5638
     5639      // ----- Return
     5640      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5641      return $v_result;
     5642    }
     5643
     5644    // ----- Swap back the file descriptor
     5645    $v_swap = $this->zip_fd;
     5646    $this->zip_fd = $v_zip_temp_fd;
     5647    $v_zip_temp_fd = $v_swap;
     5648
     5649    // ----- Close
     5650    $this->privCloseFd();
     5651    $p_archive_to_add->privCloseFd();
     5652
     5653    // ----- Close the temporary file
     5654    @fclose($v_zip_temp_fd);
     5655
     5656    // ----- Delete the zip file
     5657    // TBC : I should test the result ...
     5658    @unlink($this->zipname);
     5659
     5660    // ----- Rename the temporary file
     5661    // TBC : I should test the result ...
     5662    //@rename($v_zip_temp_name, $this->zipname);
     5663    PclZipUtilRename($v_zip_temp_name, $this->zipname);
     5664
     5665    // ----- Return
     5666    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5667    return $v_result;
    52125668  }
    52135669  // --------------------------------------------------------------------------------
     
    52215677  function privDuplicate($p_archive_filename)
    52225678  {
    5223     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'");
    5224     $v_result=1;
    5225 
    5226     // ----- Look if the $p_archive_filename exists
    5227     if (!is_file($p_archive_filename))
    5228     {
    5229       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate.");
    5230 
    5231       // ----- Nothing to duplicate, so duplicate is a success.
    5232       $v_result = 1;
    5233 
    5234       // ----- Return
    5235       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5236       return $v_result;
    5237     }
    5238 
    5239     // ----- Open the zip file
    5240     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    5241     if (($v_result=$this->privOpenFd('wb')) != 1)
    5242     {
    5243       // ----- Return
    5244       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5245       return $v_result;
    5246     }
    5247 
    5248     // ----- Open the temporary file in write mode
    5249     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
    5250     if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)
    5251     {
    5252       $this->privCloseFd();
    5253 
    5254       PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');
    5255 
    5256       // ----- Return
    5257       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
    5258       return PclZip::errorCode();
    5259     }
    5260 
    5261     // ----- Copy the files from the archive to the temporary file
    5262     // TBC : Here I should better append the file and go back to erase the central dir
    5263     $v_size = filesize($p_archive_filename);
    5264     while ($v_size != 0)
    5265     {
    5266       $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
    5267       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes");
    5268       $v_buffer = fread($v_zip_temp_fd, $v_read_size);
    5269       @fwrite($this->zip_fd, $v_buffer, $v_read_size);
    5270       $v_size -= $v_read_size;
    5271     }
    5272 
    5273     // ----- Close
    5274     $this->privCloseFd();
    5275 
    5276     // ----- Close the temporary file
    5277     @fclose($v_zip_temp_fd);
    5278 
    5279     // ----- Return
    5280     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5281     return $v_result;
     5679    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'");
     5680    $v_result=1;
     5681
     5682    // ----- Look if the $p_archive_filename exists
     5683    if (!is_file($p_archive_filename))
     5684    {
     5685      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate.");
     5686
     5687      // ----- Nothing to duplicate, so duplicate is a success.
     5688      $v_result = 1;
     5689
     5690      // ----- Return
     5691      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5692      return $v_result;
     5693    }
     5694
     5695    // ----- Open the zip file
     5696    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     5697    if (($v_result=$this->privOpenFd('wb')) != 1)
     5698    {
     5699      // ----- Return
     5700      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5701      return $v_result;
     5702    }
     5703
     5704    // ----- Open the temporary file in write mode
     5705    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     5706    if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)
     5707    {
     5708      $this->privCloseFd();
     5709
     5710      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');
     5711
     5712      // ----- Return
     5713      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
     5714      return PclZip::errorCode();
     5715    }
     5716
     5717    // ----- Copy the files from the archive to the temporary file
     5718    // TBC : Here I should better append the file and go back to erase the central dir
     5719    $v_size = filesize($p_archive_filename);
     5720    while ($v_size != 0)
     5721    {
     5722      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
     5723      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes");
     5724      $v_buffer = fread($v_zip_temp_fd, $v_read_size);
     5725      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
     5726      $v_size -= $v_read_size;
     5727    }
     5728
     5729    // ----- Close
     5730    $this->privCloseFd();
     5731
     5732    // ----- Close the temporary file
     5733    @fclose($v_zip_temp_fd);
     5734
     5735    // ----- Return
     5736    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5737    return $v_result;
    52825738  }
    52835739  // --------------------------------------------------------------------------------
     
    52905746  function privErrorLog($p_error_code=0, $p_error_string='')
    52915747  {
    5292     if (PCLZIP_ERROR_EXTERNAL == 1) {
    5293       PclError($p_error_code, $p_error_string);
    5294     }
    5295     else {
    5296       $this->error_code = $p_error_code;
    5297       $this->error_string = $p_error_string;
    5298     }
     5748    if (PCLZIP_ERROR_EXTERNAL == 1) {
     5749      PclError($p_error_code, $p_error_string);
     5750    }
     5751    else {
     5752      $this->error_code = $p_error_code;
     5753      $this->error_string = $p_error_string;
     5754    }
    52995755  }
    53005756  // --------------------------------------------------------------------------------
     
    53075763  function privErrorReset()
    53085764  {
    5309     if (PCLZIP_ERROR_EXTERNAL == 1) {
    5310       PclErrorReset();
    5311     }
    5312     else {
    5313       $this->error_code = 0;
    5314       $this->error_string = '';
    5315     }
     5765    if (PCLZIP_ERROR_EXTERNAL == 1) {
     5766      PclErrorReset();
     5767    }
     5768    else {
     5769      $this->error_code = 0;
     5770      $this->error_string = '';
     5771    }
    53165772  }
    53175773  // --------------------------------------------------------------------------------
     
    53255781  function privDecrypt($p_encryption_header, &$p_buffer, $p_size, $p_crc)
    53265782  {
    5327     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDecrypt', "size=".$p_size."");
    5328     $v_result=1;
    5329 
    5330     // ----- To Be Modified ;-)
    5331     $v_pwd = "test";
    5332 
    5333     $p_buffer = PclZipUtilZipDecrypt($p_buffer, $p_size, $p_encryption_header,
    5334                                     $p_crc, $v_pwd);
    5335 
    5336     // ----- Return
    5337     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5338     return $v_result;
     5783    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDecrypt', "size=".$p_size."");
     5784    $v_result=1;
     5785   
     5786    // ----- To Be Modified ;-)
     5787    $v_pwd = "test";
     5788   
     5789    $p_buffer = PclZipUtilZipDecrypt($p_buffer, $p_size, $p_encryption_header,
     5790                                    $p_crc, $v_pwd);
     5791   
     5792    // ----- Return
     5793    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5794    return $v_result;
    53395795  }
    53405796  // --------------------------------------------------------------------------------
     
    53485804  function privDisableMagicQuotes()
    53495805  {
    5350     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDisableMagicQuotes', "");
    5351     $v_result=1;
    5352 
    5353     // ----- Look if function exists
    5354     if (   (!function_exists("get_magic_quotes_runtime"))
    5355         || (!function_exists("set_magic_quotes_runtime"))) {
    5356       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
    5357       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5358       return $v_result;
    5359     }
    5360 
    5361     // ----- Look if already done
    5362     if ($this->magic_quotes_status != -1) {
    5363       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote already disabled");
    5364       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5365       return $v_result;
     5806    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDisableMagicQuotes', "");
     5807    $v_result=1;
     5808
     5809    // ----- Look if function exists
     5810    if (   (!function_exists("get_magic_quotes_runtime"))
     5811        || (!function_exists("set_magic_quotes_runtime"))) {
     5812      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
     5813      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5814      return $v_result;
     5815    }
     5816
     5817    // ----- Look if already done
     5818    if ($this->magic_quotes_status != -1) {
     5819      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote already disabled");
     5820      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5821      return $v_result;
    53665822    }
    53675823
    53685824    // ----- Get and memorize the magic_quote value
    53695825    $this->magic_quotes_status = @get_magic_quotes_runtime();
    5370     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Current magic_quotes_runtime status is '".($this->magic_quotes_status==0?'disable':'enable')."'");
     5826    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Current magic_quotes_runtime status is '".($this->magic_quotes_status==0?'disable':'enable')."'");
    53715827
    53725828    // ----- Disable magic_quotes
    53735829    if ($this->magic_quotes_status == 1) {
    5374       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Disable magic_quotes");
     5830      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Disable magic_quotes");
    53755831      @set_magic_quotes_runtime(0);
    53765832    }
    53775833
    5378     // ----- Return
    5379     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5380     return $v_result;
     5834    // ----- Return
     5835    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5836    return $v_result;
    53815837  }
    53825838  // --------------------------------------------------------------------------------
     
    53905846  function privSwapBackMagicQuotes()
    53915847  {
    5392     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privSwapBackMagicQuotes', "");
    5393     $v_result=1;
    5394 
    5395     // ----- Look if function exists
    5396     if (   (!function_exists("get_magic_quotes_runtime"))
    5397         || (!function_exists("set_magic_quotes_runtime"))) {
    5398       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
    5399       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5400       return $v_result;
    5401     }
    5402 
    5403     // ----- Look if something to do
    5404     if ($this->magic_quotes_status != -1) {
    5405       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote not modified");
    5406       //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5407       return $v_result;
     5848    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privSwapBackMagicQuotes', "");
     5849    $v_result=1;
     5850
     5851    // ----- Look if function exists
     5852    if (   (!function_exists("get_magic_quotes_runtime"))
     5853        || (!function_exists("set_magic_quotes_runtime"))) {
     5854      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
     5855      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5856      return $v_result;
     5857    }
     5858
     5859    // ----- Look if something to do
     5860    if ($this->magic_quotes_status != -1) {
     5861      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote not modified");
     5862      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5863      return $v_result;
    54085864    }
    54095865
    54105866    // ----- Swap back magic_quotes
    54115867    if ($this->magic_quotes_status == 1) {
    5412       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Enable back magic_quotes");
     5868      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Enable back magic_quotes");
    54135869      @set_magic_quotes_runtime($this->magic_quotes_status);
    54145870    }
    54155871
    5416     // ----- Return
    5417     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5418     return $v_result;
     5872    // ----- Return
     5873    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5874    return $v_result;
    54195875  }
    54205876  // --------------------------------------------------------------------------------
     
    54325888  function PclZipUtilPathReduction($p_dir)
    54335889  {
    5434     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathReduction", "dir='$p_dir'");
    5435     $v_result = "";
    5436 
    5437     // ----- Look for not empty path
    5438     if ($p_dir != "") {
    5439       // ----- Explode path by directory names
    5440       $v_list = explode("/", $p_dir);
    5441 
    5442       // ----- Study directories from last to first
    5443       $v_skip = 0;
    5444       for ($i=sizeof($v_list)-1; $i>=0; $i--) {
    5445         // ----- Look for current path
    5446         if ($v_list[$i] == ".") {
    5447           // ----- Ignore this directory
    5448           // Should be the first $i=0, but no check is done
    5449         }
    5450         else if ($v_list[$i] == "..") {
     5890    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathReduction", "dir='$p_dir'");
     5891    $v_result = "";
     5892
     5893    // ----- Look for not empty path
     5894    if ($p_dir != "") {
     5895      // ----- Explode path by directory names
     5896      $v_list = explode("/", $p_dir);
     5897
     5898      // ----- Study directories from last to first
     5899      $v_skip = 0;
     5900      for ($i=sizeof($v_list)-1; $i>=0; $i--) {
     5901        // ----- Look for current path
     5902        if ($v_list[$i] == ".") {
     5903          // ----- Ignore this directory
     5904          // Should be the first $i=0, but no check is done
     5905        }
     5906        else if ($v_list[$i] == "..") {
    54515907          $v_skip++;
    5452         }
    5453         else if ($v_list[$i] == "") {
     5908        }
     5909        else if ($v_list[$i] == "") {
    54545910          // ----- First '/' i.e. root slash
    54555911          if ($i == 0) {
    5456             $v_result = "/".$v_result;
    5457             if ($v_skip > 0) {
    5458                 // ----- It is an invalid path, so the path is not modified
    5459                 // TBC
    5460                 $v_result = $p_dir;
    5461                 //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid path is unchanged");
    5462                 $v_skip = 0;
    5463             }
     5912            $v_result = "/".$v_result;
     5913            if ($v_skip > 0) {
     5914                // ----- It is an invalid path, so the path is not modified
     5915                // TBC
     5916                $v_result = $p_dir;
     5917                //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid path is unchanged");
     5918                $v_skip = 0;
     5919            }
    54645920          }
    54655921          // ----- Last '/' i.e. indicates a directory
    54665922          else if ($i == (sizeof($v_list)-1)) {
    5467             $v_result = $v_list[$i];
     5923            $v_result = $v_list[$i];
    54685924          }
    54695925          // ----- Double '/' inside the path
    54705926          else {
    5471             // ----- Ignore only the double '//' in path,
    5472             // but not the first and last '/'
    5473           }
    5474         }
    5475         else {
     5927            // ----- Ignore only the double '//' in path,
     5928            // but not the first and last '/'
     5929          }
     5930        }
     5931        else {
    54765932          // ----- Look for item to skip
    54775933          if ($v_skip > 0) {
    5478             $v_skip--;
     5934            $v_skip--;
    54795935          }
    54805936          else {
    5481             $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
    5482           }
    5483         }
    5484       }
    5485 
    5486       // ----- Look for skip
    5487       if ($v_skip > 0) {
    5488         while ($v_skip > 0) {
    5489             $v_result = '../'.$v_result;
    5490             $v_skip--;
    5491         }
    5492       }
    5493     }
    5494 
    5495     // ----- Return
    5496     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5497     return $v_result;
     5937            $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
     5938          }
     5939        }
     5940      }
     5941     
     5942      // ----- Look for skip
     5943      if ($v_skip > 0) {
     5944        while ($v_skip > 0) {
     5945            $v_result = '../'.$v_result;
     5946            $v_skip--;
     5947        }
     5948      }
     5949    }
     5950
     5951    // ----- Return
     5952    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     5953    return $v_result;
    54985954  }
    54995955  // --------------------------------------------------------------------------------
     
    55165972  function PclZipUtilPathInclusion($p_dir, $p_path)
    55175973  {
    5518     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'");
    5519     $v_result = 1;
    5520 
    5521     // ----- Look for path beginning by ./
    5522     if (   ($p_dir == '.')
    5523         || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
    5524       $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);
    5525       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_dir '".$p_dir."'");
    5526     }
    5527     if (   ($p_path == '.')
    5528         || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {
    5529       $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);
    5530       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_path '".$p_path."'");
    5531     }
    5532 
    5533     // ----- Explode dir and path by directory separator
    5534     $v_list_dir = explode("/", $p_dir);
    5535     $v_list_dir_size = sizeof($v_list_dir);
    5536     $v_list_path = explode("/", $p_path);
    5537     $v_list_path_size = sizeof($v_list_path);
    5538 
    5539     // ----- Study directories paths
    5540     $i = 0;
    5541     $j = 0;
    5542     while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {
    5543       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'");
    5544 
    5545       // ----- Look for empty dir (path reduction)
    5546       if ($v_list_dir[$i] == '') {
    5547         $i++;
    5548         continue;
    5549       }
    5550       if ($v_list_path[$j] == '') {
    5551         $j++;
    5552         continue;
    5553       }
    5554 
    5555       // ----- Compare the items
    5556       if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != ''))  {
    5557         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different");
    5558         $v_result = 0;
    5559       }
    5560 
    5561       // ----- Next items
    5562       $i++;
    5563       $j++;
    5564     }
    5565 
    5566     // ----- Look if everything seems to be the same
    5567     if ($v_result) {
    5568       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break");
    5569       // ----- Skip all the empty items
    5570       while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
    5571       while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;
    5572       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Looking on dir($i)='".($i < $v_list_dir_size?$v_list_dir[$i]:'')."' and path($j)='".($j < $v_list_path_size?$v_list_path[$j]:'')."'");
    5573 
    5574       if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
    5575         // ----- There are exactly the same
    5576         $v_result = 2;
    5577       }
    5578       else if ($i < $v_list_dir_size) {
    5579         // ----- The path is shorter than the dir
    5580         $v_result = 0;
    5581       }
    5582     }
    5583 
    5584     // ----- Return
    5585     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5586     return $v_result;
     5974    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'");
     5975    $v_result = 1;
     5976   
     5977    // ----- Look for path beginning by ./
     5978    if (   ($p_dir == '.')
     5979        || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
     5980      $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);
     5981      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_dir '".$p_dir."'");
     5982    }
     5983    if (   ($p_path == '.')
     5984        || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {
     5985      $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);
     5986      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_path '".$p_path."'");
     5987    }
     5988
     5989    // ----- Explode dir and path by directory separator
     5990    $v_list_dir = explode("/", $p_dir);
     5991    $v_list_dir_size = sizeof($v_list_dir);
     5992    $v_list_path = explode("/", $p_path);
     5993    $v_list_path_size = sizeof($v_list_path);
     5994
     5995    // ----- Study directories paths
     5996    $i = 0;
     5997    $j = 0;
     5998    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {
     5999      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'");
     6000
     6001      // ----- Look for empty dir (path reduction)
     6002      if ($v_list_dir[$i] == '') {
     6003        $i++;
     6004        continue;
     6005      }
     6006      if ($v_list_path[$j] == '') {
     6007        $j++;
     6008        continue;
     6009      }
     6010
     6011      // ----- Compare the items
     6012      if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != ''))  {
     6013        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different");
     6014        $v_result = 0;
     6015      }
     6016
     6017      // ----- Next items
     6018      $i++;
     6019      $j++;
     6020    }
     6021
     6022    // ----- Look if everything seems to be the same
     6023    if ($v_result) {
     6024      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break");
     6025      // ----- Skip all the empty items
     6026      while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
     6027      while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;
     6028      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Looking on dir($i)='".($i < $v_list_dir_size?$v_list_dir[$i]:'')."' and path($j)='".($j < $v_list_path_size?$v_list_path[$j]:'')."'");
     6029
     6030      if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
     6031        // ----- There are exactly the same
     6032        $v_result = 2;
     6033      }
     6034      else if ($i < $v_list_dir_size) {
     6035        // ----- The path is shorter than the dir
     6036        $v_result = 0;
     6037      }
     6038    }
     6039
     6040    // ----- Return
     6041    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     6042    return $v_result;
    55876043  }
    55886044  // --------------------------------------------------------------------------------
     
    55936049  // Parameters :
    55946050  //   $p_mode : read/write compression mode
    5595   //            0 : src & dest normal
    5596   //            1 : src gzip, dest normal
    5597   //            2 : src normal, dest gzip
    5598   //            3 : src & dest gzip
     6051  //            0 : src & dest normal
     6052  //            1 : src gzip, dest normal
     6053  //            2 : src normal, dest gzip
     6054  //            3 : src & dest gzip
    55996055  // Return Values :
    56006056  // --------------------------------------------------------------------------------
    56016057  function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)
    56026058  {
    5603     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilCopyBlock", "size=$p_size, mode=$p_mode");
    5604     $v_result = 1;
    5605 
    5606     if ($p_mode==0)
    5607     {
    5608       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset before read :".(@ftell($p_src)));
    5609       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset before write :".(@ftell($p_dest)));
    5610       while ($p_size != 0)
    5611       {
    5612         $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
    5613         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5614         $v_buffer = @fread($p_src, $v_read_size);
    5615         @fwrite($p_dest, $v_buffer, $v_read_size);
    5616         $p_size -= $v_read_size;
    5617       }
    5618       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset after read :".(@ftell($p_src)));
    5619       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset after write :".(@ftell($p_dest)));
    5620     }
    5621     else if ($p_mode==1)
    5622     {
    5623       while ($p_size != 0)
    5624       {
    5625         $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
    5626         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5627         $v_buffer = @gzread($p_src, $v_read_size);
    5628         @fwrite($p_dest, $v_buffer, $v_read_size);
    5629         $p_size -= $v_read_size;
    5630       }
    5631     }
    5632     else if ($p_mode==2)
    5633     {
    5634       while ($p_size != 0)
    5635       {
    5636         $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
    5637         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5638         $v_buffer = @fread($p_src, $v_read_size);
    5639         @gzwrite($p_dest, $v_buffer, $v_read_size);
    5640         $p_size -= $v_read_size;
    5641       }
    5642     }
    5643     else if ($p_mode==3)
    5644     {
    5645       while ($p_size != 0)
    5646       {
    5647         $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
    5648         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
    5649         $v_buffer = @gzread($p_src, $v_read_size);
    5650         @gzwrite($p_dest, $v_buffer, $v_read_size);
    5651         $p_size -= $v_read_size;
    5652       }
    5653     }
    5654 
    5655     // ----- Return
    5656     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5657     return $v_result;
     6059    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilCopyBlock", "size=$p_size, mode=$p_mode");
     6060    $v_result = 1;
     6061
     6062    if ($p_mode==0)
     6063    {
     6064      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset before read :".(@ftell($p_src)));
     6065      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset before write :".(@ftell($p_dest)));
     6066      while ($p_size != 0)
     6067      {
     6068        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
     6069        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     6070        $v_buffer = @fread($p_src, $v_read_size);
     6071        @fwrite($p_dest, $v_buffer, $v_read_size);
     6072        $p_size -= $v_read_size;
     6073      }
     6074      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset after read :".(@ftell($p_src)));
     6075      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset after write :".(@ftell($p_dest)));
     6076    }
     6077    else if ($p_mode==1)
     6078    {
     6079      while ($p_size != 0)
     6080      {
     6081        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
     6082        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     6083        $v_buffer = @gzread($p_src, $v_read_size);
     6084        @fwrite($p_dest, $v_buffer, $v_read_size);
     6085        $p_size -= $v_read_size;
     6086      }
     6087    }
     6088    else if ($p_mode==2)
     6089    {
     6090      while ($p_size != 0)
     6091      {
     6092        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
     6093        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     6094        $v_buffer = @fread($p_src, $v_read_size);
     6095        @gzwrite($p_dest, $v_buffer, $v_read_size);
     6096        $p_size -= $v_read_size;
     6097      }
     6098    }
     6099    else if ($p_mode==3)
     6100    {
     6101      while ($p_size != 0)
     6102      {
     6103        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
     6104        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
     6105        $v_buffer = @gzread($p_src, $v_read_size);
     6106        @gzwrite($p_dest, $v_buffer, $v_read_size);
     6107        $p_size -= $v_read_size;
     6108      }
     6109    }
     6110
     6111    // ----- Return
     6112    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     6113    return $v_result;
    56586114  }
    56596115  // --------------------------------------------------------------------------------
     
    56736129  function PclZipUtilRename($p_src, $p_dest)
    56746130  {
    5675     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilRename", "source=$p_src, destination=$p_dest");
    5676     $v_result = 1;
    5677 
    5678     // ----- Try to rename the files
    5679     if (!@rename($p_src, $p_dest)) {
    5680       //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to rename file, try copy+unlink");
    5681 
    5682       // ----- Try to copy & unlink the src
    5683       if (!@copy($p_src, $p_dest)) {
    5684         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to copy file");
    5685         $v_result = 0;
    5686       }
    5687       else if (!@unlink($p_src)) {
    5688         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to unlink old filename");
    5689         $v_result = 0;
    5690       }
    5691     }
    5692 
    5693     // ----- Return
    5694     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5695     return $v_result;
     6131    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilRename", "source=$p_src, destination=$p_dest");
     6132    $v_result = 1;
     6133
     6134    // ----- Try to rename the files
     6135    if (!@rename($p_src, $p_dest)) {
     6136      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to rename file, try copy+unlink");
     6137
     6138      // ----- Try to copy & unlink the src
     6139      if (!@copy($p_src, $p_dest)) {
     6140        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to copy file");
     6141        $v_result = 0;
     6142      }
     6143      else if (!@unlink($p_src)) {
     6144        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to unlink old filename");
     6145        $v_result = 0;
     6146      }
     6147    }
     6148
     6149    // ----- Return
     6150    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     6151    return $v_result;
    56966152  }
    56976153  // --------------------------------------------------------------------------------
     
    57086164  function PclZipUtilOptionText($p_option)
    57096165  {
    5710     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilOptionText", "option='".$p_option."'");
    5711 
    5712     $v_list = get_defined_constants();
    5713     for (reset($v_list); $v_key = key($v_list); next($v_list)) {
     6166    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilOptionText", "option='".$p_option."'");
     6167   
     6168    $v_list = get_defined_constants();
     6169    for (reset($v_list); $v_key = key($v_list); next($v_list)) {
    57146170      $v_prefix = substr($v_key, 0, 10);
    57156171      if ((   ($v_prefix == 'PCLZIP_OPT')
    5716         || ($v_prefix == 'PCLZIP_CB_')
    5717         || ($v_prefix == 'PCLZIP_ATT'))
    5718           && ($v_list[$v_key] == $p_option)) {
    5719           //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_key);
    5720           return $v_key;
    5721         }
    5722     }
    5723 
    5724     $v_result = 'Unknown';
    5725 
    5726     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
    5727     return $v_result;
     6172        || ($v_prefix == 'PCLZIP_CB_')
     6173        || ($v_prefix == 'PCLZIP_ATT'))
     6174          && ($v_list[$v_key] == $p_option)) {
     6175          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_key);
     6176          return $v_key;
     6177        }
     6178    }
     6179   
     6180    $v_result = 'Unknown';
     6181
     6182    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     6183    return $v_result;
    57286184  }
    57296185  // --------------------------------------------------------------------------------
     
    57426198  function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)
    57436199  {
    5744     if (stristr(php_uname(), 'windows')) {
    5745       // ----- Look for potential disk letter
    5746       if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
    5747           $p_path = substr($p_path, $v_position+1);
    5748       }
    5749       // ----- Change potential windows directory separator
    5750       if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
    5751           $p_path = strtr($p_path, '\\', '/');
    5752       }
    5753     }
    5754     return $p_path;
     6200    if (stristr(php_uname(), 'windows')) {
     6201      // ----- Look for potential disk letter
     6202      if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
     6203          $p_path = substr($p_path, $v_position+1);
     6204      }
     6205      // ----- Change potential windows directory separator
     6206      if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
     6207          $p_path = strtr($p_path, '\\', '/');
     6208      }
     6209    }
     6210    return $p_path;
    57556211  }
    57566212  // --------------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.