Commit 1e8d94d3769ed1ea84e9bc3b97df236f918bdbd9

Authored by Megan Watson
2 parents eedb360e 2817a1f3

Merge branch 'edge' of git@github.com:ktgit/knowledgetree into edge

resources/graphics/ktshortcut.ico 0 → 100644
No preview for this file type
thirdparty/peclzip/pclzip.lib.php
1 -<?php  
2 -// --------------------------------------------------------------------------------  
3 -// PhpConcept Library - Zip Module 2.5  
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.44 2006/03/08 21:23:59 vblavet Exp $  
26 -// --------------------------------------------------------------------------------  
27 -  
28 - // ----- Constants  
29 - define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );  
30 -  
31 - // ----- File list separator  
32 - // In version 1.x of PclZip, the separator for file list is a space  
33 - // (which is not a very smart choice, specifically for windows paths !).  
34 - // A better separator should be a comma (,). This constant gives you the  
35 - // abilty to change that.  
36 - // However notice that changing this value, may have impact on existing  
37 - // scripts, using space separated filenames.  
38 - // Recommanded values for compatibility with older versions :  
39 - //define( 'PCLZIP_SEPARATOR', ' ' );  
40 - // Recommanded values for smart separation of filenames.  
41 - define( 'PCLZIP_SEPARATOR', ',' );  
42 -  
43 - // ----- Error configuration  
44 - // 0 : PclZip Class integrated error handling  
45 - // 1 : PclError external library error handling. By enabling this  
46 - // you must ensure that you have included PclError library.  
47 - // [2,...] : reserved for futur use  
48 - define( 'PCLZIP_ERROR_EXTERNAL', 0 );  
49 -  
50 - // ----- Optional static temporary directory  
51 - // By default temporary files are generated in the script current  
52 - // path.  
53 - // If defined :  
54 - // - MUST BE terminated by a '/'.  
55 - // - MUST be a valid, already created directory  
56 - // Samples :  
57 - // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );  
58 - // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );  
59 - define( 'PCLZIP_TEMPORARY_DIR', '' );  
60 -  
61 -// --------------------------------------------------------------------------------  
62 -// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****  
63 -// --------------------------------------------------------------------------------  
64 -  
65 - // ----- Global variables  
66 - $g_pclzip_version = "2.5";  
67 -  
68 - // ----- Error codes  
69 - // -1 : Unable to open file in binary write mode  
70 - // -2 : Unable to open file in binary read mode  
71 - // -3 : Invalid parameters  
72 - // -4 : File does not exist  
73 - // -5 : Filename is too long (max. 255)  
74 - // -6 : Not a valid zip file  
75 - // -7 : Invalid extracted file size  
76 - // -8 : Unable to create directory  
77 - // -9 : Invalid archive extension  
78 - // -10 : Invalid archive format  
79 - // -11 : Unable to delete file (unlink)  
80 - // -12 : Unable to rename file (rename)  
81 - // -13 : Invalid header checksum  
82 - // -14 : Invalid archive size  
83 - define( 'PCLZIP_ERR_USER_ABORTED', 2 );  
84 - define( 'PCLZIP_ERR_NO_ERROR', 0 );  
85 - define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );  
86 - define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );  
87 - define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );  
88 - define( 'PCLZIP_ERR_MISSING_FILE', -4 );  
89 - define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );  
90 - define( 'PCLZIP_ERR_INVALID_ZIP', -6 );  
91 - define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );  
92 - define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );  
93 - define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );  
94 - define( 'PCLZIP_ERR_BAD_FORMAT', -10 );  
95 - define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );  
96 - define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );  
97 - define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );  
98 - define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );  
99 - define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );  
100 - define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );  
101 - define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );  
102 - define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );  
103 - define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );  
104 - define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );  
105 - define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );  
106 -  
107 - // ----- Options values  
108 - define( 'PCLZIP_OPT_PATH', 77001 );  
109 - define( 'PCLZIP_OPT_ADD_PATH', 77002 );  
110 - define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );  
111 - define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );  
112 - define( 'PCLZIP_OPT_SET_CHMOD', 77005 );  
113 - define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );  
114 - define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );  
115 - define( 'PCLZIP_OPT_BY_NAME', 77008 );  
116 - define( 'PCLZIP_OPT_BY_INDEX', 77009 );  
117 - define( 'PCLZIP_OPT_BY_EREG', 77010 );  
118 - define( 'PCLZIP_OPT_BY_PREG', 77011 );  
119 - define( 'PCLZIP_OPT_COMMENT', 77012 );  
120 - define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );  
121 - define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );  
122 - define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );  
123 - define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );  
124 - define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );  
125 - // Having big trouble with crypt. Need to multiply 2 long int  
126 - // which is not correctly supported by PHP ...  
127 - //define( 'PCLZIP_OPT_CRYPT', 77018 );  
128 - define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );  
129 -  
130 - // ----- File description attributes  
131 - define( 'PCLZIP_ATT_FILE_NAME', 79001 );  
132 - define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );  
133 - define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );  
134 -  
135 - // ----- Call backs values  
136 - define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );  
137 - define( 'PCLZIP_CB_POST_EXTRACT', 78002 );  
138 - define( 'PCLZIP_CB_PRE_ADD', 78003 );  
139 - define( 'PCLZIP_CB_POST_ADD', 78004 );  
140 - /* For futur use  
141 - define( 'PCLZIP_CB_PRE_LIST', 78005 );  
142 - define( 'PCLZIP_CB_POST_LIST', 78006 );  
143 - define( 'PCLZIP_CB_PRE_DELETE', 78007 );  
144 - define( 'PCLZIP_CB_POST_DELETE', 78008 );  
145 - */  
146 -  
147 - // --------------------------------------------------------------------------------  
148 - // Class : PclZip  
149 - // Description :  
150 - // PclZip is the class that represent a Zip archive.  
151 - // The public methods allow the manipulation of the archive.  
152 - // Attributes :  
153 - // Attributes must not be accessed directly.  
154 - // Methods :  
155 - // PclZip() : Object creator  
156 - // create() : Creates the Zip archive  
157 - // listContent() : List the content of the Zip archive  
158 - // extract() : Extract the content of the archive  
159 - // properties() : List the properties of the archive  
160 - // --------------------------------------------------------------------------------  
161 - class PclZip  
162 - {  
163 - // ----- Filename of the zip file  
164 - var $zipname = '';  
165 -  
166 - // ----- File descriptor of the zip file  
167 - var $zip_fd = 0;  
168 -  
169 - // ----- Internal error handling  
170 - var $error_code = 1;  
171 - var $error_string = '';  
172 -  
173 - // ----- Current status of the magic_quotes_runtime  
174 - // This value store the php configuration for magic_quotes  
175 - // The class can then disable the magic_quotes and reset it after  
176 - var $magic_quotes_status;  
177 -  
178 - // --------------------------------------------------------------------------------  
179 - // Function : PclZip()  
180 - // Description :  
181 - // Creates a PclZip object and set the name of the associated Zip archive  
182 - // filename.  
183 - // Note that no real action is taken, if the archive does not exist it is not  
184 - // created. Use create() for that.  
185 - // --------------------------------------------------------------------------------  
186 - function PclZip($p_zipname)  
187 - {  
188 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::PclZip', "zipname=$p_zipname");  
189 -  
190 - // ----- Tests the zlib  
191 - if (!function_exists('gzopen'))  
192 - {  
193 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 1, "zlib extension seems to be missing");  
194 - die('Abort '.basename(__FILE__).' : Missing zlib extensions');  
195 - }  
196 -  
197 - // ----- Set the attributes  
198 - $this->zipname = $p_zipname;  
199 - $this->zip_fd = 0;  
200 - $this->magic_quotes_status = -1;  
201 -  
202 - // ----- Return  
203 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1);  
204 - return;  
205 - }  
206 - // --------------------------------------------------------------------------------  
207 -  
208 - // --------------------------------------------------------------------------------  
209 - // Function :  
210 - // create($p_filelist, $p_add_dir="", $p_remove_dir="")  
211 - // create($p_filelist, $p_option, $p_option_value, ...)  
212 - // Description :  
213 - // This method supports two different synopsis. The first one is historical.  
214 - // This method creates a Zip Archive. The Zip file is created in the  
215 - // filesystem. The files and directories indicated in $p_filelist  
216 - // are added in the archive. See the parameters description for the  
217 - // supported format of $p_filelist.  
218 - // When a directory is in the list, the directory and its content is added  
219 - // in the archive.  
220 - // In this synopsis, the function takes an optional variable list of  
221 - // options. See bellow the supported options.  
222 - // Parameters :  
223 - // $p_filelist : An array containing file or directory names, or  
224 - // a string containing one filename or one directory name, or  
225 - // a string containing a list of filenames and/or directory  
226 - // names separated by spaces.  
227 - // $p_add_dir : A path to add before the real path of the archived file,  
228 - // in order to have it memorized in the archive.  
229 - // $p_remove_dir : A path to remove from the real path of the file to archive,  
230 - // in order to have a shorter path memorized in the archive.  
231 - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir  
232 - // is removed first, before $p_add_dir is added.  
233 - // Options :  
234 - // PCLZIP_OPT_ADD_PATH :  
235 - // PCLZIP_OPT_REMOVE_PATH :  
236 - // PCLZIP_OPT_REMOVE_ALL_PATH :  
237 - // PCLZIP_OPT_COMMENT :  
238 - // PCLZIP_CB_PRE_ADD :  
239 - // PCLZIP_CB_POST_ADD :  
240 - // Return Values :  
241 - // 0 on failure,  
242 - // The list of the added files, with a status of the add action.  
243 - // (see PclZip::listContent() for list entry format)  
244 - // --------------------------------------------------------------------------------  
245 - function create($p_filelist)  
246 - {  
247 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ...");  
248 - $v_result=1;  
249 -  
250 - // ----- Reset the error handler  
251 - $this->privErrorReset();  
252 -  
253 - // ----- Set default values  
254 - $v_options = array();  
255 - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;  
256 -  
257 - // ----- Look for variable options arguments  
258 - $v_size = func_num_args();  
259 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");  
260 -  
261 - // ----- Look for arguments  
262 - if ($v_size > 1) {  
263 - // ----- Get the arguments  
264 - $v_arg_list = func_get_args();  
265 -  
266 - // ----- Remove from the options list the first argument  
267 - array_shift($v_arg_list);  
268 - $v_size--;  
269 -  
270 - // ----- Look for first arg  
271 - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {  
272 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");  
273 -  
274 - // ----- Parse the options  
275 - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,  
276 - array (PCLZIP_OPT_REMOVE_PATH => 'optional',  
277 - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',  
278 - PCLZIP_OPT_ADD_PATH => 'optional',  
279 - PCLZIP_CB_PRE_ADD => 'optional',  
280 - PCLZIP_CB_POST_ADD => 'optional',  
281 - PCLZIP_OPT_NO_COMPRESSION => 'optional',  
282 - PCLZIP_OPT_COMMENT => 'optional'  
283 - //, PCLZIP_OPT_CRYPT => 'optional'  
284 - ));  
285 - if ($v_result != 1) {  
286 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
287 - return 0;  
288 - }  
289 - }  
290 -  
291 - // ----- Look for 2 args  
292 - // Here we need to support the first historic synopsis of the  
293 - // method.  
294 - else {  
295 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");  
296 -  
297 - // ----- Get the first argument  
298 - $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];  
299 -  
300 - // ----- Look for the optional second argument  
301 - if ($v_size == 2) {  
302 - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];  
303 - }  
304 - else if ($v_size > 2) {  
305 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,  
306 - "Invalid number / type of arguments");  
307 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
308 - return 0;  
309 - }  
310 - }  
311 - }  
312 -  
313 - // ----- Init  
314 - $v_string_list = array();  
315 - $v_att_list = array();  
316 - $v_filedescr_list = array();  
317 - $p_result_list = array();  
318 -  
319 - // ----- Look if the $p_filelist is really an array  
320 - if (is_array($p_filelist)) {  
321 -  
322 - // ----- Look if the first element is also an array  
323 - // This will mean that this is a file description entry  
324 - if (isset($p_filelist[0]) && is_array($p_filelist[0])) {  
325 - $v_att_list = $p_filelist;  
326 - }  
327 -  
328 - // ----- The list is a list of string names  
329 - else {  
330 - $v_string_list = $p_filelist;  
331 - }  
332 - }  
333 -  
334 - // ----- Look if the $p_filelist is a string  
335 - else if (is_string($p_filelist)) {  
336 - // ----- Create a list from the string  
337 - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);  
338 - }  
339 -  
340 - // ----- Invalid variable type for $p_filelist  
341 - else {  
342 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");  
343 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
344 - return 0;  
345 - }  
346 -  
347 - // ----- Reformat the string list  
348 - if (sizeof($v_string_list) != 0) {  
349 - foreach ($v_string_list as $v_string) {  
350 - if ($v_string != '') {  
351 - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;  
352 - }  
353 - else {  
354 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Ignore an empty filename");  
355 - }  
356 - }  
357 - }  
358 -  
359 - // ----- For each file in the list check the attributes  
360 - $v_supported_attributes  
361 - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'  
362 - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'  
363 - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'  
364 - );  
365 - foreach ($v_att_list as $v_entry) {  
366 - $v_result = $this->privFileDescrParseAtt($v_entry,  
367 - $v_filedescr_list[],  
368 - $v_options,  
369 - $v_supported_attributes);  
370 - if ($v_result != 1) {  
371 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
372 - return 0;  
373 - }  
374 - }  
375 -  
376 - // ----- Expand the filelist (expand directories)  
377 - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);  
378 - if ($v_result != 1) {  
379 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
380 - return 0;  
381 - }  
382 -  
383 - // ----- Call the create fct  
384 - $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);  
385 - if ($v_result != 1) {  
386 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
387 - return 0;  
388 - }  
389 -  
390 - // ----- Return  
391 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);  
392 - return $p_result_list;  
393 - }  
394 - // --------------------------------------------------------------------------------  
395 -  
396 - // --------------------------------------------------------------------------------  
397 - // Function :  
398 - // add($p_filelist, $p_add_dir="", $p_remove_dir="")  
399 - // add($p_filelist, $p_option, $p_option_value, ...)  
400 - // Description :  
401 - // This method supports two synopsis. The first one is historical.  
402 - // This methods add the list of files in an existing archive.  
403 - // If a file with the same name already exists, it is added at the end of the  
404 - // archive, the first one is still present.  
405 - // If the archive does not exist, it is created.  
406 - // Parameters :  
407 - // $p_filelist : An array containing file or directory names, or  
408 - // a string containing one filename or one directory name, or  
409 - // a string containing a list of filenames and/or directory  
410 - // names separated by spaces.  
411 - // $p_add_dir : A path to add before the real path of the archived file,  
412 - // in order to have it memorized in the archive.  
413 - // $p_remove_dir : A path to remove from the real path of the file to archive,  
414 - // in order to have a shorter path memorized in the archive.  
415 - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir  
416 - // is removed first, before $p_add_dir is added.  
417 - // Options :  
418 - // PCLZIP_OPT_ADD_PATH :  
419 - // PCLZIP_OPT_REMOVE_PATH :  
420 - // PCLZIP_OPT_REMOVE_ALL_PATH :  
421 - // PCLZIP_OPT_COMMENT :  
422 - // PCLZIP_OPT_ADD_COMMENT :  
423 - // PCLZIP_OPT_PREPEND_COMMENT :  
424 - // PCLZIP_CB_PRE_ADD :  
425 - // PCLZIP_CB_POST_ADD :  
426 - // Return Values :  
427 - // 0 on failure,  
428 - // The list of the added files, with a status of the add action.  
429 - // (see PclZip::listContent() for list entry format)  
430 - // --------------------------------------------------------------------------------  
431 - function add($p_filelist)  
432 - {  
433 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ...");  
434 - $v_result=1;  
435 -  
436 - // ----- Reset the error handler  
437 - $this->privErrorReset();  
438 -  
439 - // ----- Set default values  
440 - $v_options = array();  
441 - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;  
442 -  
443 - // ----- Look for variable options arguments  
444 - $v_size = func_num_args();  
445 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");  
446 -  
447 - // ----- Look for arguments  
448 - if ($v_size > 1) {  
449 - // ----- Get the arguments  
450 - $v_arg_list = func_get_args();  
451 -  
452 - // ----- Remove form the options list the first argument  
453 - array_shift($v_arg_list);  
454 - $v_size--;  
455 -  
456 - // ----- Look for first arg  
457 - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {  
458 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");  
459 -  
460 - // ----- Parse the options  
461 - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,  
462 - array (PCLZIP_OPT_REMOVE_PATH => 'optional',  
463 - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',  
464 - PCLZIP_OPT_ADD_PATH => 'optional',  
465 - PCLZIP_CB_PRE_ADD => 'optional',  
466 - PCLZIP_CB_POST_ADD => 'optional',  
467 - PCLZIP_OPT_NO_COMPRESSION => 'optional',  
468 - PCLZIP_OPT_COMMENT => 'optional',  
469 - PCLZIP_OPT_ADD_COMMENT => 'optional',  
470 - PCLZIP_OPT_PREPEND_COMMENT => 'optional'  
471 - //, PCLZIP_OPT_CRYPT => 'optional'  
472 - ));  
473 - if ($v_result != 1) {  
474 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
475 - return 0;  
476 - }  
477 - }  
478 -  
479 - // ----- Look for 2 args  
480 - // Here we need to support the first historic synopsis of the  
481 - // method.  
482 - else {  
483 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");  
484 -  
485 - // ----- Get the first argument  
486 - $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];  
487 -  
488 - // ----- Look for the optional second argument  
489 - if ($v_size == 2) {  
490 - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];  
491 - }  
492 - else if ($v_size > 2) {  
493 - // ----- Error log  
494 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");  
495 -  
496 - // ----- Return  
497 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
498 - return 0;  
499 - }  
500 - }  
501 - }  
502 -  
503 - // ----- Init  
504 - $v_string_list = array();  
505 - $v_att_list = array();  
506 - $v_filedescr_list = array();  
507 - $p_result_list = array();  
508 -  
509 - // ----- Look if the $p_filelist is really an array  
510 - if (is_array($p_filelist)) {  
511 -  
512 - // ----- Look if the first element is also an array  
513 - // This will mean that this is a file description entry  
514 - if (isset($p_filelist[0]) && is_array($p_filelist[0])) {  
515 - $v_att_list = $p_filelist;  
516 - }  
517 -  
518 - // ----- The list is a list of string names  
519 - else {  
520 - $v_string_list = $p_filelist;  
521 - }  
522 - }  
523 -  
524 - // ----- Look if the $p_filelist is a string  
525 - else if (is_string($p_filelist)) {  
526 - // ----- Create a list from the string  
527 - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);  
528 - }  
529 -  
530 - // ----- Invalid variable type for $p_filelist  
531 - else {  
532 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");  
533 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
534 - return 0;  
535 - }  
536 -  
537 - // ----- Reformat the string list  
538 - if (sizeof($v_string_list) != 0) {  
539 - foreach ($v_string_list as $v_string) {  
540 - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;  
541 - }  
542 - }  
543 -  
544 - // ----- For each file in the list check the attributes  
545 - $v_supported_attributes  
546 - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'  
547 - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'  
548 - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'  
549 - );  
550 - foreach ($v_att_list as $v_entry) {  
551 - $v_result = $this->privFileDescrParseAtt($v_entry,  
552 - $v_filedescr_list[],  
553 - $v_options,  
554 - $v_supported_attributes);  
555 - if ($v_result != 1) {  
556 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
557 - return 0;  
558 - }  
559 - }  
560 -  
561 - // ----- Expand the filelist (expand directories)  
562 - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);  
563 - if ($v_result != 1) {  
564 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
565 - return 0;  
566 - }  
567 -  
568 - // ----- Call the create fct  
569 - $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);  
570 - if ($v_result != 1) {  
571 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
572 - return 0;  
573 - }  
574 -  
575 - // ----- Return  
576 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);  
577 - return $p_result_list;  
578 - }  
579 - // --------------------------------------------------------------------------------  
580 -  
581 - // --------------------------------------------------------------------------------  
582 - // Function : listContent()  
583 - // Description :  
584 - // This public method, gives the list of the files and directories, with their  
585 - // properties.  
586 - // The properties of each entries in the list are (used also in other functions) :  
587 - // filename : Name of the file. For a create or add action it is the filename  
588 - // given by the user. For an extract function it is the filename  
589 - // of the extracted file.  
590 - // stored_filename : Name of the file / directory stored in the archive.  
591 - // size : Size of the stored file.  
592 - // compressed_size : Size of the file's data compressed in the archive  
593 - // (without the headers overhead)  
594 - // mtime : Last known modification date of the file (UNIX timestamp)  
595 - // comment : Comment associated with the file  
596 - // folder : true | false  
597 - // index : index of the file in the archive  
598 - // status : status of the action (depending of the action) :  
599 - // Values are :  
600 - // ok : OK !  
601 - // filtered : the file / dir is not extracted (filtered by user)  
602 - // already_a_directory : the file can not be extracted because a  
603 - // directory with the same name already exists  
604 - // write_protected : the file can not be extracted because a file  
605 - // with the same name already exists and is  
606 - // write protected  
607 - // newer_exist : the file was not extracted because a newer file exists  
608 - // path_creation_fail : the file is not extracted because the folder  
609 - // does not exists and can not be created  
610 - // write_error : the file was not extracted because there was a  
611 - // error while writing the file  
612 - // read_error : the file was not extracted because there was a error  
613 - // while reading the file  
614 - // invalid_header : the file was not extracted because of an archive  
615 - // format error (bad file header)  
616 - // Note that each time a method can continue operating when there  
617 - // is an action error on a file, the error is only logged in the file status.  
618 - // Return Values :  
619 - // 0 on an unrecoverable failure,  
620 - // The list of the files in the archive.  
621 - // --------------------------------------------------------------------------------  
622 - function listContent()  
623 - {  
624 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', "");  
625 - $v_result=1;  
626 -  
627 - // ----- Reset the error handler  
628 - $this->privErrorReset();  
629 -  
630 - // ----- Check archive  
631 - if (!$this->privCheckFormat()) {  
632 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
633 - return(0);  
634 - }  
635 -  
636 - // ----- Call the extracting fct  
637 - $p_list = array();  
638 - if (($v_result = $this->privList($p_list)) != 1)  
639 - {  
640 - unset($p_list);  
641 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());  
642 - return(0);  
643 - }  
644 -  
645 - // ----- Return  
646 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);  
647 - return $p_list;  
648 - }  
649 - // --------------------------------------------------------------------------------  
650 -  
651 - // --------------------------------------------------------------------------------  
652 - // Function :  
653 - // extract($p_path="./", $p_remove_path="")  
654 - // extract([$p_option, $p_option_value, ...])  
655 - // Description :  
656 - // This method supports two synopsis. The first one is historical.  
657 - // This method extract all the files / directories from the archive to the  
658 - // folder indicated in $p_path.  
659 - // If you want to ignore the 'root' part of path of the memorized files  
660 - // you can indicate this in the optional $p_remove_path parameter.  
661 - // By default, if a newer file with the same name already exists, the  
662 - // file is not extracted.  
663 - //  
664 - // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions  
665 - // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append  
666 - // at the end of the path value of PCLZIP_OPT_PATH.  
667 - // Parameters :  
668 - // $p_path : Path where the files and directories are to be extracted  
669 - // $p_remove_path : First part ('root' part) of the memorized path  
670 - // (if any similar) to remove while extracting.  
671 - // Options :  
672 - // PCLZIP_OPT_PATH :  
673 - // PCLZIP_OPT_ADD_PATH :  
674 - // PCLZIP_OPT_REMOVE_PATH :  
675 - // PCLZIP_OPT_REMOVE_ALL_PATH :  
676 - // PCLZIP_CB_PRE_EXTRACT :  
677 - // PCLZIP_CB_POST_EXTRACT :  
678 - // Return Values :  
679 - // 0 or a negative value on failure,  
680 - // The list of the extracted files, with a status of the action.  
681 - // (see PclZip::listContent() for list entry format)  
682 - // --------------------------------------------------------------------------------  
683 - function extract()  
684 - {  
685 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", "");  
686 - $v_result=1;  
687 -  
688 - // ----- Reset the error handler  
689 - $this->privErrorReset();  
690 -  
691 - // ----- Check archive  
692 - if (!$this->privCheckFormat()) {  
693 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
694 - return(0);  
695 - }  
696 -  
697 - // ----- Set default values  
698 - $v_options = array();  
699 -// $v_path = "./";  
700 - $v_path = '';  
701 - $v_remove_path = "";  
702 - $v_remove_all_path = false;  
703 -  
704 - // ----- Look for variable options arguments  
705 - $v_size = func_num_args();  
706 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");  
707 -  
708 - // ----- Default values for option  
709 - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;  
710 -  
711 - // ----- Look for arguments  
712 - if ($v_size > 0) {  
713 - // ----- Get the arguments  
714 - $v_arg_list = func_get_args();  
715 -  
716 - // ----- Look for first arg  
717 - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {  
718 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");  
719 -  
720 - // ----- Parse the options  
721 - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,  
722 - array (PCLZIP_OPT_PATH => 'optional',  
723 - PCLZIP_OPT_REMOVE_PATH => 'optional',  
724 - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',  
725 - PCLZIP_OPT_ADD_PATH => 'optional',  
726 - PCLZIP_CB_PRE_EXTRACT => 'optional',  
727 - PCLZIP_CB_POST_EXTRACT => 'optional',  
728 - PCLZIP_OPT_SET_CHMOD => 'optional',  
729 - PCLZIP_OPT_BY_NAME => 'optional',  
730 - PCLZIP_OPT_BY_EREG => 'optional',  
731 - PCLZIP_OPT_BY_PREG => 'optional',  
732 - PCLZIP_OPT_BY_INDEX => 'optional',  
733 - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',  
734 - PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',  
735 - PCLZIP_OPT_REPLACE_NEWER => 'optional'  
736 - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'  
737 - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'  
738 - ));  
739 - if ($v_result != 1) {  
740 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
741 - return 0;  
742 - }  
743 -  
744 - // ----- Set the arguments  
745 - if (isset($v_options[PCLZIP_OPT_PATH])) {  
746 - $v_path = $v_options[PCLZIP_OPT_PATH];  
747 - }  
748 - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {  
749 - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];  
750 - }  
751 - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {  
752 - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];  
753 - }  
754 - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {  
755 - // ----- Check for '/' in last path char  
756 - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {  
757 - $v_path .= '/';  
758 - }  
759 - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];  
760 - }  
761 - }  
762 -  
763 - // ----- Look for 2 args  
764 - // Here we need to support the first historic synopsis of the  
765 - // method.  
766 - else {  
767 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");  
768 -  
769 - // ----- Get the first argument  
770 - $v_path = $v_arg_list[0];  
771 -  
772 - // ----- Look for the optional second argument  
773 - if ($v_size == 2) {  
774 - $v_remove_path = $v_arg_list[1];  
775 - }  
776 - else if ($v_size > 2) {  
777 - // ----- Error log  
778 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");  
779 -  
780 - // ----- Return  
781 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());  
782 - return 0;  
783 - }  
784 - }  
785 - }  
786 -  
787 - // ----- Trace  
788 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");  
789 -  
790 - // ----- Call the extracting fct  
791 - $p_list = array();  
792 - $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,  
793 - $v_remove_all_path, $v_options);  
794 - if ($v_result < 1) {  
795 - unset($p_list);  
796 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());  
797 - return(0);  
798 - }  
799 -  
800 - // ----- Return  
801 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);  
802 - return $p_list;  
803 - }  
804 - // --------------------------------------------------------------------------------  
805 -  
806 -  
807 - // --------------------------------------------------------------------------------  
808 - // Function :  
809 - // extractByIndex($p_index, $p_path="./", $p_remove_path="")  
810 - // extractByIndex($p_index, [$p_option, $p_option_value, ...])  
811 - // Description :  
812 - // This method supports two synopsis. The first one is historical.  
813 - // This method is doing a partial extract of the archive.  
814 - // The extracted files or folders are identified by their index in the  
815 - // archive (from 0 to n).  
816 - // Note that if the index identify a folder, only the folder entry is  
817 - // extracted, not all the files included in the archive.  
818 - // Parameters :  
819 - // $p_index : A single index (integer) or a string of indexes of files to  
820 - // extract. The form of the string is "0,4-6,8-12" with only numbers  
821 - // and '-' for range or ',' to separate ranges. No spaces or ';'  
822 - // are allowed.  
823 - // $p_path : Path where the files and directories are to be extracted  
824 - // $p_remove_path : First part ('root' part) of the memorized path  
825 - // (if any similar) to remove while extracting.  
826 - // Options :  
827 - // PCLZIP_OPT_PATH :  
828 - // PCLZIP_OPT_ADD_PATH :  
829 - // PCLZIP_OPT_REMOVE_PATH :  
830 - // PCLZIP_OPT_REMOVE_ALL_PATH :  
831 - // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and  
832 - // not as files.  
833 - // The resulting content is in a new field 'content' in the file  
834 - // structure.  
835 - // This option must be used alone (any other options are ignored).  
836 - // PCLZIP_CB_PRE_EXTRACT :  
837 - // PCLZIP_CB_POST_EXTRACT :  
838 - // Return Values :  
839 - // 0 on failure,  
840 - // The list of the extracted files, with a status of the action.  
841 - // (see PclZip::listContent() for list entry format)  
842 - // --------------------------------------------------------------------------------  
843 - //function extractByIndex($p_index, options...)  
844 - function extractByIndex($p_index)  
845 - {  
846 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ...");  
847 - $v_result=1;  
848 -  
849 - // ----- Reset the error handler  
850 - $this->privErrorReset();  
851 -  
852 - // ----- Check archive  
853 - if (!$this->privCheckFormat()) {  
854 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
855 - return(0);  
856 - }  
857 -  
858 - // ----- Set default values  
859 - $v_options = array();  
860 -// $v_path = "./";  
861 - $v_path = '';  
862 - $v_remove_path = "";  
863 - $v_remove_all_path = false;  
864 -  
865 - // ----- Look for variable options arguments  
866 - $v_size = func_num_args();  
867 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");  
868 -  
869 - // ----- Default values for option  
870 - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;  
871 -  
872 - // ----- Look for arguments  
873 - if ($v_size > 1) {  
874 - // ----- Get the arguments  
875 - $v_arg_list = func_get_args();  
876 -  
877 - // ----- Remove form the options list the first argument  
878 - array_shift($v_arg_list);  
879 - $v_size--;  
880 -  
881 - // ----- Look for first arg  
882 - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {  
883 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");  
884 -  
885 - // ----- Parse the options  
886 - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,  
887 - array (PCLZIP_OPT_PATH => 'optional',  
888 - PCLZIP_OPT_REMOVE_PATH => 'optional',  
889 - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',  
890 - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',  
891 - PCLZIP_OPT_ADD_PATH => 'optional',  
892 - PCLZIP_CB_PRE_EXTRACT => 'optional',  
893 - PCLZIP_CB_POST_EXTRACT => 'optional',  
894 - PCLZIP_OPT_SET_CHMOD => 'optional',  
895 - PCLZIP_OPT_REPLACE_NEWER => 'optional'  
896 - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'  
897 - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'  
898 - ));  
899 - if ($v_result != 1) {  
900 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
901 - return 0;  
902 - }  
903 -  
904 - // ----- Set the arguments  
905 - if (isset($v_options[PCLZIP_OPT_PATH])) {  
906 - $v_path = $v_options[PCLZIP_OPT_PATH];  
907 - }  
908 - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {  
909 - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];  
910 - }  
911 - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {  
912 - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];  
913 - }  
914 - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {  
915 - // ----- Check for '/' in last path char  
916 - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {  
917 - $v_path .= '/';  
918 - }  
919 - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];  
920 - }  
921 - if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {  
922 - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;  
923 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set.");  
924 - }  
925 - else {  
926 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set.");  
927 - }  
928 - }  
929 -  
930 - // ----- Look for 2 args  
931 - // Here we need to support the first historic synopsis of the  
932 - // method.  
933 - else {  
934 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");  
935 -  
936 - // ----- Get the first argument  
937 - $v_path = $v_arg_list[0];  
938 -  
939 - // ----- Look for the optional second argument  
940 - if ($v_size == 2) {  
941 - $v_remove_path = $v_arg_list[1];  
942 - }  
943 - else if ($v_size > 2) {  
944 - // ----- Error log  
945 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");  
946 -  
947 - // ----- Return  
948 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
949 - return 0;  
950 - }  
951 - }  
952 - }  
953 -  
954 - // ----- Trace  
955 - //--(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')."'");  
956 -  
957 - // ----- Trick  
958 - // Here I want to reuse extractByRule(), so I need to parse the $p_index  
959 - // with privParseOptions()  
960 - $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);  
961 - $v_options_trick = array();  
962 - $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,  
963 - array (PCLZIP_OPT_BY_INDEX => 'optional' ));  
964 - if ($v_result != 1) {  
965 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
966 - return 0;  
967 - }  
968 - $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];  
969 -  
970 - // ----- Call the extracting fct  
971 - if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {  
972 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());  
973 - return(0);  
974 - }  
975 -  
976 - // ----- Return  
977 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);  
978 - return $p_list;  
979 - }  
980 - // --------------------------------------------------------------------------------  
981 -  
982 - // --------------------------------------------------------------------------------  
983 - // Function :  
984 - // delete([$p_option, $p_option_value, ...])  
985 - // Description :  
986 - // This method removes files from the archive.  
987 - // If no parameters are given, then all the archive is emptied.  
988 - // Parameters :  
989 - // None or optional arguments.  
990 - // Options :  
991 - // PCLZIP_OPT_BY_INDEX :  
992 - // PCLZIP_OPT_BY_NAME :  
993 - // PCLZIP_OPT_BY_EREG :  
994 - // PCLZIP_OPT_BY_PREG :  
995 - // Return Values :  
996 - // 0 on failure,  
997 - // The list of the files which are still present in the archive.  
998 - // (see PclZip::listContent() for list entry format)  
999 - // --------------------------------------------------------------------------------  
1000 - function delete()  
1001 - {  
1002 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", "");  
1003 - $v_result=1;  
1004 -  
1005 - // ----- Reset the error handler  
1006 - $this->privErrorReset();  
1007 -  
1008 - // ----- Check archive  
1009 - if (!$this->privCheckFormat()) {  
1010 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
1011 - return(0);  
1012 - }  
1013 -  
1014 - // ----- Set default values  
1015 - $v_options = array();  
1016 -  
1017 - // ----- Look for variable options arguments  
1018 - $v_size = func_num_args();  
1019 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");  
1020 -  
1021 - // ----- Look for arguments  
1022 - if ($v_size > 0) {  
1023 - // ----- Get the arguments  
1024 - $v_arg_list = func_get_args();  
1025 -  
1026 - // ----- Parse the options  
1027 - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,  
1028 - array (PCLZIP_OPT_BY_NAME => 'optional',  
1029 - PCLZIP_OPT_BY_EREG => 'optional',  
1030 - PCLZIP_OPT_BY_PREG => 'optional',  
1031 - PCLZIP_OPT_BY_INDEX => 'optional' ));  
1032 - if ($v_result != 1) {  
1033 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
1034 - return 0;  
1035 - }  
1036 - }  
1037 -  
1038 - // ----- Magic quotes trick  
1039 - $this->privDisableMagicQuotes();  
1040 -  
1041 - // ----- Call the delete fct  
1042 - $v_list = array();  
1043 - if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {  
1044 - $this->privSwapBackMagicQuotes();  
1045 - unset($v_list);  
1046 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());  
1047 - return(0);  
1048 - }  
1049 -  
1050 - // ----- Magic quotes trick  
1051 - $this->privSwapBackMagicQuotes();  
1052 -  
1053 - // ----- Return  
1054 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_list);  
1055 - return $v_list;  
1056 - }  
1057 - // --------------------------------------------------------------------------------  
1058 -  
1059 - // --------------------------------------------------------------------------------  
1060 - // Function : deleteByIndex()  
1061 - // Description :  
1062 - // ***** Deprecated *****  
1063 - // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.  
1064 - // --------------------------------------------------------------------------------  
1065 - function deleteByIndex($p_index)  
1066 - {  
1067 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'");  
1068 -  
1069 - $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);  
1070 -  
1071 - // ----- Return  
1072 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);  
1073 - return $p_list;  
1074 - }  
1075 - // --------------------------------------------------------------------------------  
1076 -  
1077 - // --------------------------------------------------------------------------------  
1078 - // Function : properties()  
1079 - // Description :  
1080 - // This method gives the properties of the archive.  
1081 - // The properties are :  
1082 - // nb : Number of files in the archive  
1083 - // comment : Comment associated with the archive file  
1084 - // status : not_exist, ok  
1085 - // Parameters :  
1086 - // None  
1087 - // Return Values :  
1088 - // 0 on failure,  
1089 - // An array with the archive properties.  
1090 - // --------------------------------------------------------------------------------  
1091 - function properties()  
1092 - {  
1093 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", "");  
1094 -  
1095 - // ----- Reset the error handler  
1096 - $this->privErrorReset();  
1097 -  
1098 - // ----- Magic quotes trick  
1099 - $this->privDisableMagicQuotes();  
1100 -  
1101 - // ----- Check archive  
1102 - if (!$this->privCheckFormat()) {  
1103 - $this->privSwapBackMagicQuotes();  
1104 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
1105 - return(0);  
1106 - }  
1107 -  
1108 - // ----- Default properties  
1109 - $v_prop = array();  
1110 - $v_prop['comment'] = '';  
1111 - $v_prop['nb'] = 0;  
1112 - $v_prop['status'] = 'not_exist';  
1113 -  
1114 - // ----- Look if file exists  
1115 - if (@is_file($this->zipname))  
1116 - {  
1117 - // ----- Open the zip file  
1118 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
1119 - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)  
1120 - {  
1121 - $this->privSwapBackMagicQuotes();  
1122 -  
1123 - // ----- Error log  
1124 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');  
1125 -  
1126 - // ----- Return  
1127 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0);  
1128 - return 0;  
1129 - }  
1130 -  
1131 - // ----- Read the central directory informations  
1132 - $v_central_dir = array();  
1133 - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)  
1134 - {  
1135 - $this->privSwapBackMagicQuotes();  
1136 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
1137 - return 0;  
1138 - }  
1139 -  
1140 - // ----- Close the zip file  
1141 - $this->privCloseFd();  
1142 -  
1143 - // ----- Set the user attributes  
1144 - $v_prop['comment'] = $v_central_dir['comment'];  
1145 - $v_prop['nb'] = $v_central_dir['entries'];  
1146 - $v_prop['status'] = 'ok';  
1147 - }  
1148 -  
1149 - // ----- Magic quotes trick  
1150 - $this->privSwapBackMagicQuotes();  
1151 -  
1152 - // ----- Return  
1153 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_prop);  
1154 - return $v_prop;  
1155 - }  
1156 - // --------------------------------------------------------------------------------  
1157 -  
1158 - // --------------------------------------------------------------------------------  
1159 - // Function : duplicate()  
1160 - // Description :  
1161 - // This method creates an archive by copying the content of an other one. If  
1162 - // the archive already exist, it is replaced by the new one without any warning.  
1163 - // Parameters :  
1164 - // $p_archive : The filename of a valid archive, or  
1165 - // a valid PclZip object.  
1166 - // Return Values :  
1167 - // 1 on success.  
1168 - // 0 or a negative value on error (error code).  
1169 - // --------------------------------------------------------------------------------  
1170 - function duplicate($p_archive)  
1171 - {  
1172 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", "");  
1173 - $v_result = 1;  
1174 -  
1175 - // ----- Reset the error handler  
1176 - $this->privErrorReset();  
1177 -  
1178 - // ----- Look if the $p_archive is a PclZip object  
1179 - if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))  
1180 - {  
1181 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'");  
1182 -  
1183 - // ----- Duplicate the archive  
1184 - $v_result = $this->privDuplicate($p_archive->zipname);  
1185 - }  
1186 -  
1187 - // ----- Look if the $p_archive is a string (so a filename)  
1188 - else if (is_string($p_archive))  
1189 - {  
1190 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'");  
1191 -  
1192 - // ----- Check that $p_archive is a valid zip file  
1193 - // TBC : Should also check the archive format  
1194 - if (!is_file($p_archive)) {  
1195 - // ----- Error log  
1196 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");  
1197 - $v_result = PCLZIP_ERR_MISSING_FILE;  
1198 - }  
1199 - else {  
1200 - // ----- Duplicate the archive  
1201 - $v_result = $this->privDuplicate($p_archive);  
1202 - }  
1203 - }  
1204 -  
1205 - // ----- Invalid variable  
1206 - else  
1207 - {  
1208 - // ----- Error log  
1209 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");  
1210 - $v_result = PCLZIP_ERR_INVALID_PARAMETER;  
1211 - }  
1212 -  
1213 - // ----- Return  
1214 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
1215 - return $v_result;  
1216 - }  
1217 - // --------------------------------------------------------------------------------  
1218 -  
1219 - // --------------------------------------------------------------------------------  
1220 - // Function : merge()  
1221 - // Description :  
1222 - // This method merge the $p_archive_to_add archive at the end of the current  
1223 - // one ($this).  
1224 - // If the archive ($this) does not exist, the merge becomes a duplicate.  
1225 - // If the $p_archive_to_add archive does not exist, the merge is a success.  
1226 - // Parameters :  
1227 - // $p_archive_to_add : It can be directly the filename of a valid zip archive,  
1228 - // or a PclZip object archive.  
1229 - // Return Values :  
1230 - // 1 on success,  
1231 - // 0 or negative values on error (see below).  
1232 - // --------------------------------------------------------------------------------  
1233 - function merge($p_archive_to_add)  
1234 - {  
1235 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", "");  
1236 - $v_result = 1;  
1237 -  
1238 - // ----- Reset the error handler  
1239 - $this->privErrorReset();  
1240 -  
1241 - // ----- Check archive  
1242 - if (!$this->privCheckFormat()) {  
1243 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);  
1244 - return(0);  
1245 - }  
1246 -  
1247 - // ----- Look if the $p_archive_to_add is a PclZip object  
1248 - if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))  
1249 - {  
1250 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object");  
1251 -  
1252 - // ----- Merge the archive  
1253 - $v_result = $this->privMerge($p_archive_to_add);  
1254 - }  
1255 -  
1256 - // ----- Look if the $p_archive_to_add is a string (so a filename)  
1257 - else if (is_string($p_archive_to_add))  
1258 - {  
1259 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename");  
1260 -  
1261 - // ----- Create a temporary archive  
1262 - $v_object_archive = new PclZip($p_archive_to_add);  
1263 -  
1264 - // ----- Merge the archive  
1265 - $v_result = $this->privMerge($v_object_archive);  
1266 - }  
1267 -  
1268 - // ----- Invalid variable  
1269 - else  
1270 - {  
1271 - // ----- Error log  
1272 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");  
1273 - $v_result = PCLZIP_ERR_INVALID_PARAMETER;  
1274 - }  
1275 -  
1276 - // ----- Return  
1277 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
1278 - return $v_result;  
1279 - }  
1280 - // --------------------------------------------------------------------------------  
1281 -  
1282 -  
1283 -  
1284 - // --------------------------------------------------------------------------------  
1285 - // Function : errorCode()  
1286 - // Description :  
1287 - // Parameters :  
1288 - // --------------------------------------------------------------------------------  
1289 - function errorCode()  
1290 - {  
1291 - if (PCLZIP_ERROR_EXTERNAL == 1) {  
1292 - return(PclErrorCode());  
1293 - }  
1294 - else {  
1295 - return($this->error_code);  
1296 - }  
1297 - }  
1298 - // --------------------------------------------------------------------------------  
1299 -  
1300 - // --------------------------------------------------------------------------------  
1301 - // Function : errorName()  
1302 - // Description :  
1303 - // Parameters :  
1304 - // --------------------------------------------------------------------------------  
1305 - function errorName($p_with_code=false)  
1306 - {  
1307 - $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',  
1308 - PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',  
1309 - PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',  
1310 - PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',  
1311 - PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',  
1312 - PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',  
1313 - PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',  
1314 - PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',  
1315 - PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',  
1316 - PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',  
1317 - PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',  
1318 - PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',  
1319 - PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',  
1320 - PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',  
1321 - PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',  
1322 - PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',  
1323 - PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',  
1324 - PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',  
1325 - PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'  
1326 - ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'  
1327 - ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'  
1328 - );  
1329 -  
1330 - if (isset($v_name[$this->error_code])) {  
1331 - $v_value = $v_name[$this->error_code];  
1332 - }  
1333 - else {  
1334 - $v_value = 'NoName';  
1335 - }  
1336 -  
1337 - if ($p_with_code) {  
1338 - return($v_value.' ('.$this->error_code.')');  
1339 - }  
1340 - else {  
1341 - return($v_value);  
1342 - }  
1343 - }  
1344 - // --------------------------------------------------------------------------------  
1345 -  
1346 - // --------------------------------------------------------------------------------  
1347 - // Function : errorInfo()  
1348 - // Description :  
1349 - // Parameters :  
1350 - // --------------------------------------------------------------------------------  
1351 - function errorInfo($p_full=false)  
1352 - {  
1353 - if (PCLZIP_ERROR_EXTERNAL == 1) {  
1354 - return(PclErrorString());  
1355 - }  
1356 - else {  
1357 - if ($p_full) {  
1358 - return($this->errorName(true)." : ".$this->error_string);  
1359 - }  
1360 - else {  
1361 - return($this->error_string." [code ".$this->error_code."]");  
1362 - }  
1363 - }  
1364 - }  
1365 - // --------------------------------------------------------------------------------  
1366 -  
1367 -  
1368 -// --------------------------------------------------------------------------------  
1369 -// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****  
1370 -// ***** *****  
1371 -// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY *****  
1372 -// --------------------------------------------------------------------------------  
1373 -  
1374 -  
1375 -  
1376 - // --------------------------------------------------------------------------------  
1377 - // Function : privCheckFormat()  
1378 - // Description :  
1379 - // This method check that the archive exists and is a valid zip archive.  
1380 - // Several level of check exists. (futur)  
1381 - // Parameters :  
1382 - // $p_level : Level of check. Default 0.  
1383 - // 0 : Check the first bytes (magic codes) (default value))  
1384 - // 1 : 0 + Check the central directory (futur)  
1385 - // 2 : 1 + Check each file header (futur)  
1386 - // Return Values :  
1387 - // true on success,  
1388 - // false on error, the error code is set.  
1389 - // --------------------------------------------------------------------------------  
1390 - function privCheckFormat($p_level=0)  
1391 - {  
1392 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", "");  
1393 - $v_result = true;  
1394 -  
1395 - // ----- Reset the file system cache  
1396 - clearstatcache();  
1397 -  
1398 - // ----- Reset the error handler  
1399 - $this->privErrorReset();  
1400 -  
1401 - // ----- Look if the file exits  
1402 - if (!is_file($this->zipname)) {  
1403 - // ----- Error log  
1404 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");  
1405 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());  
1406 - return(false);  
1407 - }  
1408 -  
1409 - // ----- Check that the file is readeable  
1410 - if (!is_readable($this->zipname)) {  
1411 - // ----- Error log  
1412 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");  
1413 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());  
1414 - return(false);  
1415 - }  
1416 -  
1417 - // ----- Check the magic code  
1418 - // TBC  
1419 -  
1420 - // ----- Check the central header  
1421 - // TBC  
1422 -  
1423 - // ----- Check each file header  
1424 - // TBC  
1425 -  
1426 - // ----- Return  
1427 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
1428 - return $v_result;  
1429 - }  
1430 - // --------------------------------------------------------------------------------  
1431 -  
1432 - // --------------------------------------------------------------------------------  
1433 - // Function : privParseOptions()  
1434 - // Description :  
1435 - // This internal methods reads the variable list of arguments ($p_options_list,  
1436 - // $p_size) and generate an array with the options and values ($v_result_list).  
1437 - // $v_requested_options contains the options that can be present and those that  
1438 - // must be present.  
1439 - // $v_requested_options is an array, with the option value as key, and 'optional',  
1440 - // or 'mandatory' as value.  
1441 - // Parameters :  
1442 - // See above.  
1443 - // Return Values :  
1444 - // 1 on success.  
1445 - // 0 on failure.  
1446 - // --------------------------------------------------------------------------------  
1447 - function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)  
1448 - {  
1449 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", "");  
1450 - $v_result=1;  
1451 -  
1452 - // ----- Read the options  
1453 - $i=0;  
1454 - while ($i<$p_size) {  
1455 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'");  
1456 -  
1457 - // ----- Check if the option is supported  
1458 - if (!isset($v_requested_options[$p_options_list[$i]])) {  
1459 - // ----- Error log  
1460 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");  
1461 -  
1462 - // ----- Return  
1463 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1464 - return PclZip::errorCode();  
1465 - }  
1466 -  
1467 - // ----- Look for next option  
1468 - switch ($p_options_list[$i]) {  
1469 - // ----- Look for options that request a path value  
1470 - case PCLZIP_OPT_PATH :  
1471 - case PCLZIP_OPT_REMOVE_PATH :  
1472 - case PCLZIP_OPT_ADD_PATH :  
1473 - // ----- Check the number of parameters  
1474 - if (($i+1) >= $p_size) {  
1475 - // ----- Error log  
1476 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1477 -  
1478 - // ----- Return  
1479 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1480 - return PclZip::errorCode();  
1481 - }  
1482 -  
1483 - // ----- Get the value  
1484 - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);  
1485 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");  
1486 - $i++;  
1487 - break;  
1488 -  
1489 - case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :  
1490 - // ----- Check the number of parameters  
1491 - if (($i+1) >= $p_size) {  
1492 - // ----- Error log  
1493 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1494 -  
1495 - // ----- Return  
1496 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1497 - return PclZip::errorCode();  
1498 - }  
1499 -  
1500 - // ----- Get the value  
1501 - if ( is_string($p_options_list[$i+1])  
1502 - && ($p_options_list[$i+1] != '')) {  
1503 - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);  
1504 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");  
1505 - $i++;  
1506 - }  
1507 - else {  
1508 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored.");  
1509 - }  
1510 - break;  
1511 -  
1512 - // ----- Look for options that request an array of string for value  
1513 - case PCLZIP_OPT_BY_NAME :  
1514 - // ----- Check the number of parameters  
1515 - if (($i+1) >= $p_size) {  
1516 - // ----- Error log  
1517 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1518 -  
1519 - // ----- Return  
1520 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1521 - return PclZip::errorCode();  
1522 - }  
1523 -  
1524 - // ----- Get the value  
1525 - if (is_string($p_options_list[$i+1])) {  
1526 - $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];  
1527 - }  
1528 - else if (is_array($p_options_list[$i+1])) {  
1529 - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];  
1530 - }  
1531 - else {  
1532 - // ----- Error log  
1533 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1534 -  
1535 - // ----- Return  
1536 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1537 - return PclZip::errorCode();  
1538 - }  
1539 - ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");  
1540 - $i++;  
1541 - break;  
1542 -  
1543 - // ----- Look for options that request an EREG or PREG expression  
1544 - case PCLZIP_OPT_BY_EREG :  
1545 - case PCLZIP_OPT_BY_PREG :  
1546 - //case PCLZIP_OPT_CRYPT :  
1547 - // ----- Check the number of parameters  
1548 - if (($i+1) >= $p_size) {  
1549 - // ----- Error log  
1550 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1551 -  
1552 - // ----- Return  
1553 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1554 - return PclZip::errorCode();  
1555 - }  
1556 -  
1557 - // ----- Get the value  
1558 - if (is_string($p_options_list[$i+1])) {  
1559 - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];  
1560 - }  
1561 - else {  
1562 - // ----- Error log  
1563 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1564 -  
1565 - // ----- Return  
1566 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1567 - return PclZip::errorCode();  
1568 - }  
1569 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");  
1570 - $i++;  
1571 - break;  
1572 -  
1573 - // ----- Look for options that takes a string  
1574 - case PCLZIP_OPT_COMMENT :  
1575 - case PCLZIP_OPT_ADD_COMMENT :  
1576 - case PCLZIP_OPT_PREPEND_COMMENT :  
1577 - // ----- Check the number of parameters  
1578 - if (($i+1) >= $p_size) {  
1579 - // ----- Error log  
1580 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,  
1581 - "Missing parameter value for option '"  
1582 - .PclZipUtilOptionText($p_options_list[$i])  
1583 - ."'");  
1584 -  
1585 - // ----- Return  
1586 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1587 - return PclZip::errorCode();  
1588 - }  
1589 -  
1590 - // ----- Get the value  
1591 - if (is_string($p_options_list[$i+1])) {  
1592 - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];  
1593 - }  
1594 - else {  
1595 - // ----- Error log  
1596 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,  
1597 - "Wrong parameter value for option '"  
1598 - .PclZipUtilOptionText($p_options_list[$i])  
1599 - ."'");  
1600 -  
1601 - // ----- Return  
1602 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1603 - return PclZip::errorCode();  
1604 - }  
1605 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");  
1606 - $i++;  
1607 - break;  
1608 -  
1609 - // ----- Look for options that request an array of index  
1610 - case PCLZIP_OPT_BY_INDEX :  
1611 - // ----- Check the number of parameters  
1612 - if (($i+1) >= $p_size) {  
1613 - // ----- Error log  
1614 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1615 -  
1616 - // ----- Return  
1617 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1618 - return PclZip::errorCode();  
1619 - }  
1620 -  
1621 - // ----- Get the value  
1622 - $v_work_list = array();  
1623 - if (is_string($p_options_list[$i+1])) {  
1624 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'");  
1625 -  
1626 - // ----- Remove spaces  
1627 - $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');  
1628 -  
1629 - // ----- Parse items  
1630 - $v_work_list = explode(",", $p_options_list[$i+1]);  
1631 - }  
1632 - else if (is_integer($p_options_list[$i+1])) {  
1633 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'");  
1634 - $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];  
1635 - }  
1636 - else if (is_array($p_options_list[$i+1])) {  
1637 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array");  
1638 - $v_work_list = $p_options_list[$i+1];  
1639 - }  
1640 - else {  
1641 - // ----- Error log  
1642 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1643 -  
1644 - // ----- Return  
1645 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1646 - return PclZip::errorCode();  
1647 - }  
1648 -  
1649 - // ----- Reduce the index list  
1650 - // each index item in the list must be a couple with a start and  
1651 - // an end value : [0,3], [5-5], [8-10], ...  
1652 - // ----- Check the format of each item  
1653 - $v_sort_flag=false;  
1654 - $v_sort_value=0;  
1655 - for ($j=0; $j<sizeof($v_work_list); $j++) {  
1656 - // ----- Explode the item  
1657 - $v_item_list = explode("-", $v_work_list[$j]);  
1658 - $v_size_item_list = sizeof($v_item_list);  
1659 -  
1660 - // ----- TBC : Here we might check that each item is a  
1661 - // real integer ...  
1662 -  
1663 - // ----- Look for single value  
1664 - if ($v_size_item_list == 1) {  
1665 - // ----- Set the option value  
1666 - $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];  
1667 - $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];  
1668 - }  
1669 - elseif ($v_size_item_list == 2) {  
1670 - // ----- Set the option value  
1671 - $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];  
1672 - $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];  
1673 - }  
1674 - else {  
1675 - // ----- Error log  
1676 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1677 -  
1678 - // ----- Return  
1679 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1680 - return PclZip::errorCode();  
1681 - }  
1682 -  
1683 - //--(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']."]");  
1684 -  
1685 - // ----- Look for list sort  
1686 - if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {  
1687 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The list should be sorted ...");  
1688 - $v_sort_flag=true;  
1689 -  
1690 - // ----- TBC : An automatic sort should be writen ...  
1691 - // ----- Error log  
1692 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1693 -  
1694 - // ----- Return  
1695 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1696 - return PclZip::errorCode();  
1697 - }  
1698 - $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];  
1699 - }  
1700 -  
1701 - // ----- Sort the items  
1702 - if ($v_sort_flag) {  
1703 - // TBC : To Be Completed  
1704 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "List sorting is not yet write ...");  
1705 - }  
1706 -  
1707 - // ----- Next option  
1708 - $i++;  
1709 - break;  
1710 -  
1711 - // ----- Look for options that request no value  
1712 - case PCLZIP_OPT_REMOVE_ALL_PATH :  
1713 - case PCLZIP_OPT_EXTRACT_AS_STRING :  
1714 - case PCLZIP_OPT_NO_COMPRESSION :  
1715 - case PCLZIP_OPT_EXTRACT_IN_OUTPUT :  
1716 - case PCLZIP_OPT_REPLACE_NEWER :  
1717 - case PCLZIP_OPT_STOP_ON_ERROR :  
1718 - $v_result_list[$p_options_list[$i]] = true;  
1719 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");  
1720 - break;  
1721 -  
1722 - // ----- Look for options that request an octal value  
1723 - case PCLZIP_OPT_SET_CHMOD :  
1724 - // ----- Check the number of parameters  
1725 - if (($i+1) >= $p_size) {  
1726 - // ----- Error log  
1727 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1728 -  
1729 - // ----- Return  
1730 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1731 - return PclZip::errorCode();  
1732 - }  
1733 -  
1734 - // ----- Get the value  
1735 - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];  
1736 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");  
1737 - $i++;  
1738 - break;  
1739 -  
1740 - // ----- Look for options that request a call-back  
1741 - case PCLZIP_CB_PRE_EXTRACT :  
1742 - case PCLZIP_CB_POST_EXTRACT :  
1743 - case PCLZIP_CB_PRE_ADD :  
1744 - case PCLZIP_CB_POST_ADD :  
1745 - /* for futur use  
1746 - case PCLZIP_CB_PRE_DELETE :  
1747 - case PCLZIP_CB_POST_DELETE :  
1748 - case PCLZIP_CB_PRE_LIST :  
1749 - case PCLZIP_CB_POST_LIST :  
1750 - */  
1751 - // ----- Check the number of parameters  
1752 - if (($i+1) >= $p_size) {  
1753 - // ----- Error log  
1754 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1755 -  
1756 - // ----- Return  
1757 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1758 - return PclZip::errorCode();  
1759 - }  
1760 -  
1761 - // ----- Get the value  
1762 - $v_function_name = $p_options_list[$i+1];  
1763 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'");  
1764 -  
1765 - // ----- Check that the value is a valid existing function  
1766 - if (!function_exists($v_function_name)) {  
1767 - // ----- Error log  
1768 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");  
1769 -  
1770 - // ----- Return  
1771 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1772 - return PclZip::errorCode();  
1773 - }  
1774 -  
1775 - // ----- Set the attribute  
1776 - $v_result_list[$p_options_list[$i]] = $v_function_name;  
1777 - $i++;  
1778 - break;  
1779 -  
1780 - default :  
1781 - // ----- Error log  
1782 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,  
1783 - "Unknown parameter '"  
1784 - .$p_options_list[$i]."'");  
1785 -  
1786 - // ----- Return  
1787 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1788 - return PclZip::errorCode();  
1789 - }  
1790 -  
1791 - // ----- Next options  
1792 - $i++;  
1793 - }  
1794 -  
1795 - // ----- Look for mandatory options  
1796 - if ($v_requested_options !== false) {  
1797 - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {  
1798 - // ----- Look for mandatory option  
1799 - if ($v_requested_options[$key] == 'mandatory') {  
1800 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");  
1801 - // ----- Look if present  
1802 - if (!isset($v_result_list[$key])) {  
1803 - // ----- Error log  
1804 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");  
1805 -  
1806 - // ----- Return  
1807 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1808 - return PclZip::errorCode();  
1809 - }  
1810 - }  
1811 - }  
1812 - }  
1813 -  
1814 - // ----- Return  
1815 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
1816 - return $v_result;  
1817 - }  
1818 - // --------------------------------------------------------------------------------  
1819 -  
1820 - // --------------------------------------------------------------------------------  
1821 - // Function : privFileDescrParseAtt()  
1822 - // Description :  
1823 - // Parameters :  
1824 - // Return Values :  
1825 - // 1 on success.  
1826 - // 0 on failure.  
1827 - // --------------------------------------------------------------------------------  
1828 - function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)  
1829 - {  
1830 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrParseAtt", "");  
1831 - $v_result=1;  
1832 -  
1833 - // ----- For each file in the list check the attributes  
1834 - foreach ($p_file_list as $v_key => $v_value) {  
1835 -  
1836 - // ----- Check if the option is supported  
1837 - if (!isset($v_requested_options[$v_key])) {  
1838 - // ----- Error log  
1839 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");  
1840 -  
1841 - // ----- Return  
1842 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1843 - return PclZip::errorCode();  
1844 - }  
1845 -  
1846 - // ----- Look for attribute  
1847 - switch ($v_key) {  
1848 - case PCLZIP_ATT_FILE_NAME :  
1849 - if (!is_string($v_value)) {  
1850 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");  
1851 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1852 - return PclZip::errorCode();  
1853 - }  
1854 -  
1855 - $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);  
1856 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");  
1857 -  
1858 - if ($p_filedescr['filename'] == '') {  
1859 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");  
1860 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1861 - return PclZip::errorCode();  
1862 - }  
1863 -  
1864 - break;  
1865 -  
1866 - case PCLZIP_ATT_FILE_NEW_SHORT_NAME :  
1867 - if (!is_string($v_value)) {  
1868 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");  
1869 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1870 - return PclZip::errorCode();  
1871 - }  
1872 -  
1873 - $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);  
1874 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");  
1875 -  
1876 - if ($p_filedescr['new_short_name'] == '') {  
1877 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");  
1878 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1879 - return PclZip::errorCode();  
1880 - }  
1881 - break;  
1882 -  
1883 - case PCLZIP_ATT_FILE_NEW_FULL_NAME :  
1884 - if (!is_string($v_value)) {  
1885 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");  
1886 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1887 - return PclZip::errorCode();  
1888 - }  
1889 -  
1890 - $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);  
1891 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");  
1892 -  
1893 - if ($p_filedescr['new_full_name'] == '') {  
1894 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");  
1895 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1896 - return PclZip::errorCode();  
1897 - }  
1898 - break;  
1899 -  
1900 - default :  
1901 - // ----- Error log  
1902 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,  
1903 - "Unknown parameter '".$v_key."'");  
1904 -  
1905 - // ----- Return  
1906 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1907 - return PclZip::errorCode();  
1908 - }  
1909 -  
1910 - // ----- Look for mandatory options  
1911 - if ($v_requested_options !== false) {  
1912 - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {  
1913 - // ----- Look for mandatory option  
1914 - if ($v_requested_options[$key] == 'mandatory') {  
1915 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");  
1916 - // ----- Look if present  
1917 - if (!isset($p_file_list[$key])) {  
1918 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");  
1919 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1920 - return PclZip::errorCode();  
1921 - }  
1922 - }  
1923 - }  
1924 - }  
1925 -  
1926 - // end foreach  
1927 - }  
1928 -  
1929 - // ----- Return  
1930 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
1931 - return $v_result;  
1932 - }  
1933 - // --------------------------------------------------------------------------------  
1934 -  
1935 - // --------------------------------------------------------------------------------  
1936 - // Function : privFileDescrExpand()  
1937 - // Description :  
1938 - // Parameters :  
1939 - // Return Values :  
1940 - // 1 on success.  
1941 - // 0 on failure.  
1942 - // --------------------------------------------------------------------------------  
1943 - function privFileDescrExpand(&$p_filedescr_list, &$p_options)  
1944 - {  
1945 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrExpand", "");  
1946 - $v_result=1;  
1947 -  
1948 - // ----- Create a result list  
1949 - $v_result_list = array();  
1950 -  
1951 - // ----- Look each entry  
1952 - for ($i=0; $i<sizeof($p_filedescr_list); $i++) {  
1953 - // ----- Get filedescr  
1954 - $v_descr = $p_filedescr_list[$i];  
1955 -  
1956 - // ----- Reduce the filename  
1957 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr before reduction :'".$v_descr['filename']."'");  
1958 - $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename']);  
1959 - $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);  
1960 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr after reduction :'".$v_descr['filename']."'");  
1961 -  
1962 - // ----- Get type of descr  
1963 - if (!file_exists($v_descr['filename'])) {  
1964 - // ----- Error log  
1965 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_descr['filename']."' does not exists");  
1966 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exists");  
1967 -  
1968 - // ----- Return  
1969 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
1970 - return PclZip::errorCode();  
1971 - }  
1972 - if (@is_file($v_descr['filename'])) {  
1973 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a file");  
1974 - $v_descr['type'] = 'file';  
1975 - }  
1976 - else if (@is_dir($v_descr['filename'])) {  
1977 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a folder");  
1978 - $v_descr['type'] = 'folder';  
1979 - }  
1980 - else if (@is_link($v_descr['filename'])) {  
1981 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : link");  
1982 - // skip  
1983 - continue;  
1984 - }  
1985 - else {  
1986 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : unknown type");  
1987 - // skip  
1988 - continue;  
1989 - }  
1990 -  
1991 - // ----- Calculate the stored filename  
1992 - $this->privCalculateStoredFilename($v_descr, $p_options);  
1993 -  
1994 - // ----- Add the descriptor in result list  
1995 - $v_result_list[sizeof($v_result_list)] = $v_descr;  
1996 -  
1997 - // ----- Look for folder  
1998 - if ($v_descr['type'] == 'folder') {  
1999 - // ----- List of items in folder  
2000 - $v_dirlist_descr = array();  
2001 - $v_dirlist_nb = 0;  
2002 - if ($v_folder_handler = @opendir($v_descr['filename'])) {  
2003 - while (($v_item_handler = @readdir($v_folder_handler)) !== false) {  
2004 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for '".$v_item_handler."' in the directory");  
2005 -  
2006 - // ----- Skip '.' and '..'  
2007 - if (($v_item_handler == '.') || ($v_item_handler == '..')) {  
2008 - continue;  
2009 - }  
2010 -  
2011 - // ----- Compose the full filename  
2012 - $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;  
2013 -  
2014 - // ----- Look for different stored filename  
2015 - // Because the name of the folder was changed, the name of the  
2016 - // files/sub-folders also change  
2017 - if ($v_descr['stored_filename'] != $v_descr['filename']) {  
2018 - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;  
2019 - }  
2020 -  
2021 - $v_dirlist_nb++;  
2022 - }  
2023 - }  
2024 - else {  
2025 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to open dir '".$v_descr['filename']."' in read mode. Skipped.");  
2026 - // TBC : unable to open folder in read mode  
2027 - }  
2028 -  
2029 - // ----- Expand each element of the list  
2030 - if ($v_dirlist_nb != 0) {  
2031 - // ----- Expand  
2032 - if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {  
2033 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2034 - return $v_result;  
2035 - }  
2036 -  
2037 - // ----- Concat the resulting list  
2038 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Merging result list (size '".sizeof($v_result_list)."') with dirlist (size '".sizeof($v_dirlist_descr)."')");  
2039 - $v_result_list = array_merge($v_result_list, $v_dirlist_descr);  
2040 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "merged result list is size '".sizeof($v_result_list)."'");  
2041 - }  
2042 - else {  
2043 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Nothing in this folder to expand.");  
2044 - }  
2045 -  
2046 - // ----- Free local array  
2047 - unset($v_dirlist_descr);  
2048 - }  
2049 - }  
2050 -  
2051 - // ----- Get the result list  
2052 - $p_filedescr_list = $v_result_list;  
2053 -  
2054 - // ----- Return  
2055 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2056 - return $v_result;  
2057 - }  
2058 - // --------------------------------------------------------------------------------  
2059 -  
2060 - // --------------------------------------------------------------------------------  
2061 - // Function : privCreate()  
2062 - // Description :  
2063 - // Parameters :  
2064 - // Return Values :  
2065 - // --------------------------------------------------------------------------------  
2066 - function privCreate($p_filedescr_list, &$p_result_list, &$p_options)  
2067 - {  
2068 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list");  
2069 - $v_result=1;  
2070 - $v_list_detail = array();  
2071 -  
2072 - // ----- Magic quotes trick  
2073 - $this->privDisableMagicQuotes();  
2074 -  
2075 - // ----- Open the file in write mode  
2076 - if (($v_result = $this->privOpenFd('wb')) != 1)  
2077 - {  
2078 - // ----- Return  
2079 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2080 - return $v_result;  
2081 - }  
2082 -  
2083 - // ----- Add the list of files  
2084 - $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);  
2085 -  
2086 - // ----- Close  
2087 - $this->privCloseFd();  
2088 -  
2089 - // ----- Magic quotes trick  
2090 - $this->privSwapBackMagicQuotes();  
2091 -  
2092 - // ----- Return  
2093 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2094 - return $v_result;  
2095 - }  
2096 - // --------------------------------------------------------------------------------  
2097 -  
2098 - // --------------------------------------------------------------------------------  
2099 - // Function : privAdd()  
2100 - // Description :  
2101 - // Parameters :  
2102 - // Return Values :  
2103 - // --------------------------------------------------------------------------------  
2104 - function privAdd($p_filedescr_list, &$p_result_list, &$p_options)  
2105 - {  
2106 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list");  
2107 - $v_result=1;  
2108 - $v_list_detail = array();  
2109 -  
2110 - // ----- Look if the archive exists or is empty  
2111 - if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))  
2112 - {  
2113 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it.");  
2114 -  
2115 - // ----- Do a create  
2116 - $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);  
2117 -  
2118 - // ----- Return  
2119 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2120 - return $v_result;  
2121 - }  
2122 - // ----- Magic quotes trick  
2123 - $this->privDisableMagicQuotes();  
2124 -  
2125 - // ----- Open the zip file  
2126 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
2127 - if (($v_result=$this->privOpenFd('rb')) != 1)  
2128 - {  
2129 - // ----- Magic quotes trick  
2130 - $this->privSwapBackMagicQuotes();  
2131 -  
2132 - // ----- Return  
2133 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2134 - return $v_result;  
2135 - }  
2136 -  
2137 - // ----- Read the central directory informations  
2138 - $v_central_dir = array();  
2139 - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)  
2140 - {  
2141 - $this->privCloseFd();  
2142 - $this->privSwapBackMagicQuotes();  
2143 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2144 - return $v_result;  
2145 - }  
2146 -  
2147 - // ----- Go to beginning of File  
2148 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");  
2149 - @rewind($this->zip_fd);  
2150 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");  
2151 -  
2152 - // ----- Creates a temporay file  
2153 - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';  
2154 -  
2155 - // ----- Open the temporary file in write mode  
2156 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
2157 - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)  
2158 - {  
2159 - $this->privCloseFd();  
2160 - $this->privSwapBackMagicQuotes();  
2161 -  
2162 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');  
2163 -  
2164 - // ----- Return  
2165 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
2166 - return PclZip::errorCode();  
2167 - }  
2168 -  
2169 - // ----- Copy the files from the archive to the temporary file  
2170 - // TBC : Here I should better append the file and go back to erase the central dir  
2171 - $v_size = $v_central_dir['offset'];  
2172 - while ($v_size != 0)  
2173 - {  
2174 - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);  
2175 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");  
2176 - $v_buffer = fread($this->zip_fd, $v_read_size);  
2177 - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);  
2178 - $v_size -= $v_read_size;  
2179 - }  
2180 -  
2181 - // ----- Swap the file descriptor  
2182 - // Here is a trick : I swap the temporary fd with the zip fd, in order to use  
2183 - // the following methods on the temporary fil and not the real archive  
2184 - $v_swap = $this->zip_fd;  
2185 - $this->zip_fd = $v_zip_temp_fd;  
2186 - $v_zip_temp_fd = $v_swap;  
2187 -  
2188 - // ----- Add the files  
2189 - $v_header_list = array();  
2190 - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)  
2191 - {  
2192 - fclose($v_zip_temp_fd);  
2193 - $this->privCloseFd();  
2194 - @unlink($v_zip_temp_name);  
2195 - $this->privSwapBackMagicQuotes();  
2196 -  
2197 - // ----- Return  
2198 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2199 - return $v_result;  
2200 - }  
2201 -  
2202 - // ----- Store the offset of the central dir  
2203 - $v_offset = @ftell($this->zip_fd);  
2204 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");  
2205 -  
2206 - // ----- Copy the block of file headers from the old archive  
2207 - $v_size = $v_central_dir['size'];  
2208 - while ($v_size != 0)  
2209 - {  
2210 - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);  
2211 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");  
2212 - $v_buffer = @fread($v_zip_temp_fd, $v_read_size);  
2213 - @fwrite($this->zip_fd, $v_buffer, $v_read_size);  
2214 - $v_size -= $v_read_size;  
2215 - }  
2216 -  
2217 - // ----- Create the Central Dir files header  
2218 - for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)  
2219 - {  
2220 - // ----- Create the file header  
2221 - if ($v_header_list[$i]['status'] == 'ok') {  
2222 - if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {  
2223 - fclose($v_zip_temp_fd);  
2224 - $this->privCloseFd();  
2225 - @unlink($v_zip_temp_name);  
2226 - $this->privSwapBackMagicQuotes();  
2227 -  
2228 - // ----- Return  
2229 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2230 - return $v_result;  
2231 - }  
2232 - $v_count++;  
2233 - }  
2234 -  
2235 - // ----- Transform the header to a 'usable' info  
2236 - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);  
2237 - }  
2238 -  
2239 - // ----- Zip file comment  
2240 - $v_comment = $v_central_dir['comment'];  
2241 - if (isset($p_options[PCLZIP_OPT_COMMENT])) {  
2242 - $v_comment = $p_options[PCLZIP_OPT_COMMENT];  
2243 - }  
2244 - if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {  
2245 - $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];  
2246 - }  
2247 - if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {  
2248 - $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;  
2249 - }  
2250 -  
2251 - // ----- Calculate the size of the central header  
2252 - $v_size = @ftell($this->zip_fd)-$v_offset;  
2253 -  
2254 - // ----- Create the central dir footer  
2255 - if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)  
2256 - {  
2257 - // ----- Reset the file list  
2258 - unset($v_header_list);  
2259 - $this->privSwapBackMagicQuotes();  
2260 -  
2261 - // ----- Return  
2262 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2263 - return $v_result;  
2264 - }  
2265 -  
2266 - // ----- Swap back the file descriptor  
2267 - $v_swap = $this->zip_fd;  
2268 - $this->zip_fd = $v_zip_temp_fd;  
2269 - $v_zip_temp_fd = $v_swap;  
2270 -  
2271 - // ----- Close  
2272 - $this->privCloseFd();  
2273 -  
2274 - // ----- Close the temporary file  
2275 - @fclose($v_zip_temp_fd);  
2276 -  
2277 - // ----- Magic quotes trick  
2278 - $this->privSwapBackMagicQuotes();  
2279 -  
2280 - // ----- Delete the zip file  
2281 - // TBC : I should test the result ...  
2282 - @unlink($this->zipname);  
2283 -  
2284 - // ----- Rename the temporary file  
2285 - // TBC : I should test the result ...  
2286 - //@rename($v_zip_temp_name, $this->zipname);  
2287 - PclZipUtilRename($v_zip_temp_name, $this->zipname);  
2288 -  
2289 - // ----- Return  
2290 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2291 - return $v_result;  
2292 - }  
2293 - // --------------------------------------------------------------------------------  
2294 -  
2295 - // --------------------------------------------------------------------------------  
2296 - // Function : privOpenFd()  
2297 - // Description :  
2298 - // Parameters :  
2299 - // --------------------------------------------------------------------------------  
2300 - function privOpenFd($p_mode)  
2301 - {  
2302 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode);  
2303 - $v_result=1;  
2304 -  
2305 - // ----- Look if already open  
2306 - if ($this->zip_fd != 0)  
2307 - {  
2308 - // ----- Error log  
2309 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');  
2310 -  
2311 - // ----- Return  
2312 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
2313 - return PclZip::errorCode();  
2314 - }  
2315 -  
2316 - // ----- Open the zip file  
2317 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode');  
2318 - if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)  
2319 - {  
2320 - // ----- Error log  
2321 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');  
2322 -  
2323 - // ----- Return  
2324 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
2325 - return PclZip::errorCode();  
2326 - }  
2327 -  
2328 - // ----- Return  
2329 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2330 - return $v_result;  
2331 - }  
2332 - // --------------------------------------------------------------------------------  
2333 -  
2334 - // --------------------------------------------------------------------------------  
2335 - // Function : privCloseFd()  
2336 - // Description :  
2337 - // Parameters :  
2338 - // --------------------------------------------------------------------------------  
2339 - function privCloseFd()  
2340 - {  
2341 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", "");  
2342 - $v_result=1;  
2343 -  
2344 - if ($this->zip_fd != 0)  
2345 - @fclose($this->zip_fd);  
2346 - $this->zip_fd = 0;  
2347 -  
2348 - // ----- Return  
2349 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2350 - return $v_result;  
2351 - }  
2352 - // --------------------------------------------------------------------------------  
2353 -  
2354 - // --------------------------------------------------------------------------------  
2355 - // Function : privAddList()  
2356 - // Description :  
2357 - // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is  
2358 - // different from the real path of the file. This is usefull if you want to have PclTar  
2359 - // running in any directory, and memorize relative path from an other directory.  
2360 - // Parameters :  
2361 - // $p_list : An array containing the file or directory names to add in the tar  
2362 - // $p_result_list : list of added files with their properties (specially the status field)  
2363 - // $p_add_dir : Path to add in the filename path archived  
2364 - // $p_remove_dir : Path to remove in the filename path archived  
2365 - // Return Values :  
2366 - // --------------------------------------------------------------------------------  
2367 -// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)  
2368 - function privAddList($p_filedescr_list, &$p_result_list, &$p_options)  
2369 - {  
2370 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list");  
2371 - $v_result=1;  
2372 -  
2373 - // ----- Add the files  
2374 - $v_header_list = array();  
2375 - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)  
2376 - {  
2377 - // ----- Return  
2378 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2379 - return $v_result;  
2380 - }  
2381 -  
2382 - // ----- Store the offset of the central dir  
2383 - $v_offset = @ftell($this->zip_fd);  
2384 -  
2385 - // ----- Create the Central Dir files header  
2386 - for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)  
2387 - {  
2388 - // ----- Create the file header  
2389 - if ($v_header_list[$i]['status'] == 'ok') {  
2390 - if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {  
2391 - // ----- Return  
2392 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2393 - return $v_result;  
2394 - }  
2395 - $v_count++;  
2396 - }  
2397 -  
2398 - // ----- Transform the header to a 'usable' info  
2399 - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);  
2400 - }  
2401 -  
2402 - // ----- Zip file comment  
2403 - $v_comment = '';  
2404 - if (isset($p_options[PCLZIP_OPT_COMMENT])) {  
2405 - $v_comment = $p_options[PCLZIP_OPT_COMMENT];  
2406 - }  
2407 -  
2408 - // ----- Calculate the size of the central header  
2409 - $v_size = @ftell($this->zip_fd)-$v_offset;  
2410 -  
2411 - // ----- Create the central dir footer  
2412 - if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)  
2413 - {  
2414 - // ----- Reset the file list  
2415 - unset($v_header_list);  
2416 -  
2417 - // ----- Return  
2418 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2419 - return $v_result;  
2420 - }  
2421 -  
2422 - // ----- Return  
2423 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2424 - return $v_result;  
2425 - }  
2426 - // --------------------------------------------------------------------------------  
2427 -  
2428 - // --------------------------------------------------------------------------------  
2429 - // Function : privAddFileList()  
2430 - // Description :  
2431 - // Parameters :  
2432 - // $p_filedescr_list : An array containing the file description  
2433 - // or directory names to add in the zip  
2434 - // $p_result_list : list of added files with their properties (specially the status field)  
2435 - // Return Values :  
2436 - // --------------------------------------------------------------------------------  
2437 - function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)  
2438 - {  
2439 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "filedescr_list");  
2440 - $v_result=1;  
2441 - $v_header = array();  
2442 -  
2443 - // ----- Recuperate the current number of elt in list  
2444 - $v_nb = sizeof($p_result_list);  
2445 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have ".$v_nb." elements");  
2446 -  
2447 - // ----- Loop on the files  
2448 - for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {  
2449 - // ----- Format the filename  
2450 - $p_filedescr_list[$j]['filename']  
2451 - = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);  
2452 -  
2453 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for file '".$p_filedescr_list[$j]['filename']."'");  
2454 -  
2455 - // ----- Skip empty file names  
2456 - // TBC : Can this be possible ? not checked in DescrParseAtt ?  
2457 - if ($p_filedescr_list[$j]['filename'] == "") {  
2458 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Skip empty filename");  
2459 - continue;  
2460 - }  
2461 -  
2462 - // ----- Check the filename  
2463 - if (!file_exists($p_filedescr_list[$j]['filename'])) {  
2464 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_filedescr_list[$j]['filename']."' does not exists");  
2465 - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exists");  
2466 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
2467 - return PclZip::errorCode();  
2468 - }  
2469 -  
2470 - // ----- Look if it is a file or a dir with no all path remove option  
2471 - if ( (is_file($p_filedescr_list[$j]['filename']))  
2472 - || ( is_dir($p_filedescr_list[$j]['filename'])  
2473 - && ( !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])  
2474 - || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {  
2475 -  
2476 - // ----- Add the file  
2477 - $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,  
2478 - $p_options);  
2479 - if ($v_result != 1) {  
2480 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2481 - return $v_result;  
2482 - }  
2483 -  
2484 - // ----- Store the file infos  
2485 - $p_result_list[$v_nb++] = $v_header;  
2486 - }  
2487 - }  
2488 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have ".$v_nb." elements");  
2489 -  
2490 - // ----- Return  
2491 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2492 - return $v_result;  
2493 - }  
2494 - // --------------------------------------------------------------------------------  
2495 -  
2496 - // --------------------------------------------------------------------------------  
2497 - // Function : privAddFile()  
2498 - // Description :  
2499 - // Parameters :  
2500 - // Return Values :  
2501 - // --------------------------------------------------------------------------------  
2502 - function privAddFile($p_filedescr, &$p_header, &$p_options)  
2503 - {  
2504 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='".$p_filedescr['filename']."'");  
2505 - $v_result=1;  
2506 -  
2507 - // ----- Working variable  
2508 - $p_filename = $p_filedescr['filename'];  
2509 -  
2510 - // TBC : Already done in the fileAtt check ... ?  
2511 - if ($p_filename == "") {  
2512 - // ----- Error log  
2513 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");  
2514 -  
2515 - // ----- Return  
2516 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
2517 - return PclZip::errorCode();  
2518 - }  
2519 -  
2520 - // ----- Look for a stored different filename  
2521 - if (isset($p_filedescr['stored_filename'])) {  
2522 - $v_stored_filename = $p_filedescr['stored_filename'];  
2523 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is NOT the same "'.$v_stored_filename.'"');  
2524 - }  
2525 - else {  
2526 - $v_stored_filename = $p_filedescr['stored_filename'];  
2527 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is the same');  
2528 - }  
2529 -  
2530 - // ----- Set the file properties  
2531 - clearstatcache();  
2532 - $p_header['version'] = 20;  
2533 - $p_header['version_extracted'] = 10;  
2534 - $p_header['flag'] = 0;  
2535 - $p_header['compression'] = 0;  
2536 - $p_header['mtime'] = filemtime($p_filename);  
2537 - $p_header['crc'] = 0;  
2538 - $p_header['compressed_size'] = 0;  
2539 - $p_header['size'] = filesize($p_filename);  
2540 - $p_header['filename_len'] = strlen($p_filename);  
2541 - $p_header['extra_len'] = 0;  
2542 - $p_header['comment_len'] = 0;  
2543 - $p_header['disk'] = 0;  
2544 - $p_header['internal'] = 0;  
2545 -// $p_header['external'] = (is_file($p_filename)?0xFE49FFE0:0x41FF0010);  
2546 - $p_header['external'] = (is_file($p_filename)?0x00000000:0x00000010);  
2547 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'");  
2548 - $p_header['offset'] = 0;  
2549 - $p_header['filename'] = $p_filename;  
2550 - $p_header['stored_filename'] = $v_stored_filename;  
2551 - $p_header['extra'] = '';  
2552 - $p_header['comment'] = '';  
2553 - $p_header['status'] = 'ok';  
2554 - $p_header['index'] = -1;  
2555 -  
2556 - // ----- Look for pre-add callback  
2557 - if (isset($p_options[PCLZIP_CB_PRE_ADD])) {  
2558 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction");  
2559 -  
2560 - // ----- Generate a local information  
2561 - $v_local_header = array();  
2562 - $this->privConvertHeader2FileInfo($p_header, $v_local_header);  
2563 -  
2564 - // ----- Call the callback  
2565 - // Here I do not use call_user_func() because I need to send a reference to the  
2566 - // header.  
2567 - eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');  
2568 - if ($v_result == 0) {  
2569 - // ----- Change the file status  
2570 - $p_header['status'] = "skipped";  
2571 - $v_result = 1;  
2572 - }  
2573 -  
2574 - // ----- Update the informations  
2575 - // Only some fields can be modified  
2576 - if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {  
2577 - $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);  
2578 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'");  
2579 - }  
2580 - }  
2581 -  
2582 - // ----- Look for empty stored filename  
2583 - if ($p_header['stored_filename'] == "") {  
2584 - $p_header['status'] = "filtered";  
2585 - }  
2586 -  
2587 - // ----- Check the path length  
2588 - if (strlen($p_header['stored_filename']) > 0xFF) {  
2589 - $p_header['status'] = 'filename_too_long';  
2590 - }  
2591 -  
2592 - // ----- Look if no error, or file not skipped  
2593 - if ($p_header['status'] == 'ok') {  
2594 -  
2595 - // ----- Look for a file  
2596 - if (is_file($p_filename))  
2597 - {  
2598 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file");  
2599 - // ----- Open the source file  
2600 - if (($v_file = @fopen($p_filename, "rb")) == 0) {  
2601 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");  
2602 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
2603 - return PclZip::errorCode();  
2604 - }  
2605 -  
2606 - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {  
2607 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed");  
2608 - // ----- Read the file content  
2609 - $v_content_compressed = @fread($v_file, $p_header['size']);  
2610 -  
2611 - // ----- Calculate the CRC  
2612 - $p_header['crc'] = @crc32($v_content_compressed);  
2613 -  
2614 - // ----- Set header parameters  
2615 - $p_header['compressed_size'] = $p_header['size'];  
2616 - $p_header['compression'] = 0;  
2617 - }  
2618 - else {  
2619 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed");  
2620 - // ----- Read the file content  
2621 - $v_content = @fread($v_file, $p_header['size']);  
2622 -  
2623 - // ----- Calculate the CRC  
2624 - $p_header['crc'] = @crc32($v_content);  
2625 -  
2626 - // ----- Compress the file  
2627 - $v_content_compressed = @gzdeflate($v_content);  
2628 -  
2629 - // ----- Set header parameters  
2630 - $p_header['compressed_size'] = strlen($v_content_compressed);  
2631 - $p_header['compression'] = 8;  
2632 - }  
2633 -  
2634 - // ----- Look for encryption  
2635 - /*  
2636 - if ((isset($p_options[PCLZIP_OPT_CRYPT]))  
2637 - && ($p_options[PCLZIP_OPT_CRYPT] != "")) {  
2638 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ....");  
2639 -  
2640 - // Should be a random header  
2641 - $v_header = 'xxxxxxxxxxxx';  
2642 - $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed,  
2643 - $p_header['compressed_size'],  
2644 - $v_header,  
2645 - $p_header['crc'],  
2646 - "test");  
2647 -  
2648 - $p_header['compressed_size'] += 12;  
2649 - $p_header['flag'] = 1;  
2650 -  
2651 - // ----- Add the header to the data  
2652 - $v_content_compressed = $v_header.$v_content_compressed;  
2653 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed)."");  
2654 - }  
2655 - */  
2656 -  
2657 - // ----- Call the header generation  
2658 - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {  
2659 - @fclose($v_file);  
2660 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2661 - return $v_result;  
2662 - }  
2663 -  
2664 - // ----- Write the compressed (or not) content  
2665 - @fwrite($this->zip_fd,  
2666 - $v_content_compressed, $p_header['compressed_size']);  
2667 -  
2668 - // ----- Close the file  
2669 - @fclose($v_file);  
2670 - }  
2671 -  
2672 - // ----- Look for a directory  
2673 - else {  
2674 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder");  
2675 - // ----- Look for directory last '/'  
2676 - if (@substr($p_header['stored_filename'], -1) != '/') {  
2677 - $p_header['stored_filename'] .= '/';  
2678 - }  
2679 -  
2680 - // ----- Set the file properties  
2681 - $p_header['size'] = 0;  
2682 - //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked  
2683 - $p_header['external'] = 0x00000010; // Value for a folder : to be checked  
2684 -  
2685 - // ----- Call the header generation  
2686 - if (($v_result = $this->privWriteFileHeader($p_header)) != 1)  
2687 - {  
2688 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2689 - return $v_result;  
2690 - }  
2691 - }  
2692 - }  
2693 -  
2694 - // ----- Look for post-add callback  
2695 - if (isset($p_options[PCLZIP_CB_POST_ADD])) {  
2696 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction");  
2697 -  
2698 - // ----- Generate a local information  
2699 - $v_local_header = array();  
2700 - $this->privConvertHeader2FileInfo($p_header, $v_local_header);  
2701 -  
2702 - // ----- Call the callback  
2703 - // Here I do not use call_user_func() because I need to send a reference to the  
2704 - // header.  
2705 - eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');  
2706 - if ($v_result == 0) {  
2707 - // ----- Ignored  
2708 - $v_result = 1;  
2709 - }  
2710 -  
2711 - // ----- Update the informations  
2712 - // Nothing can be modified  
2713 - }  
2714 -  
2715 - // ----- Return  
2716 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2717 - return $v_result;  
2718 - }  
2719 - // --------------------------------------------------------------------------------  
2720 -  
2721 - // --------------------------------------------------------------------------------  
2722 - // Function : privCalculateStoredFilename()  
2723 - // Description :  
2724 - // Based on file descriptor properties and global options, this method  
2725 - // calculate the filename that will be stored in the archive.  
2726 - // Parameters :  
2727 - // Return Values :  
2728 - // --------------------------------------------------------------------------------  
2729 - function privCalculateStoredFilename(&$p_filedescr, &$p_options)  
2730 - {  
2731 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCalculateStoredFilename", "filename='".$p_filedescr['filename']."'");  
2732 - $v_result=1;  
2733 -  
2734 - // ----- Working variables  
2735 - $p_filename = $p_filedescr['filename'];  
2736 - if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {  
2737 - $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];  
2738 - }  
2739 - else {  
2740 - $p_add_dir = '';  
2741 - }  
2742 - if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {  
2743 - $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];  
2744 - }  
2745 - else {  
2746 - $p_remove_dir = '';  
2747 - }  
2748 - if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {  
2749 - $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];  
2750 - }  
2751 - else {  
2752 - $p_remove_all_dir = 0;  
2753 - }  
2754 -  
2755 - // ----- Look for full name change  
2756 - if (isset($p_filedescr['new_full_name'])) {  
2757 - $v_stored_filename = $p_filedescr['new_full_name'];  
2758 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing full name of '".$p_filename."' for '".$v_stored_filename."'");  
2759 - }  
2760 -  
2761 - // ----- Look for path and/or short name change  
2762 - else {  
2763 -  
2764 - // ----- Look for short name change  
2765 - if (isset($p_filedescr['new_short_name'])) {  
2766 - $v_path_info = pathinfo($p_filename);  
2767 - $v_dir = '';  
2768 - if ($v_path_info['dirname'] != '') {  
2769 - $v_dir = $v_path_info['dirname'].'/';  
2770 - }  
2771 - $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];  
2772 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing short name of '".$p_filename."' for '".$v_stored_filename."'");  
2773 - }  
2774 - else {  
2775 - // ----- Calculate the stored filename  
2776 - $v_stored_filename = $p_filename;  
2777 - }  
2778 -  
2779 - // ----- Look for all path to remove  
2780 - if ($p_remove_all_dir) {  
2781 - $v_stored_filename = basename($p_filename);  
2782 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove all path selected change '".$p_filename."' for '".$v_stored_filename."'");  
2783 - }  
2784 - // ----- Look for partial path remove  
2785 - else if ($p_remove_dir != "") {  
2786 - if (substr($p_remove_dir, -1) != '/')  
2787 - $p_remove_dir .= "/";  
2788 -  
2789 - if ( (substr($p_filename, 0, 2) == "./")  
2790 - || (substr($p_remove_dir, 0, 2) == "./")) {  
2791 -  
2792 - if ( (substr($p_filename, 0, 2) == "./")  
2793 - && (substr($p_remove_dir, 0, 2) != "./")) {  
2794 - $p_remove_dir = "./".$p_remove_dir;  
2795 - }  
2796 - if ( (substr($p_filename, 0, 2) != "./")  
2797 - && (substr($p_remove_dir, 0, 2) == "./")) {  
2798 - $p_remove_dir = substr($p_remove_dir, 2);  
2799 - }  
2800 - }  
2801 -  
2802 - $v_compare = PclZipUtilPathInclusion($p_remove_dir,  
2803 - $v_stored_filename);  
2804 - if ($v_compare > 0) {  
2805 - if ($v_compare == 2) {  
2806 - $v_stored_filename = "";  
2807 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder");  
2808 - }  
2809 - else {  
2810 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$v_stored_filename'");  
2811 - $v_stored_filename = substr($v_stored_filename,  
2812 - strlen($p_remove_dir));  
2813 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Result is '$v_stored_filename'");  
2814 - }  
2815 - }  
2816 - }  
2817 - // ----- Look for path to add  
2818 - if ($p_add_dir != "") {  
2819 - if (substr($p_add_dir, -1) == "/")  
2820 - $v_stored_filename = $p_add_dir.$v_stored_filename;  
2821 - else  
2822 - $v_stored_filename = $p_add_dir."/".$v_stored_filename;  
2823 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'");  
2824 - }  
2825 - }  
2826 -  
2827 - // ----- Filename (reduce the path of stored name)  
2828 - $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);  
2829 - $p_filedescr['stored_filename'] = $v_stored_filename;  
2830 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Stored filename will be '".$p_filedescr['stored_filename']."', strlen ".strlen($p_filedescr['stored_filename']));  
2831 -  
2832 - // ----- Return  
2833 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2834 - return $v_result;  
2835 - }  
2836 - // --------------------------------------------------------------------------------  
2837 -  
2838 - // --------------------------------------------------------------------------------  
2839 - // Function : privWriteFileHeader()  
2840 - // Description :  
2841 - // Parameters :  
2842 - // Return Values :  
2843 - // --------------------------------------------------------------------------------  
2844 - function privWriteFileHeader(&$p_header)  
2845 - {  
2846 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');  
2847 - $v_result=1;  
2848 -  
2849 - // ----- Store the offset position of the file  
2850 - $p_header['offset'] = ftell($this->zip_fd);  
2851 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'File offset of the header :'.$p_header['offset']);  
2852 -  
2853 - // ----- Transform UNIX mtime to DOS format mdate/mtime  
2854 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');  
2855 - $v_date = getdate($p_header['mtime']);  
2856 - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;  
2857 - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];  
2858 -  
2859 - // ----- Packed data  
2860 - $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,  
2861 - $p_header['version_extracted'], $p_header['flag'],  
2862 - $p_header['compression'], $v_mtime, $v_mdate,  
2863 - $p_header['crc'], $p_header['compressed_size'],  
2864 - $p_header['size'],  
2865 - strlen($p_header['stored_filename']),  
2866 - $p_header['extra_len']);  
2867 -  
2868 - // ----- Write the first 148 bytes of the header in the archive  
2869 - fputs($this->zip_fd, $v_binary_data, 30);  
2870 -  
2871 - // ----- Write the variable fields  
2872 - if (strlen($p_header['stored_filename']) != 0)  
2873 - {  
2874 - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));  
2875 - }  
2876 - if ($p_header['extra_len'] != 0)  
2877 - {  
2878 - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);  
2879 - }  
2880 -  
2881 - // ----- Return  
2882 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2883 - return $v_result;  
2884 - }  
2885 - // --------------------------------------------------------------------------------  
2886 -  
2887 - // --------------------------------------------------------------------------------  
2888 - // Function : privWriteCentralFileHeader()  
2889 - // Description :  
2890 - // Parameters :  
2891 - // Return Values :  
2892 - // --------------------------------------------------------------------------------  
2893 - function privWriteCentralFileHeader(&$p_header)  
2894 - {  
2895 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');  
2896 - $v_result=1;  
2897 -  
2898 - // TBC  
2899 - //for(reset($p_header); $key = key($p_header); next($p_header)) {  
2900 - // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]);  
2901 - //}  
2902 -  
2903 - // ----- Transform UNIX mtime to DOS format mdate/mtime  
2904 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');  
2905 - $v_date = getdate($p_header['mtime']);  
2906 - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;  
2907 - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];  
2908 -  
2909 - // ----- Packed data  
2910 - $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,  
2911 - $p_header['version'], $p_header['version_extracted'],  
2912 - $p_header['flag'], $p_header['compression'],  
2913 - $v_mtime, $v_mdate, $p_header['crc'],  
2914 - $p_header['compressed_size'], $p_header['size'],  
2915 - strlen($p_header['stored_filename']),  
2916 - $p_header['extra_len'], $p_header['comment_len'],  
2917 - $p_header['disk'], $p_header['internal'],  
2918 - $p_header['external'], $p_header['offset']);  
2919 -  
2920 - // ----- Write the 42 bytes of the header in the zip file  
2921 - fputs($this->zip_fd, $v_binary_data, 46);  
2922 -  
2923 - // ----- Write the variable fields  
2924 - if (strlen($p_header['stored_filename']) != 0)  
2925 - {  
2926 - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));  
2927 - }  
2928 - if ($p_header['extra_len'] != 0)  
2929 - {  
2930 - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);  
2931 - }  
2932 - if ($p_header['comment_len'] != 0)  
2933 - {  
2934 - fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);  
2935 - }  
2936 -  
2937 - // ----- Return  
2938 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2939 - return $v_result;  
2940 - }  
2941 - // --------------------------------------------------------------------------------  
2942 -  
2943 - // --------------------------------------------------------------------------------  
2944 - // Function : privWriteCentralHeader()  
2945 - // Description :  
2946 - // Parameters :  
2947 - // Return Values :  
2948 - // --------------------------------------------------------------------------------  
2949 - function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)  
2950 - {  
2951 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralHeader", 'nb_entries='.$p_nb_entries.', size='.$p_size.', offset='.$p_offset.', comment="'.$p_comment.'"');  
2952 - $v_result=1;  
2953 -  
2954 - // ----- Packed data  
2955 - $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,  
2956 - $p_nb_entries, $p_size,  
2957 - $p_offset, strlen($p_comment));  
2958 -  
2959 - // ----- Write the 22 bytes of the header in the zip file  
2960 - fputs($this->zip_fd, $v_binary_data, 22);  
2961 -  
2962 - // ----- Write the variable fields  
2963 - if (strlen($p_comment) != 0)  
2964 - {  
2965 - fputs($this->zip_fd, $p_comment, strlen($p_comment));  
2966 - }  
2967 -  
2968 - // ----- Return  
2969 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
2970 - return $v_result;  
2971 - }  
2972 - // --------------------------------------------------------------------------------  
2973 -  
2974 - // --------------------------------------------------------------------------------  
2975 - // Function : privList()  
2976 - // Description :  
2977 - // Parameters :  
2978 - // Return Values :  
2979 - // --------------------------------------------------------------------------------  
2980 - function privList(&$p_list)  
2981 - {  
2982 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privList", "list");  
2983 - $v_result=1;  
2984 -  
2985 - // ----- Magic quotes trick  
2986 - $this->privDisableMagicQuotes();  
2987 -  
2988 - // ----- Open the zip file  
2989 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
2990 - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)  
2991 - {  
2992 - // ----- Magic quotes trick  
2993 - $this->privSwapBackMagicQuotes();  
2994 -  
2995 - // ----- Error log  
2996 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');  
2997 -  
2998 - // ----- Return  
2999 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3000 - return PclZip::errorCode();  
3001 - }  
3002 -  
3003 - // ----- Read the central directory informations  
3004 - $v_central_dir = array();  
3005 - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)  
3006 - {  
3007 - $this->privSwapBackMagicQuotes();  
3008 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3009 - return $v_result;  
3010 - }  
3011 -  
3012 - // ----- Go to beginning of Central Dir  
3013 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Offset : ".$v_central_dir['offset']."'");  
3014 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");  
3015 - @rewind($this->zip_fd);  
3016 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");  
3017 - if (@fseek($this->zip_fd, $v_central_dir['offset']))  
3018 - {  
3019 - $this->privSwapBackMagicQuotes();  
3020 -  
3021 - // ----- Error log  
3022 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');  
3023 -  
3024 - // ----- Return  
3025 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3026 - return PclZip::errorCode();  
3027 - }  
3028 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");  
3029 -  
3030 - // ----- Read each entry  
3031 - for ($i=0; $i<$v_central_dir['entries']; $i++)  
3032 - {  
3033 - // ----- Read the file header  
3034 - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)  
3035 - {  
3036 - $this->privSwapBackMagicQuotes();  
3037 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3038 - return $v_result;  
3039 - }  
3040 - $v_header['index'] = $i;  
3041 -  
3042 - // ----- Get the only interesting attributes  
3043 - $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);  
3044 - unset($v_header);  
3045 - }  
3046 -  
3047 - // ----- Close the zip file  
3048 - $this->privCloseFd();  
3049 -  
3050 - // ----- Magic quotes trick  
3051 - $this->privSwapBackMagicQuotes();  
3052 -  
3053 - // ----- Return  
3054 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3055 - return $v_result;  
3056 - }  
3057 - // --------------------------------------------------------------------------------  
3058 -  
3059 - // --------------------------------------------------------------------------------  
3060 - // Function : privConvertHeader2FileInfo()  
3061 - // Description :  
3062 - // This function takes the file informations from the central directory  
3063 - // entries and extract the interesting parameters that will be given back.  
3064 - // The resulting file infos are set in the array $p_info  
3065 - // $p_info['filename'] : Filename with full path. Given by user (add),  
3066 - // extracted in the filesystem (extract).  
3067 - // $p_info['stored_filename'] : Stored filename in the archive.  
3068 - // $p_info['size'] = Size of the file.  
3069 - // $p_info['compressed_size'] = Compressed size of the file.  
3070 - // $p_info['mtime'] = Last modification date of the file.  
3071 - // $p_info['comment'] = Comment associated with the file.  
3072 - // $p_info['folder'] = true/false : indicates if the entry is a folder or not.  
3073 - // $p_info['status'] = status of the action on the file.  
3074 - // Parameters :  
3075 - // Return Values :  
3076 - // --------------------------------------------------------------------------------  
3077 - function privConvertHeader2FileInfo($p_header, &$p_info)  
3078 - {  
3079 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privConvertHeader2FileInfo", "Filename='".$p_header['filename']."'");  
3080 - $v_result=1;  
3081 -  
3082 - // ----- Get the interesting attributes  
3083 - $p_info['filename'] = $p_header['filename'];  
3084 - $p_info['stored_filename'] = $p_header['stored_filename'];  
3085 - $p_info['size'] = $p_header['size'];  
3086 - $p_info['compressed_size'] = $p_header['compressed_size'];  
3087 - $p_info['mtime'] = $p_header['mtime'];  
3088 - $p_info['comment'] = $p_header['comment'];  
3089 - $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);  
3090 - $p_info['index'] = $p_header['index'];  
3091 - $p_info['status'] = $p_header['status'];  
3092 -  
3093 - // ----- Return  
3094 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3095 - return $v_result;  
3096 - }  
3097 - // --------------------------------------------------------------------------------  
3098 -  
3099 - // --------------------------------------------------------------------------------  
3100 - // Function : privExtractByRule()  
3101 - // Description :  
3102 - // Extract a file or directory depending of rules (by index, by name, ...)  
3103 - // Parameters :  
3104 - // $p_file_list : An array where will be placed the properties of each  
3105 - // extracted file  
3106 - // $p_path : Path to add while writing the extracted files  
3107 - // $p_remove_path : Path to remove (from the file memorized path) while writing the  
3108 - // extracted files. If the path does not match the file path,  
3109 - // the file is extracted with its memorized path.  
3110 - // $p_remove_path does not apply to 'list' mode.  
3111 - // $p_path and $p_remove_path are commulative.  
3112 - // Return Values :  
3113 - // 1 on success,0 or less on error (see error code list)  
3114 - // --------------------------------------------------------------------------------  
3115 - function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)  
3116 - {  
3117 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privExtractByRule", "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");  
3118 - $v_result=1;  
3119 -  
3120 - // ----- Magic quotes trick  
3121 - $this->privDisableMagicQuotes();  
3122 -  
3123 - // ----- Check the path  
3124 - if ( ($p_path == "")  
3125 - || ( (substr($p_path, 0, 1) != "/")  
3126 - && (substr($p_path, 0, 3) != "../")  
3127 - && (substr($p_path,1,2)!=":/")))  
3128 - $p_path = "./".$p_path;  
3129 -  
3130 - // ----- Reduce the path last (and duplicated) '/'  
3131 - if (($p_path != "./") && ($p_path != "/"))  
3132 - {  
3133 - // ----- Look for the path end '/'  
3134 - while (substr($p_path, -1) == "/")  
3135 - {  
3136 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'");  
3137 - $p_path = substr($p_path, 0, strlen($p_path)-1);  
3138 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]");  
3139 - }  
3140 - }  
3141 -  
3142 - // ----- Look for path to remove format (should end by /)  
3143 - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))  
3144 - {  
3145 - $p_remove_path .= '/';  
3146 - }  
3147 - $p_remove_path_size = strlen($p_remove_path);  
3148 -  
3149 - // ----- Open the zip file  
3150 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
3151 - if (($v_result = $this->privOpenFd('rb')) != 1)  
3152 - {  
3153 - $this->privSwapBackMagicQuotes();  
3154 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3155 - return $v_result;  
3156 - }  
3157 -  
3158 - // ----- Read the central directory informations  
3159 - $v_central_dir = array();  
3160 - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)  
3161 - {  
3162 - // ----- Close the zip file  
3163 - $this->privCloseFd();  
3164 - $this->privSwapBackMagicQuotes();  
3165 -  
3166 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3167 - return $v_result;  
3168 - }  
3169 -  
3170 - // ----- Start at beginning of Central Dir  
3171 - $v_pos_entry = $v_central_dir['offset'];  
3172 -  
3173 - // ----- Read each entry  
3174 - $j_start = 0;  
3175 - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)  
3176 - {  
3177 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry : '$i'");  
3178 -  
3179 - // ----- Read next Central dir entry  
3180 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position before rewind : ".ftell($this->zip_fd)."'");  
3181 - @rewind($this->zip_fd);  
3182 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position after rewind : ".ftell($this->zip_fd)."'");  
3183 - if (@fseek($this->zip_fd, $v_pos_entry))  
3184 - {  
3185 - // ----- Close the zip file  
3186 - $this->privCloseFd();  
3187 - $this->privSwapBackMagicQuotes();  
3188 -  
3189 - // ----- Error log  
3190 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');  
3191 -  
3192 - // ----- Return  
3193 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3194 - return PclZip::errorCode();  
3195 - }  
3196 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position after fseek : ".ftell($this->zip_fd)."'");  
3197 -  
3198 - // ----- Read the file header  
3199 - $v_header = array();  
3200 - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)  
3201 - {  
3202 - // ----- Close the zip file  
3203 - $this->privCloseFd();  
3204 - $this->privSwapBackMagicQuotes();  
3205 -  
3206 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3207 - return $v_result;  
3208 - }  
3209 -  
3210 - // ----- Store the index  
3211 - $v_header['index'] = $i;  
3212 -  
3213 - // ----- Store the file position  
3214 - $v_pos_entry = ftell($this->zip_fd);  
3215 -  
3216 - // ----- Look for the specific extract rules  
3217 - $v_extract = false;  
3218 -  
3219 - // ----- Look for extract by name rule  
3220 - if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))  
3221 - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {  
3222 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");  
3223 -  
3224 - // ----- Look if the filename is in the list  
3225 - for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {  
3226 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");  
3227 -  
3228 - // ----- Look for a directory  
3229 - if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {  
3230 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");  
3231 -  
3232 - // ----- Look if the directory is in the filename path  
3233 - if ( (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))  
3234 - && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {  
3235 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");  
3236 - $v_extract = true;  
3237 - }  
3238 - }  
3239 - // ----- Look for a filename  
3240 - elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {  
3241 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");  
3242 - $v_extract = true;  
3243 - }  
3244 - }  
3245 - }  
3246 -  
3247 - // ----- Look for extract by ereg rule  
3248 - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG]))  
3249 - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {  
3250 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");  
3251 -  
3252 - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {  
3253 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");  
3254 - $v_extract = true;  
3255 - }  
3256 - }  
3257 -  
3258 - // ----- Look for extract by preg rule  
3259 - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG]))  
3260 - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {  
3261 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");  
3262 -  
3263 - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {  
3264 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");  
3265 - $v_extract = true;  
3266 - }  
3267 - }  
3268 -  
3269 - // ----- Look for extract by index rule  
3270 - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX]))  
3271 - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {  
3272 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");  
3273 -  
3274 - // ----- Look if the index is in the list  
3275 - for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {  
3276 - //--(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']."]");  
3277 -  
3278 - if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {  
3279 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");  
3280 - $v_extract = true;  
3281 - }  
3282 - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {  
3283 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");  
3284 - $j_start = $j+1;  
3285 - }  
3286 -  
3287 - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {  
3288 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");  
3289 - break;  
3290 - }  
3291 - }  
3292 - }  
3293 -  
3294 - // ----- Look for no rule, which means extract all the archive  
3295 - else {  
3296 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with no rule (extract all)");  
3297 - $v_extract = true;  
3298 - }  
3299 -  
3300 - // ----- Check compression method  
3301 - if ( ($v_extract)  
3302 - && ( ($v_header['compression'] != 8)  
3303 - && ($v_header['compression'] != 0))) {  
3304 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported compression method (".$v_header['compression'].")");  
3305 - $v_header['status'] = 'unsupported_compression';  
3306 -  
3307 - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR  
3308 - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))  
3309 - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {  
3310 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");  
3311 -  
3312 - $this->privSwapBackMagicQuotes();  
3313 -  
3314 - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,  
3315 - "Filename '".$v_header['stored_filename']."' is "  
3316 - ."compressed by an unsupported compression "  
3317 - ."method (".$v_header['compression'].") ");  
3318 -  
3319 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3320 - return PclZip::errorCode();  
3321 - }  
3322 - }  
3323 -  
3324 - // ----- Check encrypted files  
3325 - if (($v_extract) && (($v_header['flag'] & 1) == 1)) {  
3326 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported file encryption");  
3327 - $v_header['status'] = 'unsupported_encryption';  
3328 -  
3329 - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR  
3330 - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))  
3331 - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {  
3332 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");  
3333 -  
3334 - $this->privSwapBackMagicQuotes();  
3335 -  
3336 - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,  
3337 - "Unsupported encryption for "  
3338 - ." filename '".$v_header['stored_filename']  
3339 - ."'");  
3340 -  
3341 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3342 - return PclZip::errorCode();  
3343 - }  
3344 - }  
3345 -  
3346 - // ----- Look for real extraction  
3347 - if (($v_extract) && ($v_header['status'] != 'ok')) {  
3348 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "No need for extract");  
3349 - $v_result = $this->privConvertHeader2FileInfo($v_header,  
3350 - $p_file_list[$v_nb_extracted++]);  
3351 - if ($v_result != 1) {  
3352 - $this->privCloseFd();  
3353 - $this->privSwapBackMagicQuotes();  
3354 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3355 - return $v_result;  
3356 - }  
3357 -  
3358 - $v_extract = false;  
3359 - }  
3360 -  
3361 - // ----- Look for real extraction  
3362 - if ($v_extract)  
3363 - {  
3364 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file '".$v_header['filename']."', index '$i'");  
3365 -  
3366 - // ----- Go to the file position  
3367 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");  
3368 - @rewind($this->zip_fd);  
3369 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");  
3370 - if (@fseek($this->zip_fd, $v_header['offset']))  
3371 - {  
3372 - // ----- Close the zip file  
3373 - $this->privCloseFd();  
3374 -  
3375 - $this->privSwapBackMagicQuotes();  
3376 -  
3377 - // ----- Error log  
3378 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');  
3379 -  
3380 - // ----- Return  
3381 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3382 - return PclZip::errorCode();  
3383 - }  
3384 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");  
3385 -  
3386 - // ----- Look for extraction as string  
3387 - if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {  
3388 -  
3389 - // ----- Extracting the file  
3390 - $v_result1 = $this->privExtractFileAsString($v_header, $v_string);  
3391 - if ($v_result1 < 1) {  
3392 - $this->privCloseFd();  
3393 - $this->privSwapBackMagicQuotes();  
3394 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);  
3395 - return $v_result1;  
3396 - }  
3397 -  
3398 - // ----- Get the only interesting attributes  
3399 - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)  
3400 - {  
3401 - // ----- Close the zip file  
3402 - $this->privCloseFd();  
3403 - $this->privSwapBackMagicQuotes();  
3404 -  
3405 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3406 - return $v_result;  
3407 - }  
3408 -  
3409 - // ----- Set the file content  
3410 - $p_file_list[$v_nb_extracted]['content'] = $v_string;  
3411 -  
3412 - // ----- Next extracted file  
3413 - $v_nb_extracted++;  
3414 -  
3415 - // ----- Look for user callback abort  
3416 - if ($v_result1 == 2) {  
3417 - break;  
3418 - }  
3419 - }  
3420 - // ----- Look for extraction in standard output  
3421 - elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))  
3422 - && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {  
3423 - // ----- Extracting the file in standard output  
3424 - $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);  
3425 - if ($v_result1 < 1) {  
3426 - $this->privCloseFd();  
3427 - $this->privSwapBackMagicQuotes();  
3428 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);  
3429 - return $v_result1;  
3430 - }  
3431 -  
3432 - // ----- Get the only interesting attributes  
3433 - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {  
3434 - $this->privCloseFd();  
3435 - $this->privSwapBackMagicQuotes();  
3436 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3437 - return $v_result;  
3438 - }  
3439 -  
3440 - // ----- Look for user callback abort  
3441 - if ($v_result1 == 2) {  
3442 - break;  
3443 - }  
3444 - }  
3445 - // ----- Look for normal extraction  
3446 - else {  
3447 - // ----- Extracting the file  
3448 - $v_result1 = $this->privExtractFile($v_header,  
3449 - $p_path, $p_remove_path,  
3450 - $p_remove_all_path,  
3451 - $p_options);  
3452 - if ($v_result1 < 1) {  
3453 - $this->privCloseFd();  
3454 - $this->privSwapBackMagicQuotes();  
3455 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);  
3456 - return $v_result1;  
3457 - }  
3458 -  
3459 - // ----- Get the only interesting attributes  
3460 - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)  
3461 - {  
3462 - // ----- Close the zip file  
3463 - $this->privCloseFd();  
3464 - $this->privSwapBackMagicQuotes();  
3465 -  
3466 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3467 - return $v_result;  
3468 - }  
3469 -  
3470 - // ----- Look for user callback abort  
3471 - if ($v_result1 == 2) {  
3472 - break;  
3473 - }  
3474 - }  
3475 - }  
3476 - }  
3477 -  
3478 - // ----- Close the zip file  
3479 - $this->privCloseFd();  
3480 - $this->privSwapBackMagicQuotes();  
3481 -  
3482 - // ----- Return  
3483 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3484 - return $v_result;  
3485 - }  
3486 - // --------------------------------------------------------------------------------  
3487 -  
3488 - // --------------------------------------------------------------------------------  
3489 - // Function : privExtractFile()  
3490 - // Description :  
3491 - // Parameters :  
3492 - // Return Values :  
3493 - //  
3494 - // 1 : ... ?  
3495 - // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback  
3496 - // --------------------------------------------------------------------------------  
3497 - function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)  
3498 - {  
3499 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFile', "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");  
3500 - $v_result=1;  
3501 -  
3502 - // ----- Read the file header  
3503 - if (($v_result = $this->privReadFileHeader($v_header)) != 1)  
3504 - {  
3505 - // ----- Return  
3506 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3507 - return $v_result;  
3508 - }  
3509 -  
3510 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");  
3511 -  
3512 - // ----- Check that the file header is coherent with $p_entry info  
3513 - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {  
3514 - // TBC  
3515 - }  
3516 -  
3517 - // ----- Look for all path to remove  
3518 - if ($p_remove_all_path == true) {  
3519 - // ----- Look for folder entry that not need to be extracted  
3520 - if (($p_entry['external']&0x00000010)==0x00000010) {  
3521 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The entry is a folder : need to be filtered");  
3522 -  
3523 - $p_entry['status'] = "filtered";  
3524 -  
3525 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3526 - return $v_result;  
3527 - }  
3528 -  
3529 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "All path is removed");  
3530 - // ----- Get the basename of the path  
3531 - $p_entry['filename'] = basename($p_entry['filename']);  
3532 - }  
3533 -  
3534 - // ----- Look for path to remove  
3535 - else if ($p_remove_path != "")  
3536 - {  
3537 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look for some path to remove");  
3538 - if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)  
3539 - {  
3540 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The folder is the same as the removed path '".$p_entry['filename']."'");  
3541 -  
3542 - // ----- Change the file status  
3543 - $p_entry['status'] = "filtered";  
3544 -  
3545 - // ----- Return  
3546 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3547 - return $v_result;  
3548 - }  
3549 -  
3550 - $p_remove_path_size = strlen($p_remove_path);  
3551 - if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)  
3552 - {  
3553 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '".$p_entry['filename']."'");  
3554 -  
3555 - // ----- Remove the path  
3556 - $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);  
3557 -  
3558 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Resulting file is '".$p_entry['filename']."'");  
3559 - }  
3560 - }  
3561 -  
3562 - // ----- Add the path  
3563 - if ($p_path != '') {  
3564 - $p_entry['filename'] = $p_path."/".$p_entry['filename'];  
3565 - }  
3566 -  
3567 - // ----- Check a base_dir_restriction  
3568 - if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {  
3569 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Check the extract directory restriction");  
3570 - $v_inclusion  
3571 - = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],  
3572 - $p_entry['filename']);  
3573 - if ($v_inclusion == 0) {  
3574 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_EXTRACT_DIR_RESTRICTION is selected, file is outside restriction");  
3575 -  
3576 - PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,  
3577 - "Filename '".$p_entry['filename']."' is "  
3578 - ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");  
3579 -  
3580 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3581 - return PclZip::errorCode();  
3582 - }  
3583 - }  
3584 -  
3585 - // ----- Look for pre-extract callback  
3586 - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {  
3587 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");  
3588 -  
3589 - // ----- Generate a local information  
3590 - $v_local_header = array();  
3591 - $this->privConvertHeader2FileInfo($p_entry, $v_local_header);  
3592 -  
3593 - // ----- Call the callback  
3594 - // Here I do not use call_user_func() because I need to send a reference to the  
3595 - // header.  
3596 - eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');  
3597 - if ($v_result == 0) {  
3598 - // ----- Change the file status  
3599 - $p_entry['status'] = "skipped";  
3600 - $v_result = 1;  
3601 - }  
3602 -  
3603 - // ----- Look for abort result  
3604 - if ($v_result == 2) {  
3605 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");  
3606 - // ----- This status is internal and will be changed in 'skipped'  
3607 - $p_entry['status'] = "aborted";  
3608 - $v_result = PCLZIP_ERR_USER_ABORTED;  
3609 - }  
3610 -  
3611 - // ----- Update the informations  
3612 - // Only some fields can be modified  
3613 - $p_entry['filename'] = $v_local_header['filename'];  
3614 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");  
3615 - }  
3616 -  
3617 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");  
3618 -  
3619 - // ----- Look if extraction should be done  
3620 - if ($p_entry['status'] == 'ok') {  
3621 -  
3622 - // ----- Look for specific actions while the file exist  
3623 - if (file_exists($p_entry['filename']))  
3624 - {  
3625 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_entry['filename']."' already exists");  
3626 -  
3627 - // ----- Look if file is a directory  
3628 - if (is_dir($p_entry['filename']))  
3629 - {  
3630 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is a directory");  
3631 -  
3632 - // ----- Change the file status  
3633 - $p_entry['status'] = "already_a_directory";  
3634 -  
3635 - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR  
3636 - // For historical reason first PclZip implementation does not stop  
3637 - // when this kind of error occurs.  
3638 - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))  
3639 - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {  
3640 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");  
3641 -  
3642 - PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,  
3643 - "Filename '".$p_entry['filename']."' is "  
3644 - ."already used by an existing directory");  
3645 -  
3646 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3647 - return PclZip::errorCode();  
3648 - }  
3649 - }  
3650 - // ----- Look if file is write protected  
3651 - else if (!is_writeable($p_entry['filename']))  
3652 - {  
3653 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is write protected");  
3654 -  
3655 - // ----- Change the file status  
3656 - $p_entry['status'] = "write_protected";  
3657 -  
3658 - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR  
3659 - // For historical reason first PclZip implementation does not stop  
3660 - // when this kind of error occurs.  
3661 - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))  
3662 - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {  
3663 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");  
3664 -  
3665 - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,  
3666 - "Filename '".$p_entry['filename']."' exists "  
3667 - ."and is write protected");  
3668 -  
3669 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3670 - return PclZip::errorCode();  
3671 - }  
3672 - }  
3673 -  
3674 - // ----- Look if the extracted file is older  
3675 - else if (filemtime($p_entry['filename']) > $p_entry['mtime'])  
3676 - {  
3677 - //--(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']).")");  
3678 - // ----- Change the file status  
3679 - if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))  
3680 - && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {  
3681 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_REPLACE_NEWER is selected, file will be replaced");  
3682 - }  
3683 - else {  
3684 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be replaced");  
3685 - $p_entry['status'] = "newer_exist";  
3686 -  
3687 - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR  
3688 - // For historical reason first PclZip implementation does not stop  
3689 - // when this kind of error occurs.  
3690 - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))  
3691 - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {  
3692 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");  
3693 -  
3694 - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,  
3695 - "Newer version of '".$p_entry['filename']."' exists "  
3696 - ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");  
3697 -  
3698 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
3699 - return PclZip::errorCode();  
3700 - }  
3701 - }  
3702 - }  
3703 - else {  
3704 - //--(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']).")");  
3705 - }  
3706 - }  
3707 -  
3708 - // ----- Check the directory availability and create it if necessary  
3709 - else {  
3710 - if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))  
3711 - $v_dir_to_check = $p_entry['filename'];  
3712 - else if (!strstr($p_entry['filename'], "/"))  
3713 - $v_dir_to_check = "";  
3714 - else  
3715 - $v_dir_to_check = dirname($p_entry['filename']);  
3716 -  
3717 - if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {  
3718 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '".$p_entry['filename']."'");  
3719 -  
3720 - // ----- Change the file status  
3721 - $p_entry['status'] = "path_creation_fail";  
3722 -  
3723 - // ----- Return  
3724 - ////--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3725 - //return $v_result;  
3726 - $v_result = 1;  
3727 - }  
3728 - }  
3729 - }  
3730 -  
3731 - // ----- Look if extraction should be done  
3732 - if ($p_entry['status'] == 'ok') {  
3733 -  
3734 - // ----- Do the extraction (if not a folder)  
3735 - if (!(($p_entry['external']&0x00000010)==0x00000010))  
3736 - {  
3737 - // ----- Look for not compressed file  
3738 - if ($p_entry['compression'] == 0) {  
3739 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");  
3740 -  
3741 - // ----- Opening destination file  
3742 - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)  
3743 - {  
3744 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");  
3745 -  
3746 - // ----- Change the file status  
3747 - $p_entry['status'] = "write_error";  
3748 -  
3749 - // ----- Return  
3750 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3751 - return $v_result;  
3752 - }  
3753 -  
3754 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read '".$p_entry['size']."' bytes");  
3755 -  
3756 - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks  
3757 - $v_size = $p_entry['compressed_size'];  
3758 - while ($v_size != 0)  
3759 - {  
3760 - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);  
3761 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes");  
3762 - $v_buffer = @fread($this->zip_fd, $v_read_size);  
3763 - /* Try to speed up the code  
3764 - $v_binary_data = pack('a'.$v_read_size, $v_buffer);  
3765 - @fwrite($v_dest_file, $v_binary_data, $v_read_size);  
3766 - */  
3767 - @fwrite($v_dest_file, $v_buffer, $v_read_size);  
3768 - $v_size -= $v_read_size;  
3769 - }  
3770 -  
3771 - // ----- Closing the destination file  
3772 - fclose($v_dest_file);  
3773 -  
3774 - // ----- Change the file mtime  
3775 - touch($p_entry['filename'], $p_entry['mtime']);  
3776 -  
3777 -  
3778 - }  
3779 - else {  
3780 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (Compression method ".$p_entry['compression'].")");  
3781 - // ----- TBC  
3782 - // Need to be finished  
3783 - if (($p_entry['flag'] & 1) == 1) {  
3784 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File is encrypted");  
3785 - /*  
3786 - // ----- Read the encryption header  
3787 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read 12 encryption header bytes");  
3788 - $v_encryption_header = @fread($this->zip_fd, 12);  
3789 -  
3790 - // ----- Read the encrypted & compressed file in a buffer  
3791 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".($p_entry['compressed_size']-12)."' compressed & encrypted bytes");  
3792 - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']-12);  
3793 -  
3794 - // ----- Decrypt the buffer  
3795 - $this->privDecrypt($v_encryption_header, $v_buffer,  
3796 - $p_entry['compressed_size']-12, $p_entry['crc']);  
3797 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Buffer is '".$v_buffer."'");  
3798 - */  
3799 - }  
3800 - else {  
3801 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".$p_entry['compressed_size']."' compressed bytes");  
3802 - // ----- Read the compressed file in a buffer (one shot)  
3803 - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);  
3804 - }  
3805 -  
3806 - // ----- Decompress the file  
3807 - $v_file_content = @gzinflate($v_buffer);  
3808 - unset($v_buffer);  
3809 - if ($v_file_content === FALSE) {  
3810 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to inflate compressed file");  
3811 -  
3812 - // ----- Change the file status  
3813 - // TBC  
3814 - $p_entry['status'] = "error";  
3815 -  
3816 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3817 - return $v_result;  
3818 - }  
3819 -  
3820 - // ----- Opening destination file  
3821 - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {  
3822 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");  
3823 -  
3824 - // ----- Change the file status  
3825 - $p_entry['status'] = "write_error";  
3826 -  
3827 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3828 - return $v_result;  
3829 - }  
3830 -  
3831 - // ----- Write the uncompressed data  
3832 - @fwrite($v_dest_file, $v_file_content, $p_entry['size']);  
3833 - unset($v_file_content);  
3834 -  
3835 - // ----- Closing the destination file  
3836 - @fclose($v_dest_file);  
3837 -  
3838 - // ----- Change the file mtime  
3839 - @touch($p_entry['filename'], $p_entry['mtime']);  
3840 - }  
3841 -  
3842 - // ----- Look for chmod option  
3843 - if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {  
3844 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "chmod option activated '".$p_options[PCLZIP_OPT_SET_CHMOD]."'");  
3845 -  
3846 - // ----- Change the mode of the file  
3847 - @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);  
3848 - }  
3849 -  
3850 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");  
3851 - }  
3852 - }  
3853 -  
3854 - // ----- Change abort status  
3855 - if ($p_entry['status'] == "aborted") {  
3856 - $p_entry['status'] = "skipped";  
3857 - }  
3858 -  
3859 - // ----- Look for post-extract callback  
3860 - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {  
3861 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");  
3862 -  
3863 - // ----- Generate a local information  
3864 - $v_local_header = array();  
3865 - $this->privConvertHeader2FileInfo($p_entry, $v_local_header);  
3866 -  
3867 - // ----- Call the callback  
3868 - // Here I do not use call_user_func() because I need to send a reference to the  
3869 - // header.  
3870 - eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');  
3871 -  
3872 - // ----- Look for abort result  
3873 - if ($v_result == 2) {  
3874 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");  
3875 - $v_result = PCLZIP_ERR_USER_ABORTED;  
3876 - }  
3877 - }  
3878 -  
3879 - // ----- Return  
3880 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3881 - return $v_result;  
3882 - }  
3883 - // --------------------------------------------------------------------------------  
3884 -  
3885 - // --------------------------------------------------------------------------------  
3886 - // Function : privExtractFileInOutput()  
3887 - // Description :  
3888 - // Parameters :  
3889 - // Return Values :  
3890 - // --------------------------------------------------------------------------------  
3891 - function privExtractFileInOutput(&$p_entry, &$p_options)  
3892 - {  
3893 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileInOutput', "");  
3894 - $v_result=1;  
3895 -  
3896 - // ----- Read the file header  
3897 - if (($v_result = $this->privReadFileHeader($v_header)) != 1) {  
3898 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
3899 - return $v_result;  
3900 - }  
3901 -  
3902 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");  
3903 -  
3904 - // ----- Check that the file header is coherent with $p_entry info  
3905 - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {  
3906 - // TBC  
3907 - }  
3908 -  
3909 - // ----- Look for pre-extract callback  
3910 - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {  
3911 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");  
3912 -  
3913 - // ----- Generate a local information  
3914 - $v_local_header = array();  
3915 - $this->privConvertHeader2FileInfo($p_entry, $v_local_header);  
3916 -  
3917 - // ----- Call the callback  
3918 - // Here I do not use call_user_func() because I need to send a reference to the  
3919 - // header.  
3920 - eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');  
3921 - if ($v_result == 0) {  
3922 - // ----- Change the file status  
3923 - $p_entry['status'] = "skipped";  
3924 - $v_result = 1;  
3925 - }  
3926 -  
3927 - // ----- Look for abort result  
3928 - if ($v_result == 2) {  
3929 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");  
3930 - // ----- This status is internal and will be changed in 'skipped'  
3931 - $p_entry['status'] = "aborted";  
3932 - $v_result = PCLZIP_ERR_USER_ABORTED;  
3933 - }  
3934 -  
3935 - // ----- Update the informations  
3936 - // Only some fields can be modified  
3937 - $p_entry['filename'] = $v_local_header['filename'];  
3938 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");  
3939 - }  
3940 -  
3941 - // ----- Trace  
3942 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");  
3943 -  
3944 - // ----- Look if extraction should be done  
3945 - if ($p_entry['status'] == 'ok') {  
3946 -  
3947 - // ----- Do the extraction (if not a folder)  
3948 - if (!(($p_entry['external']&0x00000010)==0x00000010)) {  
3949 - // ----- Look for not compressed file  
3950 - if ($p_entry['compressed_size'] == $p_entry['size']) {  
3951 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");  
3952 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");  
3953 -  
3954 - // ----- Read the file in a buffer (one shot)  
3955 - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);  
3956 -  
3957 - // ----- Send the file to the output  
3958 - echo $v_buffer;  
3959 - unset($v_buffer);  
3960 - }  
3961 - else {  
3962 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file");  
3963 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Reading '".$p_entry['size']."' bytes");  
3964 -  
3965 - // ----- Read the compressed file in a buffer (one shot)  
3966 - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);  
3967 -  
3968 - // ----- Decompress the file  
3969 - $v_file_content = gzinflate($v_buffer);  
3970 - unset($v_buffer);  
3971 -  
3972 - // ----- Send the file to the output  
3973 - echo $v_file_content;  
3974 - unset($v_file_content);  
3975 - }  
3976 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");  
3977 - }  
3978 - }  
3979 -  
3980 - // ----- Change abort status  
3981 - if ($p_entry['status'] == "aborted") {  
3982 - $p_entry['status'] = "skipped";  
3983 - }  
3984 -  
3985 - // ----- Look for post-extract callback  
3986 - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {  
3987 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");  
3988 -  
3989 - // ----- Generate a local information  
3990 - $v_local_header = array();  
3991 - $this->privConvertHeader2FileInfo($p_entry, $v_local_header);  
3992 -  
3993 - // ----- Call the callback  
3994 - // Here I do not use call_user_func() because I need to send a reference to the  
3995 - // header.  
3996 - eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');  
3997 -  
3998 - // ----- Look for abort result  
3999 - if ($v_result == 2) {  
4000 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");  
4001 - $v_result = PCLZIP_ERR_USER_ABORTED;  
4002 - }  
4003 - }  
4004 -  
4005 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4006 - return $v_result;  
4007 - }  
4008 - // --------------------------------------------------------------------------------  
4009 -  
4010 - // --------------------------------------------------------------------------------  
4011 - // Function : privExtractFileAsString()  
4012 - // Description :  
4013 - // Parameters :  
4014 - // Return Values :  
4015 - // --------------------------------------------------------------------------------  
4016 - function privExtractFileAsString(&$p_entry, &$p_string)  
4017 - {  
4018 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileAsString', "p_entry['filename']='".$p_entry['filename']."'");  
4019 - $v_result=1;  
4020 -  
4021 - // ----- Read the file header  
4022 - $v_header = array();  
4023 - if (($v_result = $this->privReadFileHeader($v_header)) != 1)  
4024 - {  
4025 - // ----- Return  
4026 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4027 - return $v_result;  
4028 - }  
4029 -  
4030 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");  
4031 -  
4032 - // ----- Check that the file header is coherent with $p_entry info  
4033 - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {  
4034 - // TBC  
4035 - }  
4036 -  
4037 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file in string (with path) '".$p_entry['filename']."', size '$v_header[size]'");  
4038 -  
4039 - // ----- Do the extraction (if not a folder)  
4040 - if (!(($p_entry['external']&0x00000010)==0x00000010))  
4041 - {  
4042 - // ----- Look for not compressed file  
4043 -// if ($p_entry['compressed_size'] == $p_entry['size'])  
4044 - if ($p_entry['compression'] == 0) {  
4045 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");  
4046 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");  
4047 -  
4048 - // ----- Reading the file  
4049 - $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);  
4050 - }  
4051 - else {  
4052 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (compression method '".$p_entry['compression']."')");  
4053 -  
4054 - // ----- Reading the file  
4055 - $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);  
4056 -  
4057 - // ----- Decompress the file  
4058 - if (($p_string = @gzinflate($v_data)) === FALSE) {  
4059 - // TBC  
4060 - }  
4061 - }  
4062 -  
4063 - // ----- Trace  
4064 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");  
4065 - }  
4066 - else {  
4067 - // TBC : error : can not extract a folder in a string  
4068 - }  
4069 -  
4070 - // ----- Return  
4071 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4072 - return $v_result;  
4073 - }  
4074 - // --------------------------------------------------------------------------------  
4075 -  
4076 - // --------------------------------------------------------------------------------  
4077 - // Function : privReadFileHeader()  
4078 - // Description :  
4079 - // Parameters :  
4080 - // Return Values :  
4081 - // --------------------------------------------------------------------------------  
4082 - function privReadFileHeader(&$p_header)  
4083 - {  
4084 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadFileHeader", "");  
4085 - $v_result=1;  
4086 -  
4087 - // ----- Read the 4 bytes signature  
4088 - $v_binary_data = @fread($this->zip_fd, 4);  
4089 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");  
4090 - $v_data = unpack('Vid', $v_binary_data);  
4091 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");  
4092 -  
4093 - // ----- Check signature  
4094 - if ($v_data['id'] != 0x04034b50)  
4095 - {  
4096 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid File header");  
4097 -  
4098 - // ----- Error log  
4099 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');  
4100 -  
4101 - // ----- Return  
4102 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4103 - return PclZip::errorCode();  
4104 - }  
4105 -  
4106 - // ----- Read the first 42 bytes of the header  
4107 - $v_binary_data = fread($this->zip_fd, 26);  
4108 -  
4109 - // ----- Look for invalid block size  
4110 - if (strlen($v_binary_data) != 26)  
4111 - {  
4112 - $p_header['filename'] = "";  
4113 - $p_header['status'] = "invalid_header";  
4114 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));  
4115 -  
4116 - // ----- Error log  
4117 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));  
4118 -  
4119 - // ----- Return  
4120 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4121 - return PclZip::errorCode();  
4122 - }  
4123 -  
4124 - // ----- Extract the values  
4125 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header : '".$v_binary_data."'");  
4126 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header (Hex) : '".bin2hex($v_binary_data)."'");  
4127 - $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);  
4128 -  
4129 - // ----- Get filename  
4130 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "File name length : ".$v_data['filename_len']);  
4131 - $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);  
4132 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename : \''.$p_header['filename'].'\'');  
4133 -  
4134 - // ----- Get extra_fields  
4135 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extra field length : ".$v_data['extra_len']);  
4136 - if ($v_data['extra_len'] != 0) {  
4137 - $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);  
4138 - }  
4139 - else {  
4140 - $p_header['extra'] = '';  
4141 - }  
4142 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Extra field : \''.bin2hex($p_header['extra']).'\'');  
4143 -  
4144 - // ----- Extract properties  
4145 - $p_header['version_extracted'] = $v_data['version'];  
4146 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : ('.$p_header['version_extracted'].') \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');  
4147 - $p_header['compression'] = $v_data['compression'];  
4148 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compression method : \''.$p_header['compression'].'\'');  
4149 - $p_header['size'] = $v_data['size'];  
4150 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_header['size'].'\'');  
4151 - $p_header['compressed_size'] = $v_data['compressed_size'];  
4152 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_header['compressed_size'].'\'');  
4153 - $p_header['crc'] = $v_data['crc'];  
4154 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');  
4155 - $p_header['flag'] = $v_data['flag'];  
4156 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag : \''.$p_header['flag'].'\'');  
4157 - $p_header['filename_len'] = $v_data['filename_len'];  
4158 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename_len : \''.$p_header['filename_len'].'\'');  
4159 -  
4160 - // ----- Recuperate date in UNIX format  
4161 - $p_header['mdate'] = $v_data['mdate'];  
4162 - $p_header['mtime'] = $v_data['mtime'];  
4163 - if ($p_header['mdate'] && $p_header['mtime'])  
4164 - {  
4165 - // ----- Extract time  
4166 - $v_hour = ($p_header['mtime'] & 0xF800) >> 11;  
4167 - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;  
4168 - $v_seconde = ($p_header['mtime'] & 0x001F)*2;  
4169 -  
4170 - // ----- Extract date  
4171 - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;  
4172 - $v_month = ($p_header['mdate'] & 0x01E0) >> 5;  
4173 - $v_day = $p_header['mdate'] & 0x001F;  
4174 -  
4175 - // ----- Get UNIX date format  
4176 - $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);  
4177 -  
4178 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');  
4179 - }  
4180 - else  
4181 - {  
4182 - $p_header['mtime'] = time();  
4183 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');  
4184 - }  
4185 -  
4186 - // TBC  
4187 - //for(reset($v_data); $key = key($v_data); next($v_data)) {  
4188 - // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Attribut[$key] = ".$v_data[$key]);  
4189 - //}  
4190 -  
4191 - // ----- Set the stored filename  
4192 - $p_header['stored_filename'] = $p_header['filename'];  
4193 -  
4194 - // ----- Set the status field  
4195 - $p_header['status'] = "ok";  
4196 -  
4197 - // ----- Return  
4198 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4199 - return $v_result;  
4200 - }  
4201 - // --------------------------------------------------------------------------------  
4202 -  
4203 - // --------------------------------------------------------------------------------  
4204 - // Function : privReadCentralFileHeader()  
4205 - // Description :  
4206 - // Parameters :  
4207 - // Return Values :  
4208 - // --------------------------------------------------------------------------------  
4209 - function privReadCentralFileHeader(&$p_header)  
4210 - {  
4211 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadCentralFileHeader", "");  
4212 - $v_result=1;  
4213 -  
4214 - // ----- Read the 4 bytes signature  
4215 - $v_binary_data = @fread($this->zip_fd, 4);  
4216 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");  
4217 - $v_data = unpack('Vid', $v_binary_data);  
4218 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");  
4219 -  
4220 - // ----- Check signature  
4221 - if ($v_data['id'] != 0x02014b50)  
4222 - {  
4223 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid Central Dir File signature");  
4224 -  
4225 - // ----- Error log  
4226 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');  
4227 -  
4228 - // ----- Return  
4229 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4230 - return PclZip::errorCode();  
4231 - }  
4232 -  
4233 - // ----- Read the first 42 bytes of the header  
4234 - $v_binary_data = fread($this->zip_fd, 42);  
4235 -  
4236 - // ----- Look for invalid block size  
4237 - if (strlen($v_binary_data) != 42)  
4238 - {  
4239 - $p_header['filename'] = "";  
4240 - $p_header['status'] = "invalid_header";  
4241 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));  
4242 -  
4243 - // ----- Error log  
4244 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));  
4245 -  
4246 - // ----- Return  
4247 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4248 - return PclZip::errorCode();  
4249 - }  
4250 -  
4251 - // ----- Extract the values  
4252 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header : '".$v_binary_data."'");  
4253 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header (Hex) : '".bin2hex($v_binary_data)."'");  
4254 - $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);  
4255 -  
4256 - // ----- Get filename  
4257 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']);  
4258 - if ($p_header['filename_len'] != 0)  
4259 - $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);  
4260 - else  
4261 - $p_header['filename'] = '';  
4262 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Filename : \''.$p_header['filename'].'\'');  
4263 -  
4264 - // ----- Get extra  
4265 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Extra length : ".$p_header['extra_len']);  
4266 - if ($p_header['extra_len'] != 0)  
4267 - $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);  
4268 - else  
4269 - $p_header['extra'] = '';  
4270 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Extra : \''.$p_header['extra'].'\'');  
4271 -  
4272 - // ----- Get comment  
4273 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Comment length : ".$p_header['comment_len']);  
4274 - if ($p_header['comment_len'] != 0)  
4275 - $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);  
4276 - else  
4277 - $p_header['comment'] = '';  
4278 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Comment : \''.$p_header['comment'].'\'');  
4279 -  
4280 - // ----- Extract properties  
4281 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version : \''.($p_header['version']/10).'.'.($p_header['version']%10).'\'');  
4282 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');  
4283 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Size : \''.$p_header['size'].'\'');  
4284 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Compressed Size : \''.$p_header['compressed_size'].'\'');  
4285 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');  
4286 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Flag : \''.$p_header['flag'].'\'');  
4287 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Offset : \''.$p_header['offset'].'\'');  
4288 -  
4289 - // ----- Recuperate date in UNIX format  
4290 - if ($p_header['mdate'] && $p_header['mtime'])  
4291 - {  
4292 - // ----- Extract time  
4293 - $v_hour = ($p_header['mtime'] & 0xF800) >> 11;  
4294 - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;  
4295 - $v_seconde = ($p_header['mtime'] & 0x001F)*2;  
4296 -  
4297 - // ----- Extract date  
4298 - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;  
4299 - $v_month = ($p_header['mdate'] & 0x01E0) >> 5;  
4300 - $v_day = $p_header['mdate'] & 0x001F;  
4301 -  
4302 - // ----- Get UNIX date format  
4303 - $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);  
4304 -  
4305 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');  
4306 - }  
4307 - else  
4308 - {  
4309 - $p_header['mtime'] = time();  
4310 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');  
4311 - }  
4312 -  
4313 - // ----- Set the stored filename  
4314 - $p_header['stored_filename'] = $p_header['filename'];  
4315 -  
4316 - // ----- Set default status to ok  
4317 - $p_header['status'] = 'ok';  
4318 -  
4319 - // ----- Look if it is a directory  
4320 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Internal (Hex) : '".sprintf("Ox%04X", $p_header['internal'])."'");  
4321 - //--(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').')');  
4322 - if (substr($p_header['filename'], -1) == '/') {  
4323 - //$p_header['external'] = 0x41FF0010;  
4324 - $p_header['external'] = 0x00000010;  
4325 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Force folder external : \''.sprintf("Ox%04X", $p_header['external']).'\'');  
4326 - }  
4327 -  
4328 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Header of filename : \''.$p_header['filename'].'\'');  
4329 -  
4330 - // ----- Return  
4331 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4332 - return $v_result;  
4333 - }  
4334 - // --------------------------------------------------------------------------------  
4335 -  
4336 - // --------------------------------------------------------------------------------  
4337 - // Function : privCheckFileHeaders()  
4338 - // Description :  
4339 - // Parameters :  
4340 - // Return Values :  
4341 - // 1 on success,  
4342 - // 0 on error;  
4343 - // --------------------------------------------------------------------------------  
4344 - function privCheckFileHeaders(&$p_local_header, &$p_central_header)  
4345 - {  
4346 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFileHeaders", "");  
4347 - $v_result=1;  
4348 -  
4349 - // ----- Check the static values  
4350 - // TBC  
4351 - if ($p_local_header['filename'] != $p_central_header['filename']) {  
4352 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename" : TBC To Be Completed');  
4353 - }  
4354 - if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {  
4355 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "version_extracted" : TBC To Be Completed');  
4356 - }  
4357 - if ($p_local_header['flag'] != $p_central_header['flag']) {  
4358 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "flag" : TBC To Be Completed');  
4359 - }  
4360 - if ($p_local_header['compression'] != $p_central_header['compression']) {  
4361 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "compression" : TBC To Be Completed');  
4362 - }  
4363 - if ($p_local_header['mtime'] != $p_central_header['mtime']) {  
4364 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "mtime" : TBC To Be Completed');  
4365 - }  
4366 - if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {  
4367 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename_len" : TBC To Be Completed');  
4368 - }  
4369 -  
4370 - // ----- Look for flag bit 3  
4371 - if (($p_local_header['flag'] & 8) == 8) {  
4372 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Purpose bit flag bit 3 set !');  
4373 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'File size, compression size and crc found in central header');  
4374 - $p_local_header['size'] = $p_central_header['size'];  
4375 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_local_header['size'].'\'');  
4376 - $p_local_header['compressed_size'] = $p_central_header['compressed_size'];  
4377 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_local_header['compressed_size'].'\'');  
4378 - $p_local_header['crc'] = $p_central_header['crc'];  
4379 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_local_header['crc']).'\'');  
4380 - }  
4381 -  
4382 - // ----- Return  
4383 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4384 - return $v_result;  
4385 - }  
4386 - // --------------------------------------------------------------------------------  
4387 -  
4388 - // --------------------------------------------------------------------------------  
4389 - // Function : privReadEndCentralDir()  
4390 - // Description :  
4391 - // Parameters :  
4392 - // Return Values :  
4393 - // --------------------------------------------------------------------------------  
4394 - function privReadEndCentralDir(&$p_central_dir)  
4395 - {  
4396 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadEndCentralDir", "");  
4397 - $v_result=1;  
4398 -  
4399 - // ----- Go to the end of the zip file  
4400 - $v_size = filesize($this->zipname);  
4401 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size of the file :$v_size");  
4402 - @fseek($this->zip_fd, $v_size);  
4403 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position at end of zip file : \''.ftell($this->zip_fd).'\'');  
4404 - if (@ftell($this->zip_fd) != $v_size)  
4405 - {  
4406 - // ----- Error log  
4407 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');  
4408 -  
4409 - // ----- Return  
4410 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4411 - return PclZip::errorCode();  
4412 - }  
4413 -  
4414 - // ----- First try : look if this is an archive with no commentaries (most of the time)  
4415 - // in this case the end of central dir is at 22 bytes of the file end  
4416 - $v_found = 0;  
4417 - if ($v_size > 26) {  
4418 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Look for central dir with no comment');  
4419 - @fseek($this->zip_fd, $v_size-22);  
4420 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after min central position : \''.ftell($this->zip_fd).'\'');  
4421 - if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))  
4422 - {  
4423 - // ----- Error log  
4424 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');  
4425 -  
4426 - // ----- Return  
4427 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4428 - return PclZip::errorCode();  
4429 - }  
4430 -  
4431 - // ----- Read for bytes  
4432 - $v_binary_data = @fread($this->zip_fd, 4);  
4433 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");  
4434 - $v_data = @unpack('Vid', $v_binary_data);  
4435 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");  
4436 -  
4437 - // ----- Check signature  
4438 - if ($v_data['id'] == 0x06054b50) {  
4439 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found central dir at the default position.");  
4440 - $v_found = 1;  
4441 - }  
4442 -  
4443 - $v_pos = ftell($this->zip_fd);  
4444 - }  
4445 -  
4446 - // ----- Go back to the maximum possible size of the Central Dir End Record  
4447 - if (!$v_found) {  
4448 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Start extended search of end central dir');  
4449 - $v_maximum_size = 65557; // 0xFFFF + 22;  
4450 - if ($v_maximum_size > $v_size)  
4451 - $v_maximum_size = $v_size;  
4452 - @fseek($this->zip_fd, $v_size-$v_maximum_size);  
4453 - if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))  
4454 - {  
4455 - // ----- Error log  
4456 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');  
4457 -  
4458 - // ----- Return  
4459 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4460 - return PclZip::errorCode();  
4461 - }  
4462 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after max central position : \''.ftell($this->zip_fd).'\'');  
4463 -  
4464 - // ----- Read byte per byte in order to find the signature  
4465 - $v_pos = ftell($this->zip_fd);  
4466 - $v_bytes = 0x00000000;  
4467 - while ($v_pos < $v_size)  
4468 - {  
4469 - // ----- Read a byte  
4470 - $v_byte = @fread($this->zip_fd, 1);  
4471 -  
4472 - // ----- Add the byte  
4473 - $v_bytes = ($v_bytes << 8) | Ord($v_byte);  
4474 -  
4475 - // ----- Compare the bytes  
4476 - if ($v_bytes == 0x504b0506)  
4477 - {  
4478 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Found End Central Dir signature at position : \''.ftell($this->zip_fd).'\'');  
4479 - $v_pos++;  
4480 - break;  
4481 - }  
4482 -  
4483 - $v_pos++;  
4484 - }  
4485 -  
4486 - // ----- Look if not found end of central dir  
4487 - if ($v_pos == $v_size)  
4488 - {  
4489 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to find End of Central Dir Record signature");  
4490 -  
4491 - // ----- Error log  
4492 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");  
4493 -  
4494 - // ----- Return  
4495 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4496 - return PclZip::errorCode();  
4497 - }  
4498 - }  
4499 -  
4500 - // ----- Read the first 18 bytes of the header  
4501 - $v_binary_data = fread($this->zip_fd, 18);  
4502 -  
4503 - // ----- Look for invalid block size  
4504 - if (strlen($v_binary_data) != 18)  
4505 - {  
4506 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));  
4507 -  
4508 - // ----- Error log  
4509 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));  
4510 -  
4511 - // ----- Return  
4512 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4513 - return PclZip::errorCode();  
4514 - }  
4515 -  
4516 - // ----- Extract the values  
4517 - ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record : '".$v_binary_data."'");  
4518 - ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record (Hex) : '".bin2hex($v_binary_data)."'");  
4519 - $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);  
4520 -  
4521 - // ----- Check the global size  
4522 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Comment length : ".$v_data['comment_size']);  
4523 - if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {  
4524 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The central dir is not at the end of the archive. Some trailing bytes exists after the archive.");  
4525 -  
4526 - // ----- Removed in release 2.2 see readme file  
4527 - // The check of the file size is a little too strict.  
4528 - // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.  
4529 - // While decrypted, zip has training 0 bytes  
4530 - if (0) {  
4531 - // ----- Error log  
4532 - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,  
4533 - 'The central dir is not at the end of the archive.'  
4534 - .' Some trailing bytes exists after the archive.');  
4535 -  
4536 - // ----- Return  
4537 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4538 - return PclZip::errorCode();  
4539 - }  
4540 - }  
4541 -  
4542 - // ----- Get comment  
4543 - if ($v_data['comment_size'] != 0)  
4544 - $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);  
4545 - else  
4546 - $p_central_dir['comment'] = '';  
4547 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment : \''.$p_central_dir['comment'].'\'');  
4548 -  
4549 - $p_central_dir['entries'] = $v_data['entries'];  
4550 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries : \''.$p_central_dir['entries'].'\'');  
4551 - $p_central_dir['disk_entries'] = $v_data['disk_entries'];  
4552 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries for this disk : \''.$p_central_dir['disk_entries'].'\'');  
4553 - $p_central_dir['offset'] = $v_data['offset'];  
4554 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Offset of Central Dir : \''.$p_central_dir['offset'].'\'');  
4555 - $p_central_dir['size'] = $v_data['size'];  
4556 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size of Central Dir : \''.$p_central_dir['size'].'\'');  
4557 - $p_central_dir['disk'] = $v_data['disk'];  
4558 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Disk number : \''.$p_central_dir['disk'].'\'');  
4559 - $p_central_dir['disk_start'] = $v_data['disk_start'];  
4560 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Start disk number : \''.$p_central_dir['disk_start'].'\'');  
4561 -  
4562 - // TBC  
4563 - //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {  
4564 - // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "central_dir[$key] = ".$p_central_dir[$key]);  
4565 - //}  
4566 -  
4567 - // ----- Return  
4568 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4569 - return $v_result;  
4570 - }  
4571 - // --------------------------------------------------------------------------------  
4572 -  
4573 - // --------------------------------------------------------------------------------  
4574 - // Function : privDeleteByRule()  
4575 - // Description :  
4576 - // Parameters :  
4577 - // Return Values :  
4578 - // --------------------------------------------------------------------------------  
4579 - function privDeleteByRule(&$p_result_list, &$p_options)  
4580 - {  
4581 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDeleteByRule", "");  
4582 - $v_result=1;  
4583 - $v_list_detail = array();  
4584 -  
4585 - // ----- Open the zip file  
4586 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
4587 - if (($v_result=$this->privOpenFd('rb')) != 1)  
4588 - {  
4589 - // ----- Return  
4590 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4591 - return $v_result;  
4592 - }  
4593 -  
4594 - // ----- Read the central directory informations  
4595 - $v_central_dir = array();  
4596 - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)  
4597 - {  
4598 - $this->privCloseFd();  
4599 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4600 - return $v_result;  
4601 - }  
4602 -  
4603 - // ----- Go to beginning of File  
4604 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");  
4605 - @rewind($this->zip_fd);  
4606 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");  
4607 -  
4608 - // ----- Scan all the files  
4609 - // ----- Start at beginning of Central Dir  
4610 - $v_pos_entry = $v_central_dir['offset'];  
4611 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");  
4612 - @rewind($this->zip_fd);  
4613 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");  
4614 - if (@fseek($this->zip_fd, $v_pos_entry))  
4615 - {  
4616 - // ----- Close the zip file  
4617 - $this->privCloseFd();  
4618 -  
4619 - // ----- Error log  
4620 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');  
4621 -  
4622 - // ----- Return  
4623 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4624 - return PclZip::errorCode();  
4625 - }  
4626 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");  
4627 -  
4628 - // ----- Read each entry  
4629 - $v_header_list = array();  
4630 - $j_start = 0;  
4631 - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)  
4632 - {  
4633 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry (index '$i')");  
4634 -  
4635 - // ----- Read the file header  
4636 - $v_header_list[$v_nb_extracted] = array();  
4637 - if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)  
4638 - {  
4639 - // ----- Close the zip file  
4640 - $this->privCloseFd();  
4641 -  
4642 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4643 - return $v_result;  
4644 - }  
4645 -  
4646 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename (index '$i') : '".$v_header_list[$v_nb_extracted]['stored_filename']."'");  
4647 -  
4648 - // ----- Store the index  
4649 - $v_header_list[$v_nb_extracted]['index'] = $i;  
4650 -  
4651 - // ----- Look for the specific extract rules  
4652 - $v_found = false;  
4653 -  
4654 - // ----- Look for extract by name rule  
4655 - if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))  
4656 - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {  
4657 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");  
4658 -  
4659 - // ----- Look if the filename is in the list  
4660 - for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {  
4661 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");  
4662 -  
4663 - // ----- Look for a directory  
4664 - if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {  
4665 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");  
4666 -  
4667 - // ----- Look if the directory is in the filename path  
4668 - if ( (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))  
4669 - && (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])) {  
4670 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");  
4671 - $v_found = true;  
4672 - }  
4673 - elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */  
4674 - && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {  
4675 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The entry is the searched directory");  
4676 - $v_found = true;  
4677 - }  
4678 - }  
4679 - // ----- Look for a filename  
4680 - elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {  
4681 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");  
4682 - $v_found = true;  
4683 - }  
4684 - }  
4685 - }  
4686 -  
4687 - // ----- Look for extract by ereg rule  
4688 - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG]))  
4689 - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {  
4690 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");  
4691 -  
4692 - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {  
4693 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");  
4694 - $v_found = true;  
4695 - }  
4696 - }  
4697 -  
4698 - // ----- Look for extract by preg rule  
4699 - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG]))  
4700 - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {  
4701 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");  
4702 -  
4703 - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $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 index rule  
4710 - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX]))  
4711 - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {  
4712 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");  
4713 -  
4714 - // ----- Look if the index is in the list  
4715 - for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {  
4716 - //--(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']."]");  
4717 -  
4718 - if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {  
4719 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");  
4720 - $v_found = true;  
4721 - }  
4722 - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {  
4723 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");  
4724 - $j_start = $j+1;  
4725 - }  
4726 -  
4727 - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {  
4728 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");  
4729 - break;  
4730 - }  
4731 - }  
4732 - }  
4733 - else {  
4734 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "No argument mean remove all file");  
4735 - $v_found = true;  
4736 - }  
4737 -  
4738 - // ----- Look for deletion  
4739 - if ($v_found)  
4740 - {  
4741 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' need to be deleted");  
4742 - unset($v_header_list[$v_nb_extracted]);  
4743 - }  
4744 - else  
4745 - {  
4746 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' will not be deleted");  
4747 - $v_nb_extracted++;  
4748 - }  
4749 - }  
4750 -  
4751 - // ----- Look if something need to be deleted  
4752 - if ($v_nb_extracted > 0) {  
4753 -  
4754 - // ----- Creates a temporay file  
4755 - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';  
4756 -  
4757 - // ----- Creates a temporary zip archive  
4758 - $v_temp_zip = new PclZip($v_zip_temp_name);  
4759 -  
4760 - // ----- Open the temporary zip file in write mode  
4761 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary write mode");  
4762 - if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {  
4763 - $this->privCloseFd();  
4764 -  
4765 - // ----- Return  
4766 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4767 - return $v_result;  
4768 - }  
4769 -  
4770 - // ----- Look which file need to be kept  
4771 - for ($i=0; $i<sizeof($v_header_list); $i++) {  
4772 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Keep entry index '$i' : '".$v_header_list[$i]['filename']."'");  
4773 -  
4774 - // ----- Calculate the position of the header  
4775 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset='". $v_header_list[$i]['offset']."'");  
4776 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");  
4777 - @rewind($this->zip_fd);  
4778 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");  
4779 - if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {  
4780 - // ----- Close the zip file  
4781 - $this->privCloseFd();  
4782 - $v_temp_zip->privCloseFd();  
4783 - @unlink($v_zip_temp_name);  
4784 -  
4785 - // ----- Error log  
4786 - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');  
4787 -  
4788 - // ----- Return  
4789 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4790 - return PclZip::errorCode();  
4791 - }  
4792 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");  
4793 -  
4794 - // ----- Read the file header  
4795 - $v_local_header = array();  
4796 - if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {  
4797 - // ----- Close the zip file  
4798 - $this->privCloseFd();  
4799 - $v_temp_zip->privCloseFd();  
4800 - @unlink($v_zip_temp_name);  
4801 -  
4802 - // ----- Return  
4803 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4804 - return $v_result;  
4805 - }  
4806 -  
4807 - // ----- Check that local file header is same as central file header  
4808 - if ($this->privCheckFileHeaders($v_local_header,  
4809 - $v_header_list[$i]) != 1) {  
4810 - // TBC  
4811 - }  
4812 - unset($v_local_header);  
4813 -  
4814 - // ----- Write the file header  
4815 - if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {  
4816 - // ----- Close the zip file  
4817 - $this->privCloseFd();  
4818 - $v_temp_zip->privCloseFd();  
4819 - @unlink($v_zip_temp_name);  
4820 -  
4821 - // ----- Return  
4822 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4823 - return $v_result;  
4824 - }  
4825 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset for this file is '".$v_header_list[$i]['offset']."'");  
4826 -  
4827 - // ----- Read/write the data block  
4828 - if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {  
4829 - // ----- Close the zip file  
4830 - $this->privCloseFd();  
4831 - $v_temp_zip->privCloseFd();  
4832 - @unlink($v_zip_temp_name);  
4833 -  
4834 - // ----- Return  
4835 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4836 - return $v_result;  
4837 - }  
4838 - }  
4839 -  
4840 - // ----- Store the offset of the central dir  
4841 - $v_offset = @ftell($v_temp_zip->zip_fd);  
4842 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "New offset of central dir : $v_offset");  
4843 -  
4844 - // ----- Re-Create the Central Dir files header  
4845 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the new central directory");  
4846 - for ($i=0; $i<sizeof($v_header_list); $i++) {  
4847 - // ----- Create the file header  
4848 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset of file : ".$v_header_list[$i]['offset']);  
4849 - if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {  
4850 - $v_temp_zip->privCloseFd();  
4851 - $this->privCloseFd();  
4852 - @unlink($v_zip_temp_name);  
4853 -  
4854 - // ----- Return  
4855 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4856 - return $v_result;  
4857 - }  
4858 -  
4859 - // ----- Transform the header to a 'usable' info  
4860 - $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);  
4861 - }  
4862 -  
4863 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the central directory footer");  
4864 -  
4865 - // ----- Zip file comment  
4866 - $v_comment = '';  
4867 - if (isset($p_options[PCLZIP_OPT_COMMENT])) {  
4868 - $v_comment = $p_options[PCLZIP_OPT_COMMENT];  
4869 - }  
4870 -  
4871 - // ----- Calculate the size of the central header  
4872 - $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;  
4873 -  
4874 - // ----- Create the central dir footer  
4875 - if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {  
4876 - // ----- Reset the file list  
4877 - unset($v_header_list);  
4878 - $v_temp_zip->privCloseFd();  
4879 - $this->privCloseFd();  
4880 - @unlink($v_zip_temp_name);  
4881 -  
4882 - // ----- Return  
4883 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4884 - return $v_result;  
4885 - }  
4886 -  
4887 - // ----- Close  
4888 - $v_temp_zip->privCloseFd();  
4889 - $this->privCloseFd();  
4890 -  
4891 - // ----- Delete the zip file  
4892 - // TBC : I should test the result ...  
4893 - @unlink($this->zipname);  
4894 -  
4895 - // ----- Rename the temporary file  
4896 - // TBC : I should test the result ...  
4897 - //@rename($v_zip_temp_name, $this->zipname);  
4898 - PclZipUtilRename($v_zip_temp_name, $this->zipname);  
4899 -  
4900 - // ----- Destroy the temporary archive  
4901 - unset($v_temp_zip);  
4902 - }  
4903 -  
4904 - // ----- Remove every files : reset the file  
4905 - else if ($v_central_dir['entries'] != 0) {  
4906 - $this->privCloseFd();  
4907 -  
4908 - if (($v_result = $this->privOpenFd('wb')) != 1) {  
4909 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4910 - return $v_result;  
4911 - }  
4912 -  
4913 - if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {  
4914 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4915 - return $v_result;  
4916 - }  
4917 -  
4918 - $this->privCloseFd();  
4919 - }  
4920 -  
4921 - // ----- Return  
4922 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4923 - return $v_result;  
4924 - }  
4925 - // --------------------------------------------------------------------------------  
4926 -  
4927 - // --------------------------------------------------------------------------------  
4928 - // Function : privDirCheck()  
4929 - // Description :  
4930 - // Check if a directory exists, if not it creates it and all the parents directory  
4931 - // which may be useful.  
4932 - // Parameters :  
4933 - // $p_dir : Directory path to check.  
4934 - // Return Values :  
4935 - // 1 : OK  
4936 - // -1 : Unable to create directory  
4937 - // --------------------------------------------------------------------------------  
4938 - function privDirCheck($p_dir, $p_is_dir=false)  
4939 - {  
4940 - $v_result = 1;  
4941 -  
4942 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'");  
4943 -  
4944 - // ----- Remove the final '/'  
4945 - if (($p_is_dir) && (substr($p_dir, -1)=='/'))  
4946 - {  
4947 - $p_dir = substr($p_dir, 0, strlen($p_dir)-1);  
4948 - }  
4949 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'");  
4950 -  
4951 - // ----- Check the directory availability  
4952 - if ((is_dir($p_dir)) || ($p_dir == ""))  
4953 - {  
4954 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory");  
4955 - return 1;  
4956 - }  
4957 -  
4958 - // ----- Extract parent directory  
4959 - $p_parent_dir = dirname($p_dir);  
4960 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'");  
4961 -  
4962 - // ----- Just a check  
4963 - if ($p_parent_dir != $p_dir)  
4964 - {  
4965 - // ----- Look for parent directory  
4966 - if ($p_parent_dir != "")  
4967 - {  
4968 - if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)  
4969 - {  
4970 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
4971 - return $v_result;  
4972 - }  
4973 - }  
4974 - }  
4975 -  
4976 - // ----- Create the directory  
4977 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'");  
4978 - if (!@mkdir($p_dir, 0777))  
4979 - {  
4980 - // ----- Error log  
4981 - PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");  
4982 -  
4983 - // ----- Return  
4984 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
4985 - return PclZip::errorCode();  
4986 - }  
4987 -  
4988 - // ----- Return  
4989 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created");  
4990 - return $v_result;  
4991 - }  
4992 - // --------------------------------------------------------------------------------  
4993 -  
4994 - // --------------------------------------------------------------------------------  
4995 - // Function : privMerge()  
4996 - // Description :  
4997 - // If $p_archive_to_add does not exist, the function exit with a success result.  
4998 - // Parameters :  
4999 - // Return Values :  
5000 - // --------------------------------------------------------------------------------  
5001 - function privMerge(&$p_archive_to_add)  
5002 - {  
5003 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privMerge", "archive='".$p_archive_to_add->zipname."'");  
5004 - $v_result=1;  
5005 -  
5006 - // ----- Look if the archive_to_add exists  
5007 - if (!is_file($p_archive_to_add->zipname))  
5008 - {  
5009 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to add does not exist. End of merge.");  
5010 -  
5011 - // ----- Nothing to merge, so merge is a success  
5012 - $v_result = 1;  
5013 -  
5014 - // ----- Return  
5015 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5016 - return $v_result;  
5017 - }  
5018 -  
5019 - // ----- Look if the archive exists  
5020 - if (!is_file($this->zipname))  
5021 - {  
5022 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, duplicate the archive_to_add.");  
5023 -  
5024 - // ----- Do a duplicate  
5025 - $v_result = $this->privDuplicate($p_archive_to_add->zipname);  
5026 -  
5027 - // ----- Return  
5028 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5029 - return $v_result;  
5030 - }  
5031 -  
5032 - // ----- Open the zip file  
5033 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
5034 - if (($v_result=$this->privOpenFd('rb')) != 1)  
5035 - {  
5036 - // ----- Return  
5037 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5038 - return $v_result;  
5039 - }  
5040 -  
5041 - // ----- Read the central directory informations  
5042 - $v_central_dir = array();  
5043 - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)  
5044 - {  
5045 - $this->privCloseFd();  
5046 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5047 - return $v_result;  
5048 - }  
5049 -  
5050 - // ----- Go to beginning of File  
5051 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");  
5052 - @rewind($this->zip_fd);  
5053 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");  
5054 -  
5055 - // ----- Open the archive_to_add file  
5056 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open archive_to_add in binary read mode");  
5057 - if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)  
5058 - {  
5059 - $this->privCloseFd();  
5060 -  
5061 - // ----- Return  
5062 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5063 - return $v_result;  
5064 - }  
5065 -  
5066 - // ----- Read the central directory informations  
5067 - $v_central_dir_to_add = array();  
5068 - if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)  
5069 - {  
5070 - $this->privCloseFd();  
5071 - $p_archive_to_add->privCloseFd();  
5072 -  
5073 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5074 - return $v_result;  
5075 - }  
5076 -  
5077 - // ----- Go to beginning of File  
5078 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");  
5079 - @rewind($p_archive_to_add->zip_fd);  
5080 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");  
5081 -  
5082 - // ----- Creates a temporay file  
5083 - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';  
5084 -  
5085 - // ----- Open the temporary file in write mode  
5086 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
5087 - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)  
5088 - {  
5089 - $this->privCloseFd();  
5090 - $p_archive_to_add->privCloseFd();  
5091 -  
5092 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');  
5093 -  
5094 - // ----- Return  
5095 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
5096 - return PclZip::errorCode();  
5097 - }  
5098 -  
5099 - // ----- Copy the files from the archive to the temporary file  
5100 - // TBC : Here I should better append the file and go back to erase the central dir  
5101 - $v_size = $v_central_dir['offset'];  
5102 - while ($v_size != 0)  
5103 - {  
5104 - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);  
5105 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");  
5106 - $v_buffer = fread($this->zip_fd, $v_read_size);  
5107 - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);  
5108 - $v_size -= $v_read_size;  
5109 - }  
5110 -  
5111 - // ----- Copy the files from the archive_to_add into the temporary file  
5112 - $v_size = $v_central_dir_to_add['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($p_archive_to_add->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 - // ----- Store the offset of the central dir  
5123 - $v_offset = @ftell($v_zip_temp_fd);  
5124 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");  
5125 -  
5126 - // ----- Copy the block of file headers from the old archive  
5127 - $v_size = $v_central_dir['size'];  
5128 - while ($v_size != 0)  
5129 - {  
5130 - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);  
5131 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");  
5132 - $v_buffer = @fread($this->zip_fd, $v_read_size);  
5133 - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);  
5134 - $v_size -= $v_read_size;  
5135 - }  
5136 -  
5137 - // ----- Copy the block of file headers from the archive_to_add  
5138 - $v_size = $v_central_dir_to_add['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($p_archive_to_add->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 - // ----- Merge the file comments  
5149 - $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];  
5150 -  
5151 - // ----- Calculate the size of the (new) central header  
5152 - $v_size = @ftell($v_zip_temp_fd)-$v_offset;  
5153 -  
5154 - // ----- Swap the file descriptor  
5155 - // Here is a trick : I swap the temporary fd with the zip fd, in order to use  
5156 - // the following methods on the temporary fil and not the real archive fd  
5157 - $v_swap = $this->zip_fd;  
5158 - $this->zip_fd = $v_zip_temp_fd;  
5159 - $v_zip_temp_fd = $v_swap;  
5160 -  
5161 - // ----- Create the central dir footer  
5162 - if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)  
5163 - {  
5164 - $this->privCloseFd();  
5165 - $p_archive_to_add->privCloseFd();  
5166 - @fclose($v_zip_temp_fd);  
5167 - $this->zip_fd = null;  
5168 -  
5169 - // ----- Reset the file list  
5170 - unset($v_header_list);  
5171 -  
5172 - // ----- Return  
5173 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5174 - return $v_result;  
5175 - }  
5176 -  
5177 - // ----- Swap back the file descriptor  
5178 - $v_swap = $this->zip_fd;  
5179 - $this->zip_fd = $v_zip_temp_fd;  
5180 - $v_zip_temp_fd = $v_swap;  
5181 -  
5182 - // ----- Close  
5183 - $this->privCloseFd();  
5184 - $p_archive_to_add->privCloseFd();  
5185 -  
5186 - // ----- Close the temporary file  
5187 - @fclose($v_zip_temp_fd);  
5188 -  
5189 - // ----- Delete the zip file  
5190 - // TBC : I should test the result ...  
5191 - @unlink($this->zipname);  
5192 -  
5193 - // ----- Rename the temporary file  
5194 - // TBC : I should test the result ...  
5195 - //@rename($v_zip_temp_name, $this->zipname);  
5196 - PclZipUtilRename($v_zip_temp_name, $this->zipname);  
5197 -  
5198 - // ----- Return  
5199 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5200 - return $v_result;  
5201 - }  
5202 - // --------------------------------------------------------------------------------  
5203 -  
5204 - // --------------------------------------------------------------------------------  
5205 - // Function : privDuplicate()  
5206 - // Description :  
5207 - // Parameters :  
5208 - // Return Values :  
5209 - // --------------------------------------------------------------------------------  
5210 - function privDuplicate($p_archive_filename)  
5211 - {  
5212 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'");  
5213 - $v_result=1;  
5214 -  
5215 - // ----- Look if the $p_archive_filename exists  
5216 - if (!is_file($p_archive_filename))  
5217 - {  
5218 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate.");  
5219 -  
5220 - // ----- Nothing to duplicate, so duplicate is a success.  
5221 - $v_result = 1;  
5222 -  
5223 - // ----- Return  
5224 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5225 - return $v_result;  
5226 - }  
5227 -  
5228 - // ----- Open the zip file  
5229 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
5230 - if (($v_result=$this->privOpenFd('wb')) != 1)  
5231 - {  
5232 - // ----- Return  
5233 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5234 - return $v_result;  
5235 - }  
5236 -  
5237 - // ----- Open the temporary file in write mode  
5238 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");  
5239 - if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)  
5240 - {  
5241 - $this->privCloseFd();  
5242 -  
5243 - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');  
5244 -  
5245 - // ----- Return  
5246 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());  
5247 - return PclZip::errorCode();  
5248 - }  
5249 -  
5250 - // ----- Copy the files from the archive to the temporary file  
5251 - // TBC : Here I should better append the file and go back to erase the central dir  
5252 - $v_size = filesize($p_archive_filename);  
5253 - while ($v_size != 0)  
5254 - {  
5255 - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);  
5256 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes");  
5257 - $v_buffer = fread($v_zip_temp_fd, $v_read_size);  
5258 - @fwrite($this->zip_fd, $v_buffer, $v_read_size);  
5259 - $v_size -= $v_read_size;  
5260 - }  
5261 -  
5262 - // ----- Close  
5263 - $this->privCloseFd();  
5264 -  
5265 - // ----- Close the temporary file  
5266 - @fclose($v_zip_temp_fd);  
5267 -  
5268 - // ----- Return  
5269 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5270 - return $v_result;  
5271 - }  
5272 - // --------------------------------------------------------------------------------  
5273 -  
5274 - // --------------------------------------------------------------------------------  
5275 - // Function : privErrorLog()  
5276 - // Description :  
5277 - // Parameters :  
5278 - // --------------------------------------------------------------------------------  
5279 - function privErrorLog($p_error_code=0, $p_error_string='')  
5280 - {  
5281 - if (PCLZIP_ERROR_EXTERNAL == 1) {  
5282 - PclError($p_error_code, $p_error_string);  
5283 - }  
5284 - else {  
5285 - $this->error_code = $p_error_code;  
5286 - $this->error_string = $p_error_string;  
5287 - }  
5288 - }  
5289 - // --------------------------------------------------------------------------------  
5290 -  
5291 - // --------------------------------------------------------------------------------  
5292 - // Function : privErrorReset()  
5293 - // Description :  
5294 - // Parameters :  
5295 - // --------------------------------------------------------------------------------  
5296 - function privErrorReset()  
5297 - {  
5298 - if (PCLZIP_ERROR_EXTERNAL == 1) {  
5299 - PclErrorReset();  
5300 - }  
5301 - else {  
5302 - $this->error_code = 0;  
5303 - $this->error_string = '';  
5304 - }  
5305 - }  
5306 - // --------------------------------------------------------------------------------  
5307 -  
5308 - // --------------------------------------------------------------------------------  
5309 - // Function : privDecrypt()  
5310 - // Description :  
5311 - // Parameters :  
5312 - // Return Values :  
5313 - // --------------------------------------------------------------------------------  
5314 - function privDecrypt($p_encryption_header, &$p_buffer, $p_size, $p_crc)  
5315 - {  
5316 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDecrypt', "size=".$p_size."");  
5317 - $v_result=1;  
5318 -  
5319 - // ----- To Be Modified ;-)  
5320 - $v_pwd = "test";  
5321 -  
5322 - $p_buffer = PclZipUtilZipDecrypt($p_buffer, $p_size, $p_encryption_header,  
5323 - $p_crc, $v_pwd);  
5324 -  
5325 - // ----- Return  
5326 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5327 - return $v_result;  
5328 - }  
5329 - // --------------------------------------------------------------------------------  
5330 -  
5331 - // --------------------------------------------------------------------------------  
5332 - // Function : privDisableMagicQuotes()  
5333 - // Description :  
5334 - // Parameters :  
5335 - // Return Values :  
5336 - // --------------------------------------------------------------------------------  
5337 - function privDisableMagicQuotes()  
5338 - {  
5339 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDisableMagicQuotes', "");  
5340 - $v_result=1;  
5341 -  
5342 - // ----- Look if function exists  
5343 - if ( (!function_exists("get_magic_quotes_runtime"))  
5344 - || (!function_exists("set_magic_quotes_runtime"))) {  
5345 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");  
5346 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5347 - return $v_result;  
5348 - }  
5349 -  
5350 - // ----- Look if already done  
5351 - if ($this->magic_quotes_status != -1) {  
5352 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote already disabled");  
5353 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5354 - return $v_result;  
5355 - }  
5356 -  
5357 - // ----- Get and memorize the magic_quote value  
5358 - $this->magic_quotes_status = @get_magic_quotes_runtime();  
5359 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Current magic_quotes_runtime status is '".($this->magic_quotes_status==0?'disable':'enable')."'");  
5360 -  
5361 - // ----- Disable magic_quotes  
5362 - if ($this->magic_quotes_status == 1) {  
5363 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Disable magic_quotes");  
5364 - @set_magic_quotes_runtime(0);  
5365 - }  
5366 -  
5367 - // ----- Return  
5368 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5369 - return $v_result;  
5370 - }  
5371 - // --------------------------------------------------------------------------------  
5372 -  
5373 - // --------------------------------------------------------------------------------  
5374 - // Function : privSwapBackMagicQuotes()  
5375 - // Description :  
5376 - // Parameters :  
5377 - // Return Values :  
5378 - // --------------------------------------------------------------------------------  
5379 - function privSwapBackMagicQuotes()  
5380 - {  
5381 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privSwapBackMagicQuotes', "");  
5382 - $v_result=1;  
5383 -  
5384 - // ----- Look if function exists  
5385 - if ( (!function_exists("get_magic_quotes_runtime"))  
5386 - || (!function_exists("set_magic_quotes_runtime"))) {  
5387 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");  
5388 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5389 - return $v_result;  
5390 - }  
5391 -  
5392 - // ----- Look if something to do  
5393 - if ($this->magic_quotes_status != -1) {  
5394 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote not modified");  
5395 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5396 - return $v_result;  
5397 - }  
5398 -  
5399 - // ----- Swap back magic_quotes  
5400 - if ($this->magic_quotes_status == 1) {  
5401 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Enable back magic_quotes");  
5402 - @set_magic_quotes_runtime($this->magic_quotes_status);  
5403 - }  
5404 -  
5405 - // ----- Return  
5406 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5407 - return $v_result;  
5408 - }  
5409 - // --------------------------------------------------------------------------------  
5410 -  
5411 - }  
5412 - // End of class  
5413 - // --------------------------------------------------------------------------------  
5414 -  
5415 - // --------------------------------------------------------------------------------  
5416 - // Function : PclZipUtilPathReduction()  
5417 - // Description :  
5418 - // Parameters :  
5419 - // Return Values :  
5420 - // --------------------------------------------------------------------------------  
5421 - function PclZipUtilPathReduction($p_dir)  
5422 - {  
5423 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathReduction", "dir='$p_dir'");  
5424 - $v_result = "";  
5425 -  
5426 - // ----- Look for not empty path  
5427 - if ($p_dir != "") {  
5428 - // ----- Explode path by directory names  
5429 - $v_list = explode("/", $p_dir);  
5430 -  
5431 - // ----- Study directories from last to first  
5432 - $v_skip = 0;  
5433 - for ($i=sizeof($v_list)-1; $i>=0; $i--) {  
5434 - // ----- Look for current path  
5435 - if ($v_list[$i] == ".") {  
5436 - // ----- Ignore this directory  
5437 - // Should be the first $i=0, but no check is done  
5438 - }  
5439 - else if ($v_list[$i] == "..") {  
5440 - $v_skip++;  
5441 - }  
5442 - else if ($v_list[$i] == "") {  
5443 - // ----- First '/' i.e. root slash  
5444 - if ($i == 0) {  
5445 - $v_result = "/".$v_result;  
5446 - if ($v_skip > 0) {  
5447 - // ----- It is an invalid path, so the path is not modified  
5448 - // TBC  
5449 - $v_result = $p_dir;  
5450 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid path is unchanged");  
5451 - $v_skip = 0;  
5452 - }  
5453 - }  
5454 - // ----- Last '/' i.e. indicates a directory  
5455 - else if ($i == (sizeof($v_list)-1)) {  
5456 - $v_result = $v_list[$i];  
5457 - }  
5458 - // ----- Double '/' inside the path  
5459 - else {  
5460 - // ----- Ignore only the double '//' in path,  
5461 - // but not the first and last '/'  
5462 - }  
5463 - }  
5464 - else {  
5465 - // ----- Look for item to skip  
5466 - if ($v_skip > 0) {  
5467 - $v_skip--;  
5468 - }  
5469 - else {  
5470 - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");  
5471 - }  
5472 - }  
5473 - }  
5474 -  
5475 - // ----- Look for skip  
5476 - if ($v_skip > 0) {  
5477 - while ($v_skip > 0) {  
5478 - $v_result = '../'.$v_result;  
5479 - $v_skip--;  
5480 - }  
5481 - }  
5482 - }  
5483 -  
5484 - // ----- Return  
5485 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5486 - return $v_result;  
5487 - }  
5488 - // --------------------------------------------------------------------------------  
5489 -  
5490 - // --------------------------------------------------------------------------------  
5491 - // Function : PclZipUtilPathInclusion()  
5492 - // Description :  
5493 - // This function indicates if the path $p_path is under the $p_dir tree. Or,  
5494 - // said in an other way, if the file or sub-dir $p_path is inside the dir  
5495 - // $p_dir.  
5496 - // The function indicates also if the path is exactly the same as the dir.  
5497 - // This function supports path with duplicated '/' like '//', but does not  
5498 - // support '.' or '..' statements.  
5499 - // Parameters :  
5500 - // Return Values :  
5501 - // 0 if $p_path is not inside directory $p_dir  
5502 - // 1 if $p_path is inside directory $p_dir  
5503 - // 2 if $p_path is exactly the same as $p_dir  
5504 - // --------------------------------------------------------------------------------  
5505 - function PclZipUtilPathInclusion($p_dir, $p_path)  
5506 - {  
5507 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'");  
5508 - $v_result = 1;  
5509 -  
5510 - // ----- Look for path beginning by ./  
5511 - if ( ($p_dir == '.')  
5512 - || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {  
5513 - $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);  
5514 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_dir '".$p_dir."'");  
5515 - }  
5516 - if ( ($p_path == '.')  
5517 - || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {  
5518 - $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);  
5519 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_path '".$p_path."'");  
5520 - }  
5521 -  
5522 - // ----- Explode dir and path by directory separator  
5523 - $v_list_dir = explode("/", $p_dir);  
5524 - $v_list_dir_size = sizeof($v_list_dir);  
5525 - $v_list_path = explode("/", $p_path);  
5526 - $v_list_path_size = sizeof($v_list_path);  
5527 -  
5528 - // ----- Study directories paths  
5529 - $i = 0;  
5530 - $j = 0;  
5531 - while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {  
5532 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'");  
5533 -  
5534 - // ----- Look for empty dir (path reduction)  
5535 - if ($v_list_dir[$i] == '') {  
5536 - $i++;  
5537 - continue;  
5538 - }  
5539 - if ($v_list_path[$j] == '') {  
5540 - $j++;  
5541 - continue;  
5542 - }  
5543 -  
5544 - // ----- Compare the items  
5545 - if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) {  
5546 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different");  
5547 - $v_result = 0;  
5548 - }  
5549 -  
5550 - // ----- Next items  
5551 - $i++;  
5552 - $j++;  
5553 - }  
5554 -  
5555 - // ----- Look if everything seems to be the same  
5556 - if ($v_result) {  
5557 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break");  
5558 - // ----- Skip all the empty items  
5559 - while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;  
5560 - while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;  
5561 - //--(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]:'')."'");  
5562 -  
5563 - if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {  
5564 - // ----- There are exactly the same  
5565 - $v_result = 2;  
5566 - }  
5567 - else if ($i < $v_list_dir_size) {  
5568 - // ----- The path is shorter than the dir  
5569 - $v_result = 0;  
5570 - }  
5571 - }  
5572 -  
5573 - // ----- Return  
5574 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5575 - return $v_result;  
5576 - }  
5577 - // --------------------------------------------------------------------------------  
5578 -  
5579 - // --------------------------------------------------------------------------------  
5580 - // Function : PclZipUtilCopyBlock()  
5581 - // Description :  
5582 - // Parameters :  
5583 - // $p_mode : read/write compression mode  
5584 - // 0 : src & dest normal  
5585 - // 1 : src gzip, dest normal  
5586 - // 2 : src normal, dest gzip  
5587 - // 3 : src & dest gzip  
5588 - // Return Values :  
5589 - // --------------------------------------------------------------------------------  
5590 - function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)  
5591 - {  
5592 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilCopyBlock", "size=$p_size, mode=$p_mode");  
5593 - $v_result = 1;  
5594 -  
5595 - if ($p_mode==0)  
5596 - {  
5597 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset before read :".(@ftell($p_src)));  
5598 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset before write :".(@ftell($p_dest)));  
5599 - while ($p_size != 0)  
5600 - {  
5601 - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);  
5602 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");  
5603 - $v_buffer = @fread($p_src, $v_read_size);  
5604 - @fwrite($p_dest, $v_buffer, $v_read_size);  
5605 - $p_size -= $v_read_size;  
5606 - }  
5607 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset after read :".(@ftell($p_src)));  
5608 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset after write :".(@ftell($p_dest)));  
5609 - }  
5610 - else if ($p_mode==1)  
5611 - {  
5612 - while ($p_size != 0)  
5613 - {  
5614 - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);  
5615 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");  
5616 - $v_buffer = @gzread($p_src, $v_read_size);  
5617 - @fwrite($p_dest, $v_buffer, $v_read_size);  
5618 - $p_size -= $v_read_size;  
5619 - }  
5620 - }  
5621 - else if ($p_mode==2)  
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 = @fread($p_src, $v_read_size);  
5628 - @gzwrite($p_dest, $v_buffer, $v_read_size);  
5629 - $p_size -= $v_read_size;  
5630 - }  
5631 - }  
5632 - else if ($p_mode==3)  
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 = @gzread($p_src, $v_read_size);  
5639 - @gzwrite($p_dest, $v_buffer, $v_read_size);  
5640 - $p_size -= $v_read_size;  
5641 - }  
5642 - }  
5643 -  
5644 - // ----- Return  
5645 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5646 - return $v_result;  
5647 - }  
5648 - // --------------------------------------------------------------------------------  
5649 -  
5650 - // --------------------------------------------------------------------------------  
5651 - // Function : PclZipUtilRename()  
5652 - // Description :  
5653 - // This function tries to do a simple rename() function. If it fails, it  
5654 - // tries to copy the $p_src file in a new $p_dest file and then unlink the  
5655 - // first one.  
5656 - // Parameters :  
5657 - // $p_src : Old filename  
5658 - // $p_dest : New filename  
5659 - // Return Values :  
5660 - // 1 on success, 0 on failure.  
5661 - // --------------------------------------------------------------------------------  
5662 - function PclZipUtilRename($p_src, $p_dest)  
5663 - {  
5664 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilRename", "source=$p_src, destination=$p_dest");  
5665 - $v_result = 1;  
5666 -  
5667 - // ----- Try to rename the files  
5668 - if (!@rename($p_src, $p_dest)) {  
5669 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to rename file, try copy+unlink");  
5670 -  
5671 - // ----- Try to copy & unlink the src  
5672 - if (!@copy($p_src, $p_dest)) {  
5673 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to copy file");  
5674 - $v_result = 0;  
5675 - }  
5676 - else if (!@unlink($p_src)) {  
5677 - //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to unlink old filename");  
5678 - $v_result = 0;  
5679 - }  
5680 - }  
5681 -  
5682 - // ----- Return  
5683 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5684 - return $v_result;  
5685 - }  
5686 - // --------------------------------------------------------------------------------  
5687 -  
5688 - // --------------------------------------------------------------------------------  
5689 - // Function : PclZipUtilOptionText()  
5690 - // Description :  
5691 - // Translate option value in text. Mainly for debug purpose.  
5692 - // Parameters :  
5693 - // $p_option : the option value.  
5694 - // Return Values :  
5695 - // The option text value.  
5696 - // --------------------------------------------------------------------------------  
5697 - function PclZipUtilOptionText($p_option)  
5698 - {  
5699 - //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilOptionText", "option='".$p_option."'");  
5700 -  
5701 - $v_list = get_defined_constants();  
5702 - for (reset($v_list); $v_key = key($v_list); next($v_list)) {  
5703 - $v_prefix = substr($v_key, 0, 10);  
5704 - if (( ($v_prefix == 'PCLZIP_OPT')  
5705 - || ($v_prefix == 'PCLZIP_CB_')  
5706 - || ($v_prefix == 'PCLZIP_ATT'))  
5707 - && ($v_list[$v_key] == $p_option)) {  
5708 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_key);  
5709 - return $v_key;  
5710 - }  
5711 - }  
5712 -  
5713 - $v_result = 'Unknown';  
5714 -  
5715 - //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);  
5716 - return $v_result;  
5717 - }  
5718 - // --------------------------------------------------------------------------------  
5719 -  
5720 - // --------------------------------------------------------------------------------  
5721 - // Function : PclZipUtilTranslateWinPath()  
5722 - // Description :  
5723 - // Translate windows path by replacing '\' by '/' and optionally removing  
5724 - // drive letter.  
5725 - // Parameters :  
5726 - // $p_path : path to translate.  
5727 - // $p_remove_disk_letter : true | false  
5728 - // Return Values :  
5729 - // The path translated.  
5730 - // --------------------------------------------------------------------------------  
5731 - function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)  
5732 - {  
5733 - if (stristr(php_uname(), 'windows')) {  
5734 - // ----- Look for potential disk letter  
5735 - if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {  
5736 - $p_path = substr($p_path, $v_position+1);  
5737 - }  
5738 - // ----- Change potential windows directory separator  
5739 - if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {  
5740 - $p_path = strtr($p_path, '\\', '/');  
5741 - }  
5742 - }  
5743 - return $p_path;  
5744 - }  
5745 - // --------------------------------------------------------------------------------  
5746 -  
5747 -  
5748 -?> 1 +<?php
  2 +// --------------------------------------------------------------------------------
  3 +// PhpConcept Library - Zip Module 2.5
  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.44 2006/03/08 21:23:59 vblavet Exp $
  26 +// --------------------------------------------------------------------------------
  27 +
  28 + // ----- Constants
  29 + define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
  30 +
  31 + // ----- File list separator
  32 + // In version 1.x of PclZip, the separator for file list is a space
  33 + // (which is not a very smart choice, specifically for windows paths !).
  34 + // A better separator should be a comma (,). This constant gives you the
  35 + // abilty to change that.
  36 + // However notice that changing this value, may have impact on existing
  37 + // scripts, using space separated filenames.
  38 + // Recommanded values for compatibility with older versions :
  39 + //define( 'PCLZIP_SEPARATOR', ' ' );
  40 + // Recommanded values for smart separation of filenames.
  41 + define( 'PCLZIP_SEPARATOR', ',' );
  42 +
  43 + // ----- Error configuration
  44 + // 0 : PclZip Class integrated error handling
  45 + // 1 : PclError external library error handling. By enabling this
  46 + // you must ensure that you have included PclError library.
  47 + // [2,...] : reserved for futur use
  48 + define( 'PCLZIP_ERROR_EXTERNAL', 0 );
  49 +
  50 + // ----- Optional static temporary directory
  51 + // By default temporary files are generated in the script current
  52 + // path.
  53 + // If defined :
  54 + // - MUST BE terminated by a '/'.
  55 + // - MUST be a valid, already created directory
  56 + // Samples :
  57 + // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
  58 + // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
  59 + define( 'PCLZIP_TEMPORARY_DIR', '' );
  60 +
  61 +// --------------------------------------------------------------------------------
  62 +// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****
  63 +// --------------------------------------------------------------------------------
  64 +
  65 + // ----- Global variables
  66 + $g_pclzip_version = "2.5";
  67 +
  68 + // ----- Error codes
  69 + // -1 : Unable to open file in binary write mode
  70 + // -2 : Unable to open file in binary read mode
  71 + // -3 : Invalid parameters
  72 + // -4 : File does not exist
  73 + // -5 : Filename is too long (max. 255)
  74 + // -6 : Not a valid zip file
  75 + // -7 : Invalid extracted file size
  76 + // -8 : Unable to create directory
  77 + // -9 : Invalid archive extension
  78 + // -10 : Invalid archive format
  79 + // -11 : Unable to delete file (unlink)
  80 + // -12 : Unable to rename file (rename)
  81 + // -13 : Invalid header checksum
  82 + // -14 : Invalid archive size
  83 + define( 'PCLZIP_ERR_USER_ABORTED', 2 );
  84 + define( 'PCLZIP_ERR_NO_ERROR', 0 );
  85 + define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );
  86 + define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );
  87 + define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );
  88 + define( 'PCLZIP_ERR_MISSING_FILE', -4 );
  89 + define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );
  90 + define( 'PCLZIP_ERR_INVALID_ZIP', -6 );
  91 + define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );
  92 + define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );
  93 + define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );
  94 + define( 'PCLZIP_ERR_BAD_FORMAT', -10 );
  95 + define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );
  96 + define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );
  97 + define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );
  98 + define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
  99 + define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );
  100 + define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );
  101 + define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );
  102 + define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );
  103 + define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );
  104 + define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );
  105 + define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );
  106 +
  107 + // ----- Options values
  108 + define( 'PCLZIP_OPT_PATH', 77001 );
  109 + define( 'PCLZIP_OPT_ADD_PATH', 77002 );
  110 + define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
  111 + define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
  112 + define( 'PCLZIP_OPT_SET_CHMOD', 77005 );
  113 + define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
  114 + define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
  115 + define( 'PCLZIP_OPT_BY_NAME', 77008 );
  116 + define( 'PCLZIP_OPT_BY_INDEX', 77009 );
  117 + define( 'PCLZIP_OPT_BY_EREG', 77010 );
  118 + define( 'PCLZIP_OPT_BY_PREG', 77011 );
  119 + define( 'PCLZIP_OPT_COMMENT', 77012 );
  120 + define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
  121 + define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
  122 + define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );
  123 + define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );
  124 + define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );
  125 + // Having big trouble with crypt. Need to multiply 2 long int
  126 + // which is not correctly supported by PHP ...
  127 + //define( 'PCLZIP_OPT_CRYPT', 77018 );
  128 + define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
  129 +
  130 + // ----- File description attributes
  131 + define( 'PCLZIP_ATT_FILE_NAME', 79001 );
  132 + define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
  133 + define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
  134 +
  135 + // ----- Call backs values
  136 + define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
  137 + define( 'PCLZIP_CB_POST_EXTRACT', 78002 );
  138 + define( 'PCLZIP_CB_PRE_ADD', 78003 );
  139 + define( 'PCLZIP_CB_POST_ADD', 78004 );
  140 + /* For futur use
  141 + define( 'PCLZIP_CB_PRE_LIST', 78005 );
  142 + define( 'PCLZIP_CB_POST_LIST', 78006 );
  143 + define( 'PCLZIP_CB_PRE_DELETE', 78007 );
  144 + define( 'PCLZIP_CB_POST_DELETE', 78008 );
  145 + */
  146 +
  147 + // --------------------------------------------------------------------------------
  148 + // Class : PclZip
  149 + // Description :
  150 + // PclZip is the class that represent a Zip archive.
  151 + // The public methods allow the manipulation of the archive.
  152 + // Attributes :
  153 + // Attributes must not be accessed directly.
  154 + // Methods :
  155 + // PclZip() : Object creator
  156 + // create() : Creates the Zip archive
  157 + // listContent() : List the content of the Zip archive
  158 + // extract() : Extract the content of the archive
  159 + // properties() : List the properties of the archive
  160 + // --------------------------------------------------------------------------------
  161 + class PclZip
  162 + {
  163 + // ----- Filename of the zip file
  164 + var $zipname = '';
  165 +
  166 + // ----- File descriptor of the zip file
  167 + var $zip_fd = 0;
  168 +
  169 + // ----- Internal error handling
  170 + var $error_code = 1;
  171 + var $error_string = '';
  172 +
  173 + // ----- Current status of the magic_quotes_runtime
  174 + // This value store the php configuration for magic_quotes
  175 + // The class can then disable the magic_quotes and reset it after
  176 + var $magic_quotes_status;
  177 +
  178 + // --------------------------------------------------------------------------------
  179 + // Function : PclZip()
  180 + // Description :
  181 + // Creates a PclZip object and set the name of the associated Zip archive
  182 + // filename.
  183 + // Note that no real action is taken, if the archive does not exist it is not
  184 + // created. Use create() for that.
  185 + // --------------------------------------------------------------------------------
  186 + function PclZip($p_zipname)
  187 + {
  188 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::PclZip', "zipname=$p_zipname");
  189 +
  190 + // ----- Tests the zlib
  191 + if (!function_exists('gzopen'))
  192 + {
  193 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 1, "zlib extension seems to be missing");
  194 + die('Abort '.basename(__FILE__).' : Missing zlib extensions');
  195 + }
  196 +
  197 + // ----- Set the attributes
  198 + $this->zipname = $p_zipname;
  199 + $this->zip_fd = 0;
  200 + $this->magic_quotes_status = -1;
  201 +
  202 + // ----- Return
  203 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1);
  204 + return;
  205 + }
  206 + // --------------------------------------------------------------------------------
  207 +
  208 + // --------------------------------------------------------------------------------
  209 + // Function :
  210 + // create($p_filelist, $p_add_dir="", $p_remove_dir="")
  211 + // create($p_filelist, $p_option, $p_option_value, ...)
  212 + // Description :
  213 + // This method supports two different synopsis. The first one is historical.
  214 + // This method creates a Zip Archive. The Zip file is created in the
  215 + // filesystem. The files and directories indicated in $p_filelist
  216 + // are added in the archive. See the parameters description for the
  217 + // supported format of $p_filelist.
  218 + // When a directory is in the list, the directory and its content is added
  219 + // in the archive.
  220 + // In this synopsis, the function takes an optional variable list of
  221 + // options. See bellow the supported options.
  222 + // Parameters :
  223 + // $p_filelist : An array containing file or directory names, or
  224 + // a string containing one filename or one directory name, or
  225 + // a string containing a list of filenames and/or directory
  226 + // names separated by spaces.
  227 + // $p_add_dir : A path to add before the real path of the archived file,
  228 + // in order to have it memorized in the archive.
  229 + // $p_remove_dir : A path to remove from the real path of the file to archive,
  230 + // in order to have a shorter path memorized in the archive.
  231 + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir
  232 + // is removed first, before $p_add_dir is added.
  233 + // Options :
  234 + // PCLZIP_OPT_ADD_PATH :
  235 + // PCLZIP_OPT_REMOVE_PATH :
  236 + // PCLZIP_OPT_REMOVE_ALL_PATH :
  237 + // PCLZIP_OPT_COMMENT :
  238 + // PCLZIP_CB_PRE_ADD :
  239 + // PCLZIP_CB_POST_ADD :
  240 + // Return Values :
  241 + // 0 on failure,
  242 + // The list of the added files, with a status of the add action.
  243 + // (see PclZip::listContent() for list entry format)
  244 + // --------------------------------------------------------------------------------
  245 + function create($p_filelist)
  246 + {
  247 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ...");
  248 + $v_result=1;
  249 +
  250 + // ----- Reset the error handler
  251 + $this->privErrorReset();
  252 +
  253 + // ----- Set default values
  254 + $v_options = array();
  255 + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
  256 +
  257 + // ----- Look for variable options arguments
  258 + $v_size = func_num_args();
  259 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  260 +
  261 + // ----- Look for arguments
  262 + if ($v_size > 1) {
  263 + // ----- Get the arguments
  264 + $v_arg_list = func_get_args();
  265 +
  266 + // ----- Remove from the options list the first argument
  267 + array_shift($v_arg_list);
  268 + $v_size--;
  269 +
  270 + // ----- Look for first arg
  271 + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  272 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
  273 +
  274 + // ----- Parse the options
  275 + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  276 + array (PCLZIP_OPT_REMOVE_PATH => 'optional',
  277 + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  278 + PCLZIP_OPT_ADD_PATH => 'optional',
  279 + PCLZIP_CB_PRE_ADD => 'optional',
  280 + PCLZIP_CB_POST_ADD => 'optional',
  281 + PCLZIP_OPT_NO_COMPRESSION => 'optional',
  282 + PCLZIP_OPT_COMMENT => 'optional'
  283 + //, PCLZIP_OPT_CRYPT => 'optional'
  284 + ));
  285 + if ($v_result != 1) {
  286 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  287 + return 0;
  288 + }
  289 + }
  290 +
  291 + // ----- Look for 2 args
  292 + // Here we need to support the first historic synopsis of the
  293 + // method.
  294 + else {
  295 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  296 +
  297 + // ----- Get the first argument
  298 + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];
  299 +
  300 + // ----- Look for the optional second argument
  301 + if ($v_size == 2) {
  302 + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
  303 + }
  304 + else if ($v_size > 2) {
  305 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  306 + "Invalid number / type of arguments");
  307 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  308 + return 0;
  309 + }
  310 + }
  311 + }
  312 +
  313 + // ----- Init
  314 + $v_string_list = array();
  315 + $v_att_list = array();
  316 + $v_filedescr_list = array();
  317 + $p_result_list = array();
  318 +
  319 + // ----- Look if the $p_filelist is really an array
  320 + if (is_array($p_filelist)) {
  321 +
  322 + // ----- Look if the first element is also an array
  323 + // This will mean that this is a file description entry
  324 + if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
  325 + $v_att_list = $p_filelist;
  326 + }
  327 +
  328 + // ----- The list is a list of string names
  329 + else {
  330 + $v_string_list = $p_filelist;
  331 + }
  332 + }
  333 +
  334 + // ----- Look if the $p_filelist is a string
  335 + else if (is_string($p_filelist)) {
  336 + // ----- Create a list from the string
  337 + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
  338 + }
  339 +
  340 + // ----- Invalid variable type for $p_filelist
  341 + else {
  342 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
  343 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  344 + return 0;
  345 + }
  346 +
  347 + // ----- Reformat the string list
  348 + if (sizeof($v_string_list) != 0) {
  349 + foreach ($v_string_list as $v_string) {
  350 + if ($v_string != '') {
  351 + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
  352 + }
  353 + else {
  354 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Ignore an empty filename");
  355 + }
  356 + }
  357 + }
  358 +
  359 + // ----- For each file in the list check the attributes
  360 + $v_supported_attributes
  361 + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
  362 + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
  363 + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
  364 + );
  365 + foreach ($v_att_list as $v_entry) {
  366 + $v_result = $this->privFileDescrParseAtt($v_entry,
  367 + $v_filedescr_list[],
  368 + $v_options,
  369 + $v_supported_attributes);
  370 + if ($v_result != 1) {
  371 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  372 + return 0;
  373 + }
  374 + }
  375 +
  376 + // ----- Expand the filelist (expand directories)
  377 + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
  378 + if ($v_result != 1) {
  379 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  380 + return 0;
  381 + }
  382 +
  383 + // ----- Call the create fct
  384 + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
  385 + if ($v_result != 1) {
  386 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  387 + return 0;
  388 + }
  389 +
  390 + // ----- Return
  391 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
  392 + return $p_result_list;
  393 + }
  394 + // --------------------------------------------------------------------------------
  395 +
  396 + // --------------------------------------------------------------------------------
  397 + // Function :
  398 + // add($p_filelist, $p_add_dir="", $p_remove_dir="")
  399 + // add($p_filelist, $p_option, $p_option_value, ...)
  400 + // Description :
  401 + // This method supports two synopsis. The first one is historical.
  402 + // This methods add the list of files in an existing archive.
  403 + // If a file with the same name already exists, it is added at the end of the
  404 + // archive, the first one is still present.
  405 + // If the archive does not exist, it is created.
  406 + // Parameters :
  407 + // $p_filelist : An array containing file or directory names, or
  408 + // a string containing one filename or one directory name, or
  409 + // a string containing a list of filenames and/or directory
  410 + // names separated by spaces.
  411 + // $p_add_dir : A path to add before the real path of the archived file,
  412 + // in order to have it memorized in the archive.
  413 + // $p_remove_dir : A path to remove from the real path of the file to archive,
  414 + // in order to have a shorter path memorized in the archive.
  415 + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir
  416 + // is removed first, before $p_add_dir is added.
  417 + // Options :
  418 + // PCLZIP_OPT_ADD_PATH :
  419 + // PCLZIP_OPT_REMOVE_PATH :
  420 + // PCLZIP_OPT_REMOVE_ALL_PATH :
  421 + // PCLZIP_OPT_COMMENT :
  422 + // PCLZIP_OPT_ADD_COMMENT :
  423 + // PCLZIP_OPT_PREPEND_COMMENT :
  424 + // PCLZIP_CB_PRE_ADD :
  425 + // PCLZIP_CB_POST_ADD :
  426 + // Return Values :
  427 + // 0 on failure,
  428 + // The list of the added files, with a status of the add action.
  429 + // (see PclZip::listContent() for list entry format)
  430 + // --------------------------------------------------------------------------------
  431 + function add($p_filelist)
  432 + {
  433 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ...");
  434 + $v_result=1;
  435 +
  436 + // ----- Reset the error handler
  437 + $this->privErrorReset();
  438 +
  439 + // ----- Set default values
  440 + $v_options = array();
  441 + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
  442 +
  443 + // ----- Look for variable options arguments
  444 + $v_size = func_num_args();
  445 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  446 +
  447 + // ----- Look for arguments
  448 + if ($v_size > 1) {
  449 + // ----- Get the arguments
  450 + $v_arg_list = func_get_args();
  451 +
  452 + // ----- Remove form the options list the first argument
  453 + array_shift($v_arg_list);
  454 + $v_size--;
  455 +
  456 + // ----- Look for first arg
  457 + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  458 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
  459 +
  460 + // ----- Parse the options
  461 + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  462 + array (PCLZIP_OPT_REMOVE_PATH => 'optional',
  463 + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  464 + PCLZIP_OPT_ADD_PATH => 'optional',
  465 + PCLZIP_CB_PRE_ADD => 'optional',
  466 + PCLZIP_CB_POST_ADD => 'optional',
  467 + PCLZIP_OPT_NO_COMPRESSION => 'optional',
  468 + PCLZIP_OPT_COMMENT => 'optional',
  469 + PCLZIP_OPT_ADD_COMMENT => 'optional',
  470 + PCLZIP_OPT_PREPEND_COMMENT => 'optional'
  471 + //, PCLZIP_OPT_CRYPT => 'optional'
  472 + ));
  473 + if ($v_result != 1) {
  474 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  475 + return 0;
  476 + }
  477 + }
  478 +
  479 + // ----- Look for 2 args
  480 + // Here we need to support the first historic synopsis of the
  481 + // method.
  482 + else {
  483 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  484 +
  485 + // ----- Get the first argument
  486 + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];
  487 +
  488 + // ----- Look for the optional second argument
  489 + if ($v_size == 2) {
  490 + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
  491 + }
  492 + else if ($v_size > 2) {
  493 + // ----- Error log
  494 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  495 +
  496 + // ----- Return
  497 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  498 + return 0;
  499 + }
  500 + }
  501 + }
  502 +
  503 + // ----- Init
  504 + $v_string_list = array();
  505 + $v_att_list = array();
  506 + $v_filedescr_list = array();
  507 + $p_result_list = array();
  508 +
  509 + // ----- Look if the $p_filelist is really an array
  510 + if (is_array($p_filelist)) {
  511 +
  512 + // ----- Look if the first element is also an array
  513 + // This will mean that this is a file description entry
  514 + if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
  515 + $v_att_list = $p_filelist;
  516 + }
  517 +
  518 + // ----- The list is a list of string names
  519 + else {
  520 + $v_string_list = $p_filelist;
  521 + }
  522 + }
  523 +
  524 + // ----- Look if the $p_filelist is a string
  525 + else if (is_string($p_filelist)) {
  526 + // ----- Create a list from the string
  527 + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
  528 + }
  529 +
  530 + // ----- Invalid variable type for $p_filelist
  531 + else {
  532 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
  533 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  534 + return 0;
  535 + }
  536 +
  537 + // ----- Reformat the string list
  538 + if (sizeof($v_string_list) != 0) {
  539 + foreach ($v_string_list as $v_string) {
  540 + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
  541 + }
  542 + }
  543 +
  544 + // ----- For each file in the list check the attributes
  545 + $v_supported_attributes
  546 + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
  547 + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
  548 + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
  549 + );
  550 + foreach ($v_att_list as $v_entry) {
  551 + $v_result = $this->privFileDescrParseAtt($v_entry,
  552 + $v_filedescr_list[],
  553 + $v_options,
  554 + $v_supported_attributes);
  555 + if ($v_result != 1) {
  556 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  557 + return 0;
  558 + }
  559 + }
  560 +
  561 + // ----- Expand the filelist (expand directories)
  562 + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
  563 + if ($v_result != 1) {
  564 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  565 + return 0;
  566 + }
  567 +
  568 + // ----- Call the create fct
  569 + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
  570 + if ($v_result != 1) {
  571 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  572 + return 0;
  573 + }
  574 +
  575 + // ----- Return
  576 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
  577 + return $p_result_list;
  578 + }
  579 + // --------------------------------------------------------------------------------
  580 +
  581 + // --------------------------------------------------------------------------------
  582 + // Function : listContent()
  583 + // Description :
  584 + // This public method, gives the list of the files and directories, with their
  585 + // properties.
  586 + // The properties of each entries in the list are (used also in other functions) :
  587 + // filename : Name of the file. For a create or add action it is the filename
  588 + // given by the user. For an extract function it is the filename
  589 + // of the extracted file.
  590 + // stored_filename : Name of the file / directory stored in the archive.
  591 + // size : Size of the stored file.
  592 + // compressed_size : Size of the file's data compressed in the archive
  593 + // (without the headers overhead)
  594 + // mtime : Last known modification date of the file (UNIX timestamp)
  595 + // comment : Comment associated with the file
  596 + // folder : true | false
  597 + // index : index of the file in the archive
  598 + // status : status of the action (depending of the action) :
  599 + // Values are :
  600 + // ok : OK !
  601 + // filtered : the file / dir is not extracted (filtered by user)
  602 + // already_a_directory : the file can not be extracted because a
  603 + // directory with the same name already exists
  604 + // write_protected : the file can not be extracted because a file
  605 + // with the same name already exists and is
  606 + // write protected
  607 + // newer_exist : the file was not extracted because a newer file exists
  608 + // path_creation_fail : the file is not extracted because the folder
  609 + // does not exists and can not be created
  610 + // write_error : the file was not extracted because there was a
  611 + // error while writing the file
  612 + // read_error : the file was not extracted because there was a error
  613 + // while reading the file
  614 + // invalid_header : the file was not extracted because of an archive
  615 + // format error (bad file header)
  616 + // Note that each time a method can continue operating when there
  617 + // is an action error on a file, the error is only logged in the file status.
  618 + // Return Values :
  619 + // 0 on an unrecoverable failure,
  620 + // The list of the files in the archive.
  621 + // --------------------------------------------------------------------------------
  622 + function listContent()
  623 + {
  624 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', "");
  625 + $v_result=1;
  626 +
  627 + // ----- Reset the error handler
  628 + $this->privErrorReset();
  629 +
  630 + // ----- Check archive
  631 + if (!$this->privCheckFormat()) {
  632 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  633 + return(0);
  634 + }
  635 +
  636 + // ----- Call the extracting fct
  637 + $p_list = array();
  638 + if (($v_result = $this->privList($p_list)) != 1)
  639 + {
  640 + unset($p_list);
  641 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  642 + return(0);
  643 + }
  644 +
  645 + // ----- Return
  646 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  647 + return $p_list;
  648 + }
  649 + // --------------------------------------------------------------------------------
  650 +
  651 + // --------------------------------------------------------------------------------
  652 + // Function :
  653 + // extract($p_path="./", $p_remove_path="")
  654 + // extract([$p_option, $p_option_value, ...])
  655 + // Description :
  656 + // This method supports two synopsis. The first one is historical.
  657 + // This method extract all the files / directories from the archive to the
  658 + // folder indicated in $p_path.
  659 + // If you want to ignore the 'root' part of path of the memorized files
  660 + // you can indicate this in the optional $p_remove_path parameter.
  661 + // By default, if a newer file with the same name already exists, the
  662 + // file is not extracted.
  663 + //
  664 + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions
  665 + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append
  666 + // at the end of the path value of PCLZIP_OPT_PATH.
  667 + // Parameters :
  668 + // $p_path : Path where the files and directories are to be extracted
  669 + // $p_remove_path : First part ('root' part) of the memorized path
  670 + // (if any similar) to remove while extracting.
  671 + // Options :
  672 + // PCLZIP_OPT_PATH :
  673 + // PCLZIP_OPT_ADD_PATH :
  674 + // PCLZIP_OPT_REMOVE_PATH :
  675 + // PCLZIP_OPT_REMOVE_ALL_PATH :
  676 + // PCLZIP_CB_PRE_EXTRACT :
  677 + // PCLZIP_CB_POST_EXTRACT :
  678 + // Return Values :
  679 + // 0 or a negative value on failure,
  680 + // The list of the extracted files, with a status of the action.
  681 + // (see PclZip::listContent() for list entry format)
  682 + // --------------------------------------------------------------------------------
  683 + function extract()
  684 + {
  685 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", "");
  686 + $v_result=1;
  687 +
  688 + // ----- Reset the error handler
  689 + $this->privErrorReset();
  690 +
  691 + // ----- Check archive
  692 + if (!$this->privCheckFormat()) {
  693 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  694 + return(0);
  695 + }
  696 +
  697 + // ----- Set default values
  698 + $v_options = array();
  699 +// $v_path = "./";
  700 + $v_path = '';
  701 + $v_remove_path = "";
  702 + $v_remove_all_path = false;
  703 +
  704 + // ----- Look for variable options arguments
  705 + $v_size = func_num_args();
  706 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  707 +
  708 + // ----- Default values for option
  709 + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  710 +
  711 + // ----- Look for arguments
  712 + if ($v_size > 0) {
  713 + // ----- Get the arguments
  714 + $v_arg_list = func_get_args();
  715 +
  716 + // ----- Look for first arg
  717 + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  718 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
  719 +
  720 + // ----- Parse the options
  721 + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  722 + array (PCLZIP_OPT_PATH => 'optional',
  723 + PCLZIP_OPT_REMOVE_PATH => 'optional',
  724 + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  725 + PCLZIP_OPT_ADD_PATH => 'optional',
  726 + PCLZIP_CB_PRE_EXTRACT => 'optional',
  727 + PCLZIP_CB_POST_EXTRACT => 'optional',
  728 + PCLZIP_OPT_SET_CHMOD => 'optional',
  729 + PCLZIP_OPT_BY_NAME => 'optional',
  730 + PCLZIP_OPT_BY_EREG => 'optional',
  731 + PCLZIP_OPT_BY_PREG => 'optional',
  732 + PCLZIP_OPT_BY_INDEX => 'optional',
  733 + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
  734 + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
  735 + PCLZIP_OPT_REPLACE_NEWER => 'optional'
  736 + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
  737 + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
  738 + ));
  739 + if ($v_result != 1) {
  740 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  741 + return 0;
  742 + }
  743 +
  744 + // ----- Set the arguments
  745 + if (isset($v_options[PCLZIP_OPT_PATH])) {
  746 + $v_path = $v_options[PCLZIP_OPT_PATH];
  747 + }
  748 + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
  749 + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
  750 + }
  751 + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  752 + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  753 + }
  754 + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
  755 + // ----- Check for '/' in last path char
  756 + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
  757 + $v_path .= '/';
  758 + }
  759 + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
  760 + }
  761 + }
  762 +
  763 + // ----- Look for 2 args
  764 + // Here we need to support the first historic synopsis of the
  765 + // method.
  766 + else {
  767 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  768 +
  769 + // ----- Get the first argument
  770 + $v_path = $v_arg_list[0];
  771 +
  772 + // ----- Look for the optional second argument
  773 + if ($v_size == 2) {
  774 + $v_remove_path = $v_arg_list[1];
  775 + }
  776 + else if ($v_size > 2) {
  777 + // ----- Error log
  778 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  779 +
  780 + // ----- Return
  781 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  782 + return 0;
  783 + }
  784 + }
  785 + }
  786 +
  787 + // ----- Trace
  788 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");
  789 +
  790 + // ----- Call the extracting fct
  791 + $p_list = array();
  792 + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
  793 + $v_remove_all_path, $v_options);
  794 + if ($v_result < 1) {
  795 + unset($p_list);
  796 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  797 + return(0);
  798 + }
  799 +
  800 + // ----- Return
  801 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  802 + return $p_list;
  803 + }
  804 + // --------------------------------------------------------------------------------
  805 +
  806 +
  807 + // --------------------------------------------------------------------------------
  808 + // Function :
  809 + // extractByIndex($p_index, $p_path="./", $p_remove_path="")
  810 + // extractByIndex($p_index, [$p_option, $p_option_value, ...])
  811 + // Description :
  812 + // This method supports two synopsis. The first one is historical.
  813 + // This method is doing a partial extract of the archive.
  814 + // The extracted files or folders are identified by their index in the
  815 + // archive (from 0 to n).
  816 + // Note that if the index identify a folder, only the folder entry is
  817 + // extracted, not all the files included in the archive.
  818 + // Parameters :
  819 + // $p_index : A single index (integer) or a string of indexes of files to
  820 + // extract. The form of the string is "0,4-6,8-12" with only numbers
  821 + // and '-' for range or ',' to separate ranges. No spaces or ';'
  822 + // are allowed.
  823 + // $p_path : Path where the files and directories are to be extracted
  824 + // $p_remove_path : First part ('root' part) of the memorized path
  825 + // (if any similar) to remove while extracting.
  826 + // Options :
  827 + // PCLZIP_OPT_PATH :
  828 + // PCLZIP_OPT_ADD_PATH :
  829 + // PCLZIP_OPT_REMOVE_PATH :
  830 + // PCLZIP_OPT_REMOVE_ALL_PATH :
  831 + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and
  832 + // not as files.
  833 + // The resulting content is in a new field 'content' in the file
  834 + // structure.
  835 + // This option must be used alone (any other options are ignored).
  836 + // PCLZIP_CB_PRE_EXTRACT :
  837 + // PCLZIP_CB_POST_EXTRACT :
  838 + // Return Values :
  839 + // 0 on failure,
  840 + // The list of the extracted files, with a status of the action.
  841 + // (see PclZip::listContent() for list entry format)
  842 + // --------------------------------------------------------------------------------
  843 + //function extractByIndex($p_index, options...)
  844 + function extractByIndex($p_index)
  845 + {
  846 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ...");
  847 + $v_result=1;
  848 +
  849 + // ----- Reset the error handler
  850 + $this->privErrorReset();
  851 +
  852 + // ----- Check archive
  853 + if (!$this->privCheckFormat()) {
  854 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  855 + return(0);
  856 + }
  857 +
  858 + // ----- Set default values
  859 + $v_options = array();
  860 +// $v_path = "./";
  861 + $v_path = '';
  862 + $v_remove_path = "";
  863 + $v_remove_all_path = false;
  864 +
  865 + // ----- Look for variable options arguments
  866 + $v_size = func_num_args();
  867 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  868 +
  869 + // ----- Default values for option
  870 + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  871 +
  872 + // ----- Look for arguments
  873 + if ($v_size > 1) {
  874 + // ----- Get the arguments
  875 + $v_arg_list = func_get_args();
  876 +
  877 + // ----- Remove form the options list the first argument
  878 + array_shift($v_arg_list);
  879 + $v_size--;
  880 +
  881 + // ----- Look for first arg
  882 + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  883 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
  884 +
  885 + // ----- Parse the options
  886 + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  887 + array (PCLZIP_OPT_PATH => 'optional',
  888 + PCLZIP_OPT_REMOVE_PATH => 'optional',
  889 + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  890 + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
  891 + PCLZIP_OPT_ADD_PATH => 'optional',
  892 + PCLZIP_CB_PRE_EXTRACT => 'optional',
  893 + PCLZIP_CB_POST_EXTRACT => 'optional',
  894 + PCLZIP_OPT_SET_CHMOD => 'optional',
  895 + PCLZIP_OPT_REPLACE_NEWER => 'optional'
  896 + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
  897 + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
  898 + ));
  899 + if ($v_result != 1) {
  900 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  901 + return 0;
  902 + }
  903 +
  904 + // ----- Set the arguments
  905 + if (isset($v_options[PCLZIP_OPT_PATH])) {
  906 + $v_path = $v_options[PCLZIP_OPT_PATH];
  907 + }
  908 + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
  909 + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
  910 + }
  911 + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  912 + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  913 + }
  914 + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
  915 + // ----- Check for '/' in last path char
  916 + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
  917 + $v_path .= '/';
  918 + }
  919 + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
  920 + }
  921 + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
  922 + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  923 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set.");
  924 + }
  925 + else {
  926 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set.");
  927 + }
  928 + }
  929 +
  930 + // ----- Look for 2 args
  931 + // Here we need to support the first historic synopsis of the
  932 + // method.
  933 + else {
  934 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
  935 +
  936 + // ----- Get the first argument
  937 + $v_path = $v_arg_list[0];
  938 +
  939 + // ----- Look for the optional second argument
  940 + if ($v_size == 2) {
  941 + $v_remove_path = $v_arg_list[1];
  942 + }
  943 + else if ($v_size > 2) {
  944 + // ----- Error log
  945 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  946 +
  947 + // ----- Return
  948 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  949 + return 0;
  950 + }
  951 + }
  952 + }
  953 +
  954 + // ----- Trace
  955 + //--(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')."'");
  956 +
  957 + // ----- Trick
  958 + // Here I want to reuse extractByRule(), so I need to parse the $p_index
  959 + // with privParseOptions()
  960 + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
  961 + $v_options_trick = array();
  962 + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
  963 + array (PCLZIP_OPT_BY_INDEX => 'optional' ));
  964 + if ($v_result != 1) {
  965 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  966 + return 0;
  967 + }
  968 + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];
  969 +
  970 + // ----- Call the extracting fct
  971 + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
  972 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  973 + return(0);
  974 + }
  975 +
  976 + // ----- Return
  977 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  978 + return $p_list;
  979 + }
  980 + // --------------------------------------------------------------------------------
  981 +
  982 + // --------------------------------------------------------------------------------
  983 + // Function :
  984 + // delete([$p_option, $p_option_value, ...])
  985 + // Description :
  986 + // This method removes files from the archive.
  987 + // If no parameters are given, then all the archive is emptied.
  988 + // Parameters :
  989 + // None or optional arguments.
  990 + // Options :
  991 + // PCLZIP_OPT_BY_INDEX :
  992 + // PCLZIP_OPT_BY_NAME :
  993 + // PCLZIP_OPT_BY_EREG :
  994 + // PCLZIP_OPT_BY_PREG :
  995 + // Return Values :
  996 + // 0 on failure,
  997 + // The list of the files which are still present in the archive.
  998 + // (see PclZip::listContent() for list entry format)
  999 + // --------------------------------------------------------------------------------
  1000 + function delete()
  1001 + {
  1002 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", "");
  1003 + $v_result=1;
  1004 +
  1005 + // ----- Reset the error handler
  1006 + $this->privErrorReset();
  1007 +
  1008 + // ----- Check archive
  1009 + if (!$this->privCheckFormat()) {
  1010 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1011 + return(0);
  1012 + }
  1013 +
  1014 + // ----- Set default values
  1015 + $v_options = array();
  1016 +
  1017 + // ----- Look for variable options arguments
  1018 + $v_size = func_num_args();
  1019 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
  1020 +
  1021 + // ----- Look for arguments
  1022 + if ($v_size > 0) {
  1023 + // ----- Get the arguments
  1024 + $v_arg_list = func_get_args();
  1025 +
  1026 + // ----- Parse the options
  1027 + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  1028 + array (PCLZIP_OPT_BY_NAME => 'optional',
  1029 + PCLZIP_OPT_BY_EREG => 'optional',
  1030 + PCLZIP_OPT_BY_PREG => 'optional',
  1031 + PCLZIP_OPT_BY_INDEX => 'optional' ));
  1032 + if ($v_result != 1) {
  1033 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1034 + return 0;
  1035 + }
  1036 + }
  1037 +
  1038 + // ----- Magic quotes trick
  1039 + $this->privDisableMagicQuotes();
  1040 +
  1041 + // ----- Call the delete fct
  1042 + $v_list = array();
  1043 + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
  1044 + $this->privSwapBackMagicQuotes();
  1045 + unset($v_list);
  1046 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
  1047 + return(0);
  1048 + }
  1049 +
  1050 + // ----- Magic quotes trick
  1051 + $this->privSwapBackMagicQuotes();
  1052 +
  1053 + // ----- Return
  1054 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_list);
  1055 + return $v_list;
  1056 + }
  1057 + // --------------------------------------------------------------------------------
  1058 +
  1059 + // --------------------------------------------------------------------------------
  1060 + // Function : deleteByIndex()
  1061 + // Description :
  1062 + // ***** Deprecated *****
  1063 + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.
  1064 + // --------------------------------------------------------------------------------
  1065 + function deleteByIndex($p_index)
  1066 + {
  1067 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'");
  1068 +
  1069 + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
  1070 +
  1071 + // ----- Return
  1072 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
  1073 + return $p_list;
  1074 + }
  1075 + // --------------------------------------------------------------------------------
  1076 +
  1077 + // --------------------------------------------------------------------------------
  1078 + // Function : properties()
  1079 + // Description :
  1080 + // This method gives the properties of the archive.
  1081 + // The properties are :
  1082 + // nb : Number of files in the archive
  1083 + // comment : Comment associated with the archive file
  1084 + // status : not_exist, ok
  1085 + // Parameters :
  1086 + // None
  1087 + // Return Values :
  1088 + // 0 on failure,
  1089 + // An array with the archive properties.
  1090 + // --------------------------------------------------------------------------------
  1091 + function properties()
  1092 + {
  1093 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", "");
  1094 +
  1095 + // ----- Reset the error handler
  1096 + $this->privErrorReset();
  1097 +
  1098 + // ----- Magic quotes trick
  1099 + $this->privDisableMagicQuotes();
  1100 +
  1101 + // ----- Check archive
  1102 + if (!$this->privCheckFormat()) {
  1103 + $this->privSwapBackMagicQuotes();
  1104 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1105 + return(0);
  1106 + }
  1107 +
  1108 + // ----- Default properties
  1109 + $v_prop = array();
  1110 + $v_prop['comment'] = '';
  1111 + $v_prop['nb'] = 0;
  1112 + $v_prop['status'] = 'not_exist';
  1113 +
  1114 + // ----- Look if file exists
  1115 + if (@is_file($this->zipname))
  1116 + {
  1117 + // ----- Open the zip file
  1118 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  1119 + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
  1120 + {
  1121 + $this->privSwapBackMagicQuotes();
  1122 +
  1123 + // ----- Error log
  1124 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
  1125 +
  1126 + // ----- Return
  1127 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0);
  1128 + return 0;
  1129 + }
  1130 +
  1131 + // ----- Read the central directory informations
  1132 + $v_central_dir = array();
  1133 + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  1134 + {
  1135 + $this->privSwapBackMagicQuotes();
  1136 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1137 + return 0;
  1138 + }
  1139 +
  1140 + // ----- Close the zip file
  1141 + $this->privCloseFd();
  1142 +
  1143 + // ----- Set the user attributes
  1144 + $v_prop['comment'] = $v_central_dir['comment'];
  1145 + $v_prop['nb'] = $v_central_dir['entries'];
  1146 + $v_prop['status'] = 'ok';
  1147 + }
  1148 +
  1149 + // ----- Magic quotes trick
  1150 + $this->privSwapBackMagicQuotes();
  1151 +
  1152 + // ----- Return
  1153 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_prop);
  1154 + return $v_prop;
  1155 + }
  1156 + // --------------------------------------------------------------------------------
  1157 +
  1158 + // --------------------------------------------------------------------------------
  1159 + // Function : duplicate()
  1160 + // Description :
  1161 + // This method creates an archive by copying the content of an other one. If
  1162 + // the archive already exist, it is replaced by the new one without any warning.
  1163 + // Parameters :
  1164 + // $p_archive : The filename of a valid archive, or
  1165 + // a valid PclZip object.
  1166 + // Return Values :
  1167 + // 1 on success.
  1168 + // 0 or a negative value on error (error code).
  1169 + // --------------------------------------------------------------------------------
  1170 + function duplicate($p_archive)
  1171 + {
  1172 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", "");
  1173 + $v_result = 1;
  1174 +
  1175 + // ----- Reset the error handler
  1176 + $this->privErrorReset();
  1177 +
  1178 + // ----- Look if the $p_archive is a PclZip object
  1179 + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))
  1180 + {
  1181 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'");
  1182 +
  1183 + // ----- Duplicate the archive
  1184 + $v_result = $this->privDuplicate($p_archive->zipname);
  1185 + }
  1186 +
  1187 + // ----- Look if the $p_archive is a string (so a filename)
  1188 + else if (is_string($p_archive))
  1189 + {
  1190 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'");
  1191 +
  1192 + // ----- Check that $p_archive is a valid zip file
  1193 + // TBC : Should also check the archive format
  1194 + if (!is_file($p_archive)) {
  1195 + // ----- Error log
  1196 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
  1197 + $v_result = PCLZIP_ERR_MISSING_FILE;
  1198 + }
  1199 + else {
  1200 + // ----- Duplicate the archive
  1201 + $v_result = $this->privDuplicate($p_archive);
  1202 + }
  1203 + }
  1204 +
  1205 + // ----- Invalid variable
  1206 + else
  1207 + {
  1208 + // ----- Error log
  1209 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
  1210 + $v_result = PCLZIP_ERR_INVALID_PARAMETER;
  1211 + }
  1212 +
  1213 + // ----- Return
  1214 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1215 + return $v_result;
  1216 + }
  1217 + // --------------------------------------------------------------------------------
  1218 +
  1219 + // --------------------------------------------------------------------------------
  1220 + // Function : merge()
  1221 + // Description :
  1222 + // This method merge the $p_archive_to_add archive at the end of the current
  1223 + // one ($this).
  1224 + // If the archive ($this) does not exist, the merge becomes a duplicate.
  1225 + // If the $p_archive_to_add archive does not exist, the merge is a success.
  1226 + // Parameters :
  1227 + // $p_archive_to_add : It can be directly the filename of a valid zip archive,
  1228 + // or a PclZip object archive.
  1229 + // Return Values :
  1230 + // 1 on success,
  1231 + // 0 or negative values on error (see below).
  1232 + // --------------------------------------------------------------------------------
  1233 + function merge($p_archive_to_add)
  1234 + {
  1235 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", "");
  1236 + $v_result = 1;
  1237 +
  1238 + // ----- Reset the error handler
  1239 + $this->privErrorReset();
  1240 +
  1241 + // ----- Check archive
  1242 + if (!$this->privCheckFormat()) {
  1243 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
  1244 + return(0);
  1245 + }
  1246 +
  1247 + // ----- Look if the $p_archive_to_add is a PclZip object
  1248 + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))
  1249 + {
  1250 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object");
  1251 +
  1252 + // ----- Merge the archive
  1253 + $v_result = $this->privMerge($p_archive_to_add);
  1254 + }
  1255 +
  1256 + // ----- Look if the $p_archive_to_add is a string (so a filename)
  1257 + else if (is_string($p_archive_to_add))
  1258 + {
  1259 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename");
  1260 +
  1261 + // ----- Create a temporary archive
  1262 + $v_object_archive = new PclZip($p_archive_to_add);
  1263 +
  1264 + // ----- Merge the archive
  1265 + $v_result = $this->privMerge($v_object_archive);
  1266 + }
  1267 +
  1268 + // ----- Invalid variable
  1269 + else
  1270 + {
  1271 + // ----- Error log
  1272 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
  1273 + $v_result = PCLZIP_ERR_INVALID_PARAMETER;
  1274 + }
  1275 +
  1276 + // ----- Return
  1277 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1278 + return $v_result;
  1279 + }
  1280 + // --------------------------------------------------------------------------------
  1281 +
  1282 +
  1283 +
  1284 + // --------------------------------------------------------------------------------
  1285 + // Function : errorCode()
  1286 + // Description :
  1287 + // Parameters :
  1288 + // --------------------------------------------------------------------------------
  1289 + function errorCode()
  1290 + {
  1291 + if (PCLZIP_ERROR_EXTERNAL == 1) {
  1292 + return(PclErrorCode());
  1293 + }
  1294 + else {
  1295 + return($this->error_code);
  1296 + }
  1297 + }
  1298 + // --------------------------------------------------------------------------------
  1299 +
  1300 + // --------------------------------------------------------------------------------
  1301 + // Function : errorName()
  1302 + // Description :
  1303 + // Parameters :
  1304 + // --------------------------------------------------------------------------------
  1305 + function errorName($p_with_code=false)
  1306 + {
  1307 + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
  1308 + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
  1309 + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
  1310 + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
  1311 + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
  1312 + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
  1313 + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
  1314 + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
  1315 + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
  1316 + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
  1317 + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
  1318 + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
  1319 + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
  1320 + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
  1321 + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
  1322 + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
  1323 + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
  1324 + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
  1325 + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'
  1326 + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'
  1327 + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
  1328 + );
  1329 +
  1330 + if (isset($v_name[$this->error_code])) {
  1331 + $v_value = $v_name[$this->error_code];
  1332 + }
  1333 + else {
  1334 + $v_value = 'NoName';
  1335 + }
  1336 +
  1337 + if ($p_with_code) {
  1338 + return($v_value.' ('.$this->error_code.')');
  1339 + }
  1340 + else {
  1341 + return($v_value);
  1342 + }
  1343 + }
  1344 + // --------------------------------------------------------------------------------
  1345 +
  1346 + // --------------------------------------------------------------------------------
  1347 + // Function : errorInfo()
  1348 + // Description :
  1349 + // Parameters :
  1350 + // --------------------------------------------------------------------------------
  1351 + function errorInfo($p_full=false)
  1352 + {
  1353 + if (PCLZIP_ERROR_EXTERNAL == 1) {
  1354 + return(PclErrorString());
  1355 + }
  1356 + else {
  1357 + if ($p_full) {
  1358 + return($this->errorName(true)." : ".$this->error_string);
  1359 + }
  1360 + else {
  1361 + return($this->error_string." [code ".$this->error_code."]");
  1362 + }
  1363 + }
  1364 + }
  1365 + // --------------------------------------------------------------------------------
  1366 +
  1367 +
  1368 +// --------------------------------------------------------------------------------
  1369 +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****
  1370 +// ***** *****
  1371 +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY *****
  1372 +// --------------------------------------------------------------------------------
  1373 +
  1374 +
  1375 +
  1376 + // --------------------------------------------------------------------------------
  1377 + // Function : privCheckFormat()
  1378 + // Description :
  1379 + // This method check that the archive exists and is a valid zip archive.
  1380 + // Several level of check exists. (futur)
  1381 + // Parameters :
  1382 + // $p_level : Level of check. Default 0.
  1383 + // 0 : Check the first bytes (magic codes) (default value))
  1384 + // 1 : 0 + Check the central directory (futur)
  1385 + // 2 : 1 + Check each file header (futur)
  1386 + // Return Values :
  1387 + // true on success,
  1388 + // false on error, the error code is set.
  1389 + // --------------------------------------------------------------------------------
  1390 + function privCheckFormat($p_level=0)
  1391 + {
  1392 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", "");
  1393 + $v_result = true;
  1394 +
  1395 + // ----- Reset the file system cache
  1396 + clearstatcache();
  1397 +
  1398 + // ----- Reset the error handler
  1399 + $this->privErrorReset();
  1400 +
  1401 + // ----- Look if the file exits
  1402 + if (!is_file($this->zipname)) {
  1403 + // ----- Error log
  1404 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
  1405 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
  1406 + return(false);
  1407 + }
  1408 +
  1409 + // ----- Check that the file is readeable
  1410 + if (!is_readable($this->zipname)) {
  1411 + // ----- Error log
  1412 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
  1413 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
  1414 + return(false);
  1415 + }
  1416 +
  1417 + // ----- Check the magic code
  1418 + // TBC
  1419 +
  1420 + // ----- Check the central header
  1421 + // TBC
  1422 +
  1423 + // ----- Check each file header
  1424 + // TBC
  1425 +
  1426 + // ----- Return
  1427 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1428 + return $v_result;
  1429 + }
  1430 + // --------------------------------------------------------------------------------
  1431 +
  1432 + // --------------------------------------------------------------------------------
  1433 + // Function : privParseOptions()
  1434 + // Description :
  1435 + // This internal methods reads the variable list of arguments ($p_options_list,
  1436 + // $p_size) and generate an array with the options and values ($v_result_list).
  1437 + // $v_requested_options contains the options that can be present and those that
  1438 + // must be present.
  1439 + // $v_requested_options is an array, with the option value as key, and 'optional',
  1440 + // or 'mandatory' as value.
  1441 + // Parameters :
  1442 + // See above.
  1443 + // Return Values :
  1444 + // 1 on success.
  1445 + // 0 on failure.
  1446 + // --------------------------------------------------------------------------------
  1447 + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
  1448 + {
  1449 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", "");
  1450 + $v_result=1;
  1451 +
  1452 + // ----- Read the options
  1453 + $i=0;
  1454 + while ($i<$p_size) {
  1455 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'");
  1456 +
  1457 + // ----- Check if the option is supported
  1458 + if (!isset($v_requested_options[$p_options_list[$i]])) {
  1459 + // ----- Error log
  1460 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");
  1461 +
  1462 + // ----- Return
  1463 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1464 + return PclZip::errorCode();
  1465 + }
  1466 +
  1467 + // ----- Look for next option
  1468 + switch ($p_options_list[$i]) {
  1469 + // ----- Look for options that request a path value
  1470 + case PCLZIP_OPT_PATH :
  1471 + case PCLZIP_OPT_REMOVE_PATH :
  1472 + case PCLZIP_OPT_ADD_PATH :
  1473 + // ----- Check the number of parameters
  1474 + if (($i+1) >= $p_size) {
  1475 + // ----- Error log
  1476 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1477 +
  1478 + // ----- Return
  1479 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1480 + return PclZip::errorCode();
  1481 + }
  1482 +
  1483 + // ----- Get the value
  1484 + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);
  1485 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1486 + $i++;
  1487 + break;
  1488 +
  1489 + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
  1490 + // ----- Check the number of parameters
  1491 + if (($i+1) >= $p_size) {
  1492 + // ----- Error log
  1493 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1494 +
  1495 + // ----- Return
  1496 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1497 + return PclZip::errorCode();
  1498 + }
  1499 +
  1500 + // ----- Get the value
  1501 + if ( is_string($p_options_list[$i+1])
  1502 + && ($p_options_list[$i+1] != '')) {
  1503 + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);
  1504 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1505 + $i++;
  1506 + }
  1507 + else {
  1508 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored.");
  1509 + }
  1510 + break;
  1511 +
  1512 + // ----- Look for options that request an array of string for value
  1513 + case PCLZIP_OPT_BY_NAME :
  1514 + // ----- Check the number of parameters
  1515 + if (($i+1) >= $p_size) {
  1516 + // ----- Error log
  1517 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1518 +
  1519 + // ----- Return
  1520 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1521 + return PclZip::errorCode();
  1522 + }
  1523 +
  1524 + // ----- Get the value
  1525 + if (is_string($p_options_list[$i+1])) {
  1526 + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
  1527 + }
  1528 + else if (is_array($p_options_list[$i+1])) {
  1529 + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1530 + }
  1531 + else {
  1532 + // ----- Error log
  1533 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1534 +
  1535 + // ----- Return
  1536 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1537 + return PclZip::errorCode();
  1538 + }
  1539 + ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1540 + $i++;
  1541 + break;
  1542 +
  1543 + // ----- Look for options that request an EREG or PREG expression
  1544 + case PCLZIP_OPT_BY_EREG :
  1545 + case PCLZIP_OPT_BY_PREG :
  1546 + //case PCLZIP_OPT_CRYPT :
  1547 + // ----- Check the number of parameters
  1548 + if (($i+1) >= $p_size) {
  1549 + // ----- Error log
  1550 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1551 +
  1552 + // ----- Return
  1553 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1554 + return PclZip::errorCode();
  1555 + }
  1556 +
  1557 + // ----- Get the value
  1558 + if (is_string($p_options_list[$i+1])) {
  1559 + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1560 + }
  1561 + else {
  1562 + // ----- Error log
  1563 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1564 +
  1565 + // ----- Return
  1566 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1567 + return PclZip::errorCode();
  1568 + }
  1569 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1570 + $i++;
  1571 + break;
  1572 +
  1573 + // ----- Look for options that takes a string
  1574 + case PCLZIP_OPT_COMMENT :
  1575 + case PCLZIP_OPT_ADD_COMMENT :
  1576 + case PCLZIP_OPT_PREPEND_COMMENT :
  1577 + // ----- Check the number of parameters
  1578 + if (($i+1) >= $p_size) {
  1579 + // ----- Error log
  1580 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
  1581 + "Missing parameter value for option '"
  1582 + .PclZipUtilOptionText($p_options_list[$i])
  1583 + ."'");
  1584 +
  1585 + // ----- Return
  1586 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1587 + return PclZip::errorCode();
  1588 + }
  1589 +
  1590 + // ----- Get the value
  1591 + if (is_string($p_options_list[$i+1])) {
  1592 + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1593 + }
  1594 + else {
  1595 + // ----- Error log
  1596 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
  1597 + "Wrong parameter value for option '"
  1598 + .PclZipUtilOptionText($p_options_list[$i])
  1599 + ."'");
  1600 +
  1601 + // ----- Return
  1602 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1603 + return PclZip::errorCode();
  1604 + }
  1605 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1606 + $i++;
  1607 + break;
  1608 +
  1609 + // ----- Look for options that request an array of index
  1610 + case PCLZIP_OPT_BY_INDEX :
  1611 + // ----- Check the number of parameters
  1612 + if (($i+1) >= $p_size) {
  1613 + // ----- Error log
  1614 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1615 +
  1616 + // ----- Return
  1617 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1618 + return PclZip::errorCode();
  1619 + }
  1620 +
  1621 + // ----- Get the value
  1622 + $v_work_list = array();
  1623 + if (is_string($p_options_list[$i+1])) {
  1624 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'");
  1625 +
  1626 + // ----- Remove spaces
  1627 + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');
  1628 +
  1629 + // ----- Parse items
  1630 + $v_work_list = explode(",", $p_options_list[$i+1]);
  1631 + }
  1632 + else if (is_integer($p_options_list[$i+1])) {
  1633 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'");
  1634 + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
  1635 + }
  1636 + else if (is_array($p_options_list[$i+1])) {
  1637 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array");
  1638 + $v_work_list = $p_options_list[$i+1];
  1639 + }
  1640 + else {
  1641 + // ----- Error log
  1642 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1643 +
  1644 + // ----- Return
  1645 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1646 + return PclZip::errorCode();
  1647 + }
  1648 +
  1649 + // ----- Reduce the index list
  1650 + // each index item in the list must be a couple with a start and
  1651 + // an end value : [0,3], [5-5], [8-10], ...
  1652 + // ----- Check the format of each item
  1653 + $v_sort_flag=false;
  1654 + $v_sort_value=0;
  1655 + for ($j=0; $j<sizeof($v_work_list); $j++) {
  1656 + // ----- Explode the item
  1657 + $v_item_list = explode("-", $v_work_list[$j]);
  1658 + $v_size_item_list = sizeof($v_item_list);
  1659 +
  1660 + // ----- TBC : Here we might check that each item is a
  1661 + // real integer ...
  1662 +
  1663 + // ----- Look for single value
  1664 + if ($v_size_item_list == 1) {
  1665 + // ----- Set the option value
  1666 + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
  1667 + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
  1668 + }
  1669 + elseif ($v_size_item_list == 2) {
  1670 + // ----- Set the option value
  1671 + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
  1672 + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
  1673 + }
  1674 + else {
  1675 + // ----- Error log
  1676 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1677 +
  1678 + // ----- Return
  1679 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1680 + return PclZip::errorCode();
  1681 + }
  1682 +
  1683 + //--(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']."]");
  1684 +
  1685 + // ----- Look for list sort
  1686 + if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
  1687 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The list should be sorted ...");
  1688 + $v_sort_flag=true;
  1689 +
  1690 + // ----- TBC : An automatic sort should be writen ...
  1691 + // ----- Error log
  1692 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1693 +
  1694 + // ----- Return
  1695 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1696 + return PclZip::errorCode();
  1697 + }
  1698 + $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
  1699 + }
  1700 +
  1701 + // ----- Sort the items
  1702 + if ($v_sort_flag) {
  1703 + // TBC : To Be Completed
  1704 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "List sorting is not yet write ...");
  1705 + }
  1706 +
  1707 + // ----- Next option
  1708 + $i++;
  1709 + break;
  1710 +
  1711 + // ----- Look for options that request no value
  1712 + case PCLZIP_OPT_REMOVE_ALL_PATH :
  1713 + case PCLZIP_OPT_EXTRACT_AS_STRING :
  1714 + case PCLZIP_OPT_NO_COMPRESSION :
  1715 + case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
  1716 + case PCLZIP_OPT_REPLACE_NEWER :
  1717 + case PCLZIP_OPT_STOP_ON_ERROR :
  1718 + $v_result_list[$p_options_list[$i]] = true;
  1719 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1720 + break;
  1721 +
  1722 + // ----- Look for options that request an octal value
  1723 + case PCLZIP_OPT_SET_CHMOD :
  1724 + // ----- Check the number of parameters
  1725 + if (($i+1) >= $p_size) {
  1726 + // ----- Error log
  1727 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1728 +
  1729 + // ----- Return
  1730 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1731 + return PclZip::errorCode();
  1732 + }
  1733 +
  1734 + // ----- Get the value
  1735 + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1736 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
  1737 + $i++;
  1738 + break;
  1739 +
  1740 + // ----- Look for options that request a call-back
  1741 + case PCLZIP_CB_PRE_EXTRACT :
  1742 + case PCLZIP_CB_POST_EXTRACT :
  1743 + case PCLZIP_CB_PRE_ADD :
  1744 + case PCLZIP_CB_POST_ADD :
  1745 + /* for futur use
  1746 + case PCLZIP_CB_PRE_DELETE :
  1747 + case PCLZIP_CB_POST_DELETE :
  1748 + case PCLZIP_CB_PRE_LIST :
  1749 + case PCLZIP_CB_POST_LIST :
  1750 + */
  1751 + // ----- Check the number of parameters
  1752 + if (($i+1) >= $p_size) {
  1753 + // ----- Error log
  1754 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1755 +
  1756 + // ----- Return
  1757 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1758 + return PclZip::errorCode();
  1759 + }
  1760 +
  1761 + // ----- Get the value
  1762 + $v_function_name = $p_options_list[$i+1];
  1763 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'");
  1764 +
  1765 + // ----- Check that the value is a valid existing function
  1766 + if (!function_exists($v_function_name)) {
  1767 + // ----- Error log
  1768 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1769 +
  1770 + // ----- Return
  1771 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1772 + return PclZip::errorCode();
  1773 + }
  1774 +
  1775 + // ----- Set the attribute
  1776 + $v_result_list[$p_options_list[$i]] = $v_function_name;
  1777 + $i++;
  1778 + break;
  1779 +
  1780 + default :
  1781 + // ----- Error log
  1782 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  1783 + "Unknown parameter '"
  1784 + .$p_options_list[$i]."'");
  1785 +
  1786 + // ----- Return
  1787 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1788 + return PclZip::errorCode();
  1789 + }
  1790 +
  1791 + // ----- Next options
  1792 + $i++;
  1793 + }
  1794 +
  1795 + // ----- Look for mandatory options
  1796 + if ($v_requested_options !== false) {
  1797 + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
  1798 + // ----- Look for mandatory option
  1799 + if ($v_requested_options[$key] == 'mandatory') {
  1800 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
  1801 + // ----- Look if present
  1802 + if (!isset($v_result_list[$key])) {
  1803 + // ----- Error log
  1804 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
  1805 +
  1806 + // ----- Return
  1807 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1808 + return PclZip::errorCode();
  1809 + }
  1810 + }
  1811 + }
  1812 + }
  1813 +
  1814 + // ----- Return
  1815 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1816 + return $v_result;
  1817 + }
  1818 + // --------------------------------------------------------------------------------
  1819 +
  1820 + // --------------------------------------------------------------------------------
  1821 + // Function : privFileDescrParseAtt()
  1822 + // Description :
  1823 + // Parameters :
  1824 + // Return Values :
  1825 + // 1 on success.
  1826 + // 0 on failure.
  1827 + // --------------------------------------------------------------------------------
  1828 + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
  1829 + {
  1830 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrParseAtt", "");
  1831 + $v_result=1;
  1832 +
  1833 + // ----- For each file in the list check the attributes
  1834 + foreach ($p_file_list as $v_key => $v_value) {
  1835 +
  1836 + // ----- Check if the option is supported
  1837 + if (!isset($v_requested_options[$v_key])) {
  1838 + // ----- Error log
  1839 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");
  1840 +
  1841 + // ----- Return
  1842 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1843 + return PclZip::errorCode();
  1844 + }
  1845 +
  1846 + // ----- Look for attribute
  1847 + switch ($v_key) {
  1848 + case PCLZIP_ATT_FILE_NAME :
  1849 + if (!is_string($v_value)) {
  1850 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1851 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1852 + return PclZip::errorCode();
  1853 + }
  1854 +
  1855 + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
  1856 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1857 +
  1858 + if ($p_filedescr['filename'] == '') {
  1859 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1860 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1861 + return PclZip::errorCode();
  1862 + }
  1863 +
  1864 + break;
  1865 +
  1866 + case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
  1867 + if (!is_string($v_value)) {
  1868 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1869 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1870 + return PclZip::errorCode();
  1871 + }
  1872 +
  1873 + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);
  1874 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1875 +
  1876 + if ($p_filedescr['new_short_name'] == '') {
  1877 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1878 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1879 + return PclZip::errorCode();
  1880 + }
  1881 + break;
  1882 +
  1883 + case PCLZIP_ATT_FILE_NEW_FULL_NAME :
  1884 + if (!is_string($v_value)) {
  1885 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1886 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1887 + return PclZip::errorCode();
  1888 + }
  1889 +
  1890 + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);
  1891 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
  1892 +
  1893 + if ($p_filedescr['new_full_name'] == '') {
  1894 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1895 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1896 + return PclZip::errorCode();
  1897 + }
  1898 + break;
  1899 +
  1900 + default :
  1901 + // ----- Error log
  1902 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  1903 + "Unknown parameter '".$v_key."'");
  1904 +
  1905 + // ----- Return
  1906 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1907 + return PclZip::errorCode();
  1908 + }
  1909 +
  1910 + // ----- Look for mandatory options
  1911 + if ($v_requested_options !== false) {
  1912 + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
  1913 + // ----- Look for mandatory option
  1914 + if ($v_requested_options[$key] == 'mandatory') {
  1915 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
  1916 + // ----- Look if present
  1917 + if (!isset($p_file_list[$key])) {
  1918 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
  1919 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1920 + return PclZip::errorCode();
  1921 + }
  1922 + }
  1923 + }
  1924 + }
  1925 +
  1926 + // end foreach
  1927 + }
  1928 +
  1929 + // ----- Return
  1930 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  1931 + return $v_result;
  1932 + }
  1933 + // --------------------------------------------------------------------------------
  1934 +
  1935 + // --------------------------------------------------------------------------------
  1936 + // Function : privFileDescrExpand()
  1937 + // Description :
  1938 + // Parameters :
  1939 + // Return Values :
  1940 + // 1 on success.
  1941 + // 0 on failure.
  1942 + // --------------------------------------------------------------------------------
  1943 + function privFileDescrExpand(&$p_filedescr_list, &$p_options)
  1944 + {
  1945 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrExpand", "");
  1946 + $v_result=1;
  1947 +
  1948 + // ----- Create a result list
  1949 + $v_result_list = array();
  1950 +
  1951 + // ----- Look each entry
  1952 + for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
  1953 + // ----- Get filedescr
  1954 + $v_descr = $p_filedescr_list[$i];
  1955 +
  1956 + // ----- Reduce the filename
  1957 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr before reduction :'".$v_descr['filename']."'");
  1958 + $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename']);
  1959 + $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
  1960 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr after reduction :'".$v_descr['filename']."'");
  1961 +
  1962 + // ----- Get type of descr
  1963 + if (!file_exists($v_descr['filename'])) {
  1964 + // ----- Error log
  1965 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_descr['filename']."' does not exists");
  1966 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exists");
  1967 +
  1968 + // ----- Return
  1969 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  1970 + return PclZip::errorCode();
  1971 + }
  1972 + if (@is_file($v_descr['filename'])) {
  1973 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a file");
  1974 + $v_descr['type'] = 'file';
  1975 + }
  1976 + else if (@is_dir($v_descr['filename'])) {
  1977 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a folder");
  1978 + $v_descr['type'] = 'folder';
  1979 + }
  1980 + else if (@is_link($v_descr['filename'])) {
  1981 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : link");
  1982 + // skip
  1983 + continue;
  1984 + }
  1985 + else {
  1986 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : unknown type");
  1987 + // skip
  1988 + continue;
  1989 + }
  1990 +
  1991 + // ----- Calculate the stored filename
  1992 + $this->privCalculateStoredFilename($v_descr, $p_options);
  1993 +
  1994 + // ----- Add the descriptor in result list
  1995 + $v_result_list[sizeof($v_result_list)] = $v_descr;
  1996 +
  1997 + // ----- Look for folder
  1998 + if ($v_descr['type'] == 'folder') {
  1999 + // ----- List of items in folder
  2000 + $v_dirlist_descr = array();
  2001 + $v_dirlist_nb = 0;
  2002 + if ($v_folder_handler = @opendir($v_descr['filename'])) {
  2003 + while (($v_item_handler = @readdir($v_folder_handler)) !== false) {
  2004 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for '".$v_item_handler."' in the directory");
  2005 +
  2006 + // ----- Skip '.' and '..'
  2007 + if (($v_item_handler == '.') || ($v_item_handler == '..')) {
  2008 + continue;
  2009 + }
  2010 +
  2011 + // ----- Compose the full filename
  2012 + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
  2013 +
  2014 + // ----- Look for different stored filename
  2015 + // Because the name of the folder was changed, the name of the
  2016 + // files/sub-folders also change
  2017 + if ($v_descr['stored_filename'] != $v_descr['filename']) {
  2018 + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
  2019 + }
  2020 +
  2021 + $v_dirlist_nb++;
  2022 + }
  2023 + }
  2024 + else {
  2025 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to open dir '".$v_descr['filename']."' in read mode. Skipped.");
  2026 + // TBC : unable to open folder in read mode
  2027 + }
  2028 +
  2029 + // ----- Expand each element of the list
  2030 + if ($v_dirlist_nb != 0) {
  2031 + // ----- Expand
  2032 + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
  2033 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2034 + return $v_result;
  2035 + }
  2036 +
  2037 + // ----- Concat the resulting list
  2038 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Merging result list (size '".sizeof($v_result_list)."') with dirlist (size '".sizeof($v_dirlist_descr)."')");
  2039 + $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
  2040 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "merged result list is size '".sizeof($v_result_list)."'");
  2041 + }
  2042 + else {
  2043 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Nothing in this folder to expand.");
  2044 + }
  2045 +
  2046 + // ----- Free local array
  2047 + unset($v_dirlist_descr);
  2048 + }
  2049 + }
  2050 +
  2051 + // ----- Get the result list
  2052 + $p_filedescr_list = $v_result_list;
  2053 +
  2054 + // ----- Return
  2055 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2056 + return $v_result;
  2057 + }
  2058 + // --------------------------------------------------------------------------------
  2059 +
  2060 + // --------------------------------------------------------------------------------
  2061 + // Function : privCreate()
  2062 + // Description :
  2063 + // Parameters :
  2064 + // Return Values :
  2065 + // --------------------------------------------------------------------------------
  2066 + function privCreate($p_filedescr_list, &$p_result_list, &$p_options)
  2067 + {
  2068 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list");
  2069 + $v_result=1;
  2070 + $v_list_detail = array();
  2071 +
  2072 + // ----- Magic quotes trick
  2073 + $this->privDisableMagicQuotes();
  2074 +
  2075 + // ----- Open the file in write mode
  2076 + if (($v_result = $this->privOpenFd('wb')) != 1)
  2077 + {
  2078 + // ----- Return
  2079 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2080 + return $v_result;
  2081 + }
  2082 +
  2083 + // ----- Add the list of files
  2084 + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);
  2085 +
  2086 + // ----- Close
  2087 + $this->privCloseFd();
  2088 +
  2089 + // ----- Magic quotes trick
  2090 + $this->privSwapBackMagicQuotes();
  2091 +
  2092 + // ----- Return
  2093 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2094 + return $v_result;
  2095 + }
  2096 + // --------------------------------------------------------------------------------
  2097 +
  2098 + // --------------------------------------------------------------------------------
  2099 + // Function : privAdd()
  2100 + // Description :
  2101 + // Parameters :
  2102 + // Return Values :
  2103 + // --------------------------------------------------------------------------------
  2104 + function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
  2105 + {
  2106 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list");
  2107 + $v_result=1;
  2108 + $v_list_detail = array();
  2109 +
  2110 + // ----- Look if the archive exists or is empty
  2111 + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
  2112 + {
  2113 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it.");
  2114 +
  2115 + // ----- Do a create
  2116 + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);
  2117 +
  2118 + // ----- Return
  2119 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2120 + return $v_result;
  2121 + }
  2122 + // ----- Magic quotes trick
  2123 + $this->privDisableMagicQuotes();
  2124 +
  2125 + // ----- Open the zip file
  2126 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  2127 + if (($v_result=$this->privOpenFd('rb')) != 1)
  2128 + {
  2129 + // ----- Magic quotes trick
  2130 + $this->privSwapBackMagicQuotes();
  2131 +
  2132 + // ----- Return
  2133 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2134 + return $v_result;
  2135 + }
  2136 +
  2137 + // ----- Read the central directory informations
  2138 + $v_central_dir = array();
  2139 + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  2140 + {
  2141 + $this->privCloseFd();
  2142 + $this->privSwapBackMagicQuotes();
  2143 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2144 + return $v_result;
  2145 + }
  2146 +
  2147 + // ----- Go to beginning of File
  2148 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
  2149 + @rewind($this->zip_fd);
  2150 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
  2151 +
  2152 + // ----- Creates a temporay file
  2153 + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
  2154 +
  2155 + // ----- Open the temporary file in write mode
  2156 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  2157 + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
  2158 + {
  2159 + $this->privCloseFd();
  2160 + $this->privSwapBackMagicQuotes();
  2161 +
  2162 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
  2163 +
  2164 + // ----- Return
  2165 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2166 + return PclZip::errorCode();
  2167 + }
  2168 +
  2169 + // ----- Copy the files from the archive to the temporary file
  2170 + // TBC : Here I should better append the file and go back to erase the central dir
  2171 + $v_size = $v_central_dir['offset'];
  2172 + while ($v_size != 0)
  2173 + {
  2174 + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  2175 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  2176 + $v_buffer = fread($this->zip_fd, $v_read_size);
  2177 + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  2178 + $v_size -= $v_read_size;
  2179 + }
  2180 +
  2181 + // ----- Swap the file descriptor
  2182 + // Here is a trick : I swap the temporary fd with the zip fd, in order to use
  2183 + // the following methods on the temporary fil and not the real archive
  2184 + $v_swap = $this->zip_fd;
  2185 + $this->zip_fd = $v_zip_temp_fd;
  2186 + $v_zip_temp_fd = $v_swap;
  2187 +
  2188 + // ----- Add the files
  2189 + $v_header_list = array();
  2190 + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
  2191 + {
  2192 + fclose($v_zip_temp_fd);
  2193 + $this->privCloseFd();
  2194 + @unlink($v_zip_temp_name);
  2195 + $this->privSwapBackMagicQuotes();
  2196 +
  2197 + // ----- Return
  2198 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2199 + return $v_result;
  2200 + }
  2201 +
  2202 + // ----- Store the offset of the central dir
  2203 + $v_offset = @ftell($this->zip_fd);
  2204 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
  2205 +
  2206 + // ----- Copy the block of file headers from the old archive
  2207 + $v_size = $v_central_dir['size'];
  2208 + while ($v_size != 0)
  2209 + {
  2210 + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  2211 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  2212 + $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
  2213 + @fwrite($this->zip_fd, $v_buffer, $v_read_size);
  2214 + $v_size -= $v_read_size;
  2215 + }
  2216 +
  2217 + // ----- Create the Central Dir files header
  2218 + for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
  2219 + {
  2220 + // ----- Create the file header
  2221 + if ($v_header_list[$i]['status'] == 'ok') {
  2222 + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  2223 + fclose($v_zip_temp_fd);
  2224 + $this->privCloseFd();
  2225 + @unlink($v_zip_temp_name);
  2226 + $this->privSwapBackMagicQuotes();
  2227 +
  2228 + // ----- Return
  2229 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2230 + return $v_result;
  2231 + }
  2232 + $v_count++;
  2233 + }
  2234 +
  2235 + // ----- Transform the header to a 'usable' info
  2236 + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  2237 + }
  2238 +
  2239 + // ----- Zip file comment
  2240 + $v_comment = $v_central_dir['comment'];
  2241 + if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  2242 + $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  2243 + }
  2244 + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
  2245 + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
  2246 + }
  2247 + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
  2248 + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
  2249 + }
  2250 +
  2251 + // ----- Calculate the size of the central header
  2252 + $v_size = @ftell($this->zip_fd)-$v_offset;
  2253 +
  2254 + // ----- Create the central dir footer
  2255 + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
  2256 + {
  2257 + // ----- Reset the file list
  2258 + unset($v_header_list);
  2259 + $this->privSwapBackMagicQuotes();
  2260 +
  2261 + // ----- Return
  2262 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2263 + return $v_result;
  2264 + }
  2265 +
  2266 + // ----- Swap back the file descriptor
  2267 + $v_swap = $this->zip_fd;
  2268 + $this->zip_fd = $v_zip_temp_fd;
  2269 + $v_zip_temp_fd = $v_swap;
  2270 +
  2271 + // ----- Close
  2272 + $this->privCloseFd();
  2273 +
  2274 + // ----- Close the temporary file
  2275 + @fclose($v_zip_temp_fd);
  2276 +
  2277 + // ----- Magic quotes trick
  2278 + $this->privSwapBackMagicQuotes();
  2279 +
  2280 + // ----- Delete the zip file
  2281 + // TBC : I should test the result ...
  2282 + @unlink($this->zipname);
  2283 +
  2284 + // ----- Rename the temporary file
  2285 + // TBC : I should test the result ...
  2286 + //@rename($v_zip_temp_name, $this->zipname);
  2287 + PclZipUtilRename($v_zip_temp_name, $this->zipname);
  2288 +
  2289 + // ----- Return
  2290 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2291 + return $v_result;
  2292 + }
  2293 + // --------------------------------------------------------------------------------
  2294 +
  2295 + // --------------------------------------------------------------------------------
  2296 + // Function : privOpenFd()
  2297 + // Description :
  2298 + // Parameters :
  2299 + // --------------------------------------------------------------------------------
  2300 + function privOpenFd($p_mode)
  2301 + {
  2302 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode);
  2303 + $v_result=1;
  2304 +
  2305 + // ----- Look if already open
  2306 + if ($this->zip_fd != 0)
  2307 + {
  2308 + // ----- Error log
  2309 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');
  2310 +
  2311 + // ----- Return
  2312 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2313 + return PclZip::errorCode();
  2314 + }
  2315 +
  2316 + // ----- Open the zip file
  2317 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode');
  2318 + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
  2319 + {
  2320 + // ----- Error log
  2321 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');
  2322 +
  2323 + // ----- Return
  2324 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2325 + return PclZip::errorCode();
  2326 + }
  2327 +
  2328 + // ----- Return
  2329 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2330 + return $v_result;
  2331 + }
  2332 + // --------------------------------------------------------------------------------
  2333 +
  2334 + // --------------------------------------------------------------------------------
  2335 + // Function : privCloseFd()
  2336 + // Description :
  2337 + // Parameters :
  2338 + // --------------------------------------------------------------------------------
  2339 + function privCloseFd()
  2340 + {
  2341 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", "");
  2342 + $v_result=1;
  2343 +
  2344 + if ($this->zip_fd != 0)
  2345 + @fclose($this->zip_fd);
  2346 + $this->zip_fd = 0;
  2347 +
  2348 + // ----- Return
  2349 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2350 + return $v_result;
  2351 + }
  2352 + // --------------------------------------------------------------------------------
  2353 +
  2354 + // --------------------------------------------------------------------------------
  2355 + // Function : privAddList()
  2356 + // Description :
  2357 + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
  2358 + // different from the real path of the file. This is usefull if you want to have PclTar
  2359 + // running in any directory, and memorize relative path from an other directory.
  2360 + // Parameters :
  2361 + // $p_list : An array containing the file or directory names to add in the tar
  2362 + // $p_result_list : list of added files with their properties (specially the status field)
  2363 + // $p_add_dir : Path to add in the filename path archived
  2364 + // $p_remove_dir : Path to remove in the filename path archived
  2365 + // Return Values :
  2366 + // --------------------------------------------------------------------------------
  2367 +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)
  2368 + function privAddList($p_filedescr_list, &$p_result_list, &$p_options)
  2369 + {
  2370 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list");
  2371 + $v_result=1;
  2372 +
  2373 + // ----- Add the files
  2374 + $v_header_list = array();
  2375 + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
  2376 + {
  2377 + // ----- Return
  2378 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2379 + return $v_result;
  2380 + }
  2381 +
  2382 + // ----- Store the offset of the central dir
  2383 + $v_offset = @ftell($this->zip_fd);
  2384 +
  2385 + // ----- Create the Central Dir files header
  2386 + for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
  2387 + {
  2388 + // ----- Create the file header
  2389 + if ($v_header_list[$i]['status'] == 'ok') {
  2390 + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  2391 + // ----- Return
  2392 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2393 + return $v_result;
  2394 + }
  2395 + $v_count++;
  2396 + }
  2397 +
  2398 + // ----- Transform the header to a 'usable' info
  2399 + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  2400 + }
  2401 +
  2402 + // ----- Zip file comment
  2403 + $v_comment = '';
  2404 + if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  2405 + $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  2406 + }
  2407 +
  2408 + // ----- Calculate the size of the central header
  2409 + $v_size = @ftell($this->zip_fd)-$v_offset;
  2410 +
  2411 + // ----- Create the central dir footer
  2412 + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
  2413 + {
  2414 + // ----- Reset the file list
  2415 + unset($v_header_list);
  2416 +
  2417 + // ----- Return
  2418 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2419 + return $v_result;
  2420 + }
  2421 +
  2422 + // ----- Return
  2423 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2424 + return $v_result;
  2425 + }
  2426 + // --------------------------------------------------------------------------------
  2427 +
  2428 + // --------------------------------------------------------------------------------
  2429 + // Function : privAddFileList()
  2430 + // Description :
  2431 + // Parameters :
  2432 + // $p_filedescr_list : An array containing the file description
  2433 + // or directory names to add in the zip
  2434 + // $p_result_list : list of added files with their properties (specially the status field)
  2435 + // Return Values :
  2436 + // --------------------------------------------------------------------------------
  2437 + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)
  2438 + {
  2439 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "filedescr_list");
  2440 + $v_result=1;
  2441 + $v_header = array();
  2442 +
  2443 + // ----- Recuperate the current number of elt in list
  2444 + $v_nb = sizeof($p_result_list);
  2445 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have ".$v_nb." elements");
  2446 +
  2447 + // ----- Loop on the files
  2448 + for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
  2449 + // ----- Format the filename
  2450 + $p_filedescr_list[$j]['filename']
  2451 + = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
  2452 +
  2453 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for file '".$p_filedescr_list[$j]['filename']."'");
  2454 +
  2455 + // ----- Skip empty file names
  2456 + // TBC : Can this be possible ? not checked in DescrParseAtt ?
  2457 + if ($p_filedescr_list[$j]['filename'] == "") {
  2458 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Skip empty filename");
  2459 + continue;
  2460 + }
  2461 +
  2462 + // ----- Check the filename
  2463 + if (!file_exists($p_filedescr_list[$j]['filename'])) {
  2464 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
  2465 + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
  2466 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2467 + return PclZip::errorCode();
  2468 + }
  2469 +
  2470 + // ----- Look if it is a file or a dir with no all path remove option
  2471 + if ( (is_file($p_filedescr_list[$j]['filename']))
  2472 + || ( is_dir($p_filedescr_list[$j]['filename'])
  2473 + && ( !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
  2474 + || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {
  2475 +
  2476 + // ----- Add the file
  2477 + $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
  2478 + $p_options);
  2479 + if ($v_result != 1) {
  2480 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2481 + return $v_result;
  2482 + }
  2483 +
  2484 + // ----- Store the file infos
  2485 + $p_result_list[$v_nb++] = $v_header;
  2486 + }
  2487 + }
  2488 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have ".$v_nb." elements");
  2489 +
  2490 + // ----- Return
  2491 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2492 + return $v_result;
  2493 + }
  2494 + // --------------------------------------------------------------------------------
  2495 +
  2496 + // --------------------------------------------------------------------------------
  2497 + // Function : privAddFile()
  2498 + // Description :
  2499 + // Parameters :
  2500 + // Return Values :
  2501 + // --------------------------------------------------------------------------------
  2502 + function privAddFile($p_filedescr, &$p_header, &$p_options)
  2503 + {
  2504 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='".$p_filedescr['filename']."'");
  2505 + $v_result=1;
  2506 +
  2507 + // ----- Working variable
  2508 + $p_filename = $p_filedescr['filename'];
  2509 +
  2510 + // TBC : Already done in the fileAtt check ... ?
  2511 + if ($p_filename == "") {
  2512 + // ----- Error log
  2513 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
  2514 +
  2515 + // ----- Return
  2516 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2517 + return PclZip::errorCode();
  2518 + }
  2519 +
  2520 + // ----- Look for a stored different filename
  2521 + if (isset($p_filedescr['stored_filename'])) {
  2522 + $v_stored_filename = $p_filedescr['stored_filename'];
  2523 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is NOT the same "'.$v_stored_filename.'"');
  2524 + }
  2525 + else {
  2526 + $v_stored_filename = $p_filedescr['stored_filename'];
  2527 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is the same');
  2528 + }
  2529 +
  2530 + // ----- Set the file properties
  2531 + clearstatcache();
  2532 + $p_header['version'] = 20;
  2533 + $p_header['version_extracted'] = 10;
  2534 + $p_header['flag'] = 0;
  2535 + $p_header['compression'] = 0;
  2536 + $p_header['mtime'] = filemtime($p_filename);
  2537 + $p_header['crc'] = 0;
  2538 + $p_header['compressed_size'] = 0;
  2539 + $p_header['size'] = filesize($p_filename);
  2540 + $p_header['filename_len'] = strlen($p_filename);
  2541 + $p_header['extra_len'] = 0;
  2542 + $p_header['comment_len'] = 0;
  2543 + $p_header['disk'] = 0;
  2544 + $p_header['internal'] = 0;
  2545 +// $p_header['external'] = (is_file($p_filename)?0xFE49FFE0:0x41FF0010);
  2546 + $p_header['external'] = (is_file($p_filename)?0x00000000:0x00000010);
  2547 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'");
  2548 + $p_header['offset'] = 0;
  2549 + $p_header['filename'] = $p_filename;
  2550 + $p_header['stored_filename'] = $v_stored_filename;
  2551 + $p_header['extra'] = '';
  2552 + $p_header['comment'] = '';
  2553 + $p_header['status'] = 'ok';
  2554 + $p_header['index'] = -1;
  2555 +
  2556 + // ----- Look for pre-add callback
  2557 + if (isset($p_options[PCLZIP_CB_PRE_ADD])) {
  2558 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction");
  2559 +
  2560 + // ----- Generate a local information
  2561 + $v_local_header = array();
  2562 + $this->privConvertHeader2FileInfo($p_header, $v_local_header);
  2563 +
  2564 + // ----- Call the callback
  2565 + // Here I do not use call_user_func() because I need to send a reference to the
  2566 + // header.
  2567 + eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');
  2568 + if ($v_result == 0) {
  2569 + // ----- Change the file status
  2570 + $p_header['status'] = "skipped";
  2571 + $v_result = 1;
  2572 + }
  2573 +
  2574 + // ----- Update the informations
  2575 + // Only some fields can be modified
  2576 + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
  2577 + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
  2578 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'");
  2579 + }
  2580 + }
  2581 +
  2582 + // ----- Look for empty stored filename
  2583 + if ($p_header['stored_filename'] == "") {
  2584 + $p_header['status'] = "filtered";
  2585 + }
  2586 +
  2587 + // ----- Check the path length
  2588 + if (strlen($p_header['stored_filename']) > 0xFF) {
  2589 + $p_header['status'] = 'filename_too_long';
  2590 + }
  2591 +
  2592 + // ----- Look if no error, or file not skipped
  2593 + if ($p_header['status'] == 'ok') {
  2594 +
  2595 + // ----- Look for a file
  2596 + if (is_file($p_filename))
  2597 + {
  2598 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file");
  2599 + // ----- Open the source file
  2600 + if (($v_file = @fopen($p_filename, "rb")) == 0) {
  2601 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
  2602 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  2603 + return PclZip::errorCode();
  2604 + }
  2605 +
  2606 + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
  2607 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed");
  2608 + // ----- Read the file content
  2609 + $v_content_compressed = @fread($v_file, $p_header['size']);
  2610 +
  2611 + // ----- Calculate the CRC
  2612 + $p_header['crc'] = @crc32($v_content_compressed);
  2613 +
  2614 + // ----- Set header parameters
  2615 + $p_header['compressed_size'] = $p_header['size'];
  2616 + $p_header['compression'] = 0;
  2617 + }
  2618 + else {
  2619 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed");
  2620 + // ----- Read the file content
  2621 + $v_content = @fread($v_file, $p_header['size']);
  2622 +
  2623 + // ----- Calculate the CRC
  2624 + $p_header['crc'] = @crc32($v_content);
  2625 +
  2626 + // ----- Compress the file
  2627 + $v_content_compressed = @gzdeflate($v_content);
  2628 +
  2629 + // ----- Set header parameters
  2630 + $p_header['compressed_size'] = strlen($v_content_compressed);
  2631 + $p_header['compression'] = 8;
  2632 + }
  2633 +
  2634 + // ----- Look for encryption
  2635 + /*
  2636 + if ((isset($p_options[PCLZIP_OPT_CRYPT]))
  2637 + && ($p_options[PCLZIP_OPT_CRYPT] != "")) {
  2638 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ....");
  2639 +
  2640 + // Should be a random header
  2641 + $v_header = 'xxxxxxxxxxxx';
  2642 + $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed,
  2643 + $p_header['compressed_size'],
  2644 + $v_header,
  2645 + $p_header['crc'],
  2646 + "test");
  2647 +
  2648 + $p_header['compressed_size'] += 12;
  2649 + $p_header['flag'] = 1;
  2650 +
  2651 + // ----- Add the header to the data
  2652 + $v_content_compressed = $v_header.$v_content_compressed;
  2653 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed)."");
  2654 + }
  2655 + */
  2656 +
  2657 + // ----- Call the header generation
  2658 + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
  2659 + @fclose($v_file);
  2660 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2661 + return $v_result;
  2662 + }
  2663 +
  2664 + // ----- Write the compressed (or not) content
  2665 + @fwrite($this->zip_fd,
  2666 + $v_content_compressed, $p_header['compressed_size']);
  2667 +
  2668 + // ----- Close the file
  2669 + @fclose($v_file);
  2670 + }
  2671 +
  2672 + // ----- Look for a directory
  2673 + else {
  2674 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder");
  2675 + // ----- Look for directory last '/'
  2676 + if (@substr($p_header['stored_filename'], -1) != '/') {
  2677 + $p_header['stored_filename'] .= '/';
  2678 + }
  2679 +
  2680 + // ----- Set the file properties
  2681 + $p_header['size'] = 0;
  2682 + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked
  2683 + $p_header['external'] = 0x00000010; // Value for a folder : to be checked
  2684 +
  2685 + // ----- Call the header generation
  2686 + if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
  2687 + {
  2688 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2689 + return $v_result;
  2690 + }
  2691 + }
  2692 + }
  2693 +
  2694 + // ----- Look for post-add callback
  2695 + if (isset($p_options[PCLZIP_CB_POST_ADD])) {
  2696 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction");
  2697 +
  2698 + // ----- Generate a local information
  2699 + $v_local_header = array();
  2700 + $this->privConvertHeader2FileInfo($p_header, $v_local_header);
  2701 +
  2702 + // ----- Call the callback
  2703 + // Here I do not use call_user_func() because I need to send a reference to the
  2704 + // header.
  2705 + eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');
  2706 + if ($v_result == 0) {
  2707 + // ----- Ignored
  2708 + $v_result = 1;
  2709 + }
  2710 +
  2711 + // ----- Update the informations
  2712 + // Nothing can be modified
  2713 + }
  2714 +
  2715 + // ----- Return
  2716 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2717 + return $v_result;
  2718 + }
  2719 + // --------------------------------------------------------------------------------
  2720 +
  2721 + // --------------------------------------------------------------------------------
  2722 + // Function : privCalculateStoredFilename()
  2723 + // Description :
  2724 + // Based on file descriptor properties and global options, this method
  2725 + // calculate the filename that will be stored in the archive.
  2726 + // Parameters :
  2727 + // Return Values :
  2728 + // --------------------------------------------------------------------------------
  2729 + function privCalculateStoredFilename(&$p_filedescr, &$p_options)
  2730 + {
  2731 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCalculateStoredFilename", "filename='".$p_filedescr['filename']."'");
  2732 + $v_result=1;
  2733 +
  2734 + // ----- Working variables
  2735 + $p_filename = $p_filedescr['filename'];
  2736 + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
  2737 + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
  2738 + }
  2739 + else {
  2740 + $p_add_dir = '';
  2741 + }
  2742 + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
  2743 + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
  2744 + }
  2745 + else {
  2746 + $p_remove_dir = '';
  2747 + }
  2748 + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  2749 + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  2750 + }
  2751 + else {
  2752 + $p_remove_all_dir = 0;
  2753 + }
  2754 +
  2755 + // ----- Look for full name change
  2756 + if (isset($p_filedescr['new_full_name'])) {
  2757 + $v_stored_filename = $p_filedescr['new_full_name'];
  2758 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing full name of '".$p_filename."' for '".$v_stored_filename."'");
  2759 + }
  2760 +
  2761 + // ----- Look for path and/or short name change
  2762 + else {
  2763 +
  2764 + // ----- Look for short name change
  2765 + if (isset($p_filedescr['new_short_name'])) {
  2766 + $v_path_info = pathinfo($p_filename);
  2767 + $v_dir = '';
  2768 + if ($v_path_info['dirname'] != '') {
  2769 + $v_dir = $v_path_info['dirname'].'/';
  2770 + }
  2771 + $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
  2772 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing short name of '".$p_filename."' for '".$v_stored_filename."'");
  2773 + }
  2774 + else {
  2775 + // ----- Calculate the stored filename
  2776 + $v_stored_filename = $p_filename;
  2777 + }
  2778 +
  2779 + // ----- Look for all path to remove
  2780 + if ($p_remove_all_dir) {
  2781 + $v_stored_filename = basename($p_filename);
  2782 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove all path selected change '".$p_filename."' for '".$v_stored_filename."'");
  2783 + }
  2784 + // ----- Look for partial path remove
  2785 + else if ($p_remove_dir != "") {
  2786 + if (substr($p_remove_dir, -1) != '/')
  2787 + $p_remove_dir .= "/";
  2788 +
  2789 + if ( (substr($p_filename, 0, 2) == "./")
  2790 + || (substr($p_remove_dir, 0, 2) == "./")) {
  2791 +
  2792 + if ( (substr($p_filename, 0, 2) == "./")
  2793 + && (substr($p_remove_dir, 0, 2) != "./")) {
  2794 + $p_remove_dir = "./".$p_remove_dir;
  2795 + }
  2796 + if ( (substr($p_filename, 0, 2) != "./")
  2797 + && (substr($p_remove_dir, 0, 2) == "./")) {
  2798 + $p_remove_dir = substr($p_remove_dir, 2);
  2799 + }
  2800 + }
  2801 +
  2802 + $v_compare = PclZipUtilPathInclusion($p_remove_dir,
  2803 + $v_stored_filename);
  2804 + if ($v_compare > 0) {
  2805 + if ($v_compare == 2) {
  2806 + $v_stored_filename = "";
  2807 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder");
  2808 + }
  2809 + else {
  2810 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$v_stored_filename'");
  2811 + $v_stored_filename = substr($v_stored_filename,
  2812 + strlen($p_remove_dir));
  2813 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Result is '$v_stored_filename'");
  2814 + }
  2815 + }
  2816 + }
  2817 + // ----- Look for path to add
  2818 + if ($p_add_dir != "") {
  2819 + if (substr($p_add_dir, -1) == "/")
  2820 + $v_stored_filename = $p_add_dir.$v_stored_filename;
  2821 + else
  2822 + $v_stored_filename = $p_add_dir."/".$v_stored_filename;
  2823 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'");
  2824 + }
  2825 + }
  2826 +
  2827 + // ----- Filename (reduce the path of stored name)
  2828 + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
  2829 + $p_filedescr['stored_filename'] = $v_stored_filename;
  2830 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Stored filename will be '".$p_filedescr['stored_filename']."', strlen ".strlen($p_filedescr['stored_filename']));
  2831 +
  2832 + // ----- Return
  2833 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2834 + return $v_result;
  2835 + }
  2836 + // --------------------------------------------------------------------------------
  2837 +
  2838 + // --------------------------------------------------------------------------------
  2839 + // Function : privWriteFileHeader()
  2840 + // Description :
  2841 + // Parameters :
  2842 + // Return Values :
  2843 + // --------------------------------------------------------------------------------
  2844 + function privWriteFileHeader(&$p_header)
  2845 + {
  2846 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
  2847 + $v_result=1;
  2848 +
  2849 + // ----- Store the offset position of the file
  2850 + $p_header['offset'] = ftell($this->zip_fd);
  2851 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'File offset of the header :'.$p_header['offset']);
  2852 +
  2853 + // ----- Transform UNIX mtime to DOS format mdate/mtime
  2854 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
  2855 + $v_date = getdate($p_header['mtime']);
  2856 + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
  2857 + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
  2858 +
  2859 + // ----- Packed data
  2860 + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,
  2861 + $p_header['version_extracted'], $p_header['flag'],
  2862 + $p_header['compression'], $v_mtime, $v_mdate,
  2863 + $p_header['crc'], $p_header['compressed_size'],
  2864 + $p_header['size'],
  2865 + strlen($p_header['stored_filename']),
  2866 + $p_header['extra_len']);
  2867 +
  2868 + // ----- Write the first 148 bytes of the header in the archive
  2869 + fputs($this->zip_fd, $v_binary_data, 30);
  2870 +
  2871 + // ----- Write the variable fields
  2872 + if (strlen($p_header['stored_filename']) != 0)
  2873 + {
  2874 + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
  2875 + }
  2876 + if ($p_header['extra_len'] != 0)
  2877 + {
  2878 + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
  2879 + }
  2880 +
  2881 + // ----- Return
  2882 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2883 + return $v_result;
  2884 + }
  2885 + // --------------------------------------------------------------------------------
  2886 +
  2887 + // --------------------------------------------------------------------------------
  2888 + // Function : privWriteCentralFileHeader()
  2889 + // Description :
  2890 + // Parameters :
  2891 + // Return Values :
  2892 + // --------------------------------------------------------------------------------
  2893 + function privWriteCentralFileHeader(&$p_header)
  2894 + {
  2895 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
  2896 + $v_result=1;
  2897 +
  2898 + // TBC
  2899 + //for(reset($p_header); $key = key($p_header); next($p_header)) {
  2900 + // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]);
  2901 + //}
  2902 +
  2903 + // ----- Transform UNIX mtime to DOS format mdate/mtime
  2904 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
  2905 + $v_date = getdate($p_header['mtime']);
  2906 + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
  2907 + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
  2908 +
  2909 + // ----- Packed data
  2910 + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,
  2911 + $p_header['version'], $p_header['version_extracted'],
  2912 + $p_header['flag'], $p_header['compression'],
  2913 + $v_mtime, $v_mdate, $p_header['crc'],
  2914 + $p_header['compressed_size'], $p_header['size'],
  2915 + strlen($p_header['stored_filename']),
  2916 + $p_header['extra_len'], $p_header['comment_len'],
  2917 + $p_header['disk'], $p_header['internal'],
  2918 + $p_header['external'], $p_header['offset']);
  2919 +
  2920 + // ----- Write the 42 bytes of the header in the zip file
  2921 + fputs($this->zip_fd, $v_binary_data, 46);
  2922 +
  2923 + // ----- Write the variable fields
  2924 + if (strlen($p_header['stored_filename']) != 0)
  2925 + {
  2926 + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
  2927 + }
  2928 + if ($p_header['extra_len'] != 0)
  2929 + {
  2930 + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
  2931 + }
  2932 + if ($p_header['comment_len'] != 0)
  2933 + {
  2934 + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);
  2935 + }
  2936 +
  2937 + // ----- Return
  2938 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2939 + return $v_result;
  2940 + }
  2941 + // --------------------------------------------------------------------------------
  2942 +
  2943 + // --------------------------------------------------------------------------------
  2944 + // Function : privWriteCentralHeader()
  2945 + // Description :
  2946 + // Parameters :
  2947 + // Return Values :
  2948 + // --------------------------------------------------------------------------------
  2949 + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)
  2950 + {
  2951 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralHeader", 'nb_entries='.$p_nb_entries.', size='.$p_size.', offset='.$p_offset.', comment="'.$p_comment.'"');
  2952 + $v_result=1;
  2953 +
  2954 + // ----- Packed data
  2955 + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,
  2956 + $p_nb_entries, $p_size,
  2957 + $p_offset, strlen($p_comment));
  2958 +
  2959 + // ----- Write the 22 bytes of the header in the zip file
  2960 + fputs($this->zip_fd, $v_binary_data, 22);
  2961 +
  2962 + // ----- Write the variable fields
  2963 + if (strlen($p_comment) != 0)
  2964 + {
  2965 + fputs($this->zip_fd, $p_comment, strlen($p_comment));
  2966 + }
  2967 +
  2968 + // ----- Return
  2969 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  2970 + return $v_result;
  2971 + }
  2972 + // --------------------------------------------------------------------------------
  2973 +
  2974 + // --------------------------------------------------------------------------------
  2975 + // Function : privList()
  2976 + // Description :
  2977 + // Parameters :
  2978 + // Return Values :
  2979 + // --------------------------------------------------------------------------------
  2980 + function privList(&$p_list)
  2981 + {
  2982 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privList", "list");
  2983 + $v_result=1;
  2984 +
  2985 + // ----- Magic quotes trick
  2986 + $this->privDisableMagicQuotes();
  2987 +
  2988 + // ----- Open the zip file
  2989 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  2990 + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
  2991 + {
  2992 + // ----- Magic quotes trick
  2993 + $this->privSwapBackMagicQuotes();
  2994 +
  2995 + // ----- Error log
  2996 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
  2997 +
  2998 + // ----- Return
  2999 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3000 + return PclZip::errorCode();
  3001 + }
  3002 +
  3003 + // ----- Read the central directory informations
  3004 + $v_central_dir = array();
  3005 + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  3006 + {
  3007 + $this->privSwapBackMagicQuotes();
  3008 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3009 + return $v_result;
  3010 + }
  3011 +
  3012 + // ----- Go to beginning of Central Dir
  3013 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Offset : ".$v_central_dir['offset']."'");
  3014 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
  3015 + @rewind($this->zip_fd);
  3016 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
  3017 + if (@fseek($this->zip_fd, $v_central_dir['offset']))
  3018 + {
  3019 + $this->privSwapBackMagicQuotes();
  3020 +
  3021 + // ----- Error log
  3022 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  3023 +
  3024 + // ----- Return
  3025 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3026 + return PclZip::errorCode();
  3027 + }
  3028 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
  3029 +
  3030 + // ----- Read each entry
  3031 + for ($i=0; $i<$v_central_dir['entries']; $i++)
  3032 + {
  3033 + // ----- Read the file header
  3034 + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
  3035 + {
  3036 + $this->privSwapBackMagicQuotes();
  3037 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3038 + return $v_result;
  3039 + }
  3040 + $v_header['index'] = $i;
  3041 +
  3042 + // ----- Get the only interesting attributes
  3043 + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);
  3044 + unset($v_header);
  3045 + }
  3046 +
  3047 + // ----- Close the zip file
  3048 + $this->privCloseFd();
  3049 +
  3050 + // ----- Magic quotes trick
  3051 + $this->privSwapBackMagicQuotes();
  3052 +
  3053 + // ----- Return
  3054 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3055 + return $v_result;
  3056 + }
  3057 + // --------------------------------------------------------------------------------
  3058 +
  3059 + // --------------------------------------------------------------------------------
  3060 + // Function : privConvertHeader2FileInfo()
  3061 + // Description :
  3062 + // This function takes the file informations from the central directory
  3063 + // entries and extract the interesting parameters that will be given back.
  3064 + // The resulting file infos are set in the array $p_info
  3065 + // $p_info['filename'] : Filename with full path. Given by user (add),
  3066 + // extracted in the filesystem (extract).
  3067 + // $p_info['stored_filename'] : Stored filename in the archive.
  3068 + // $p_info['size'] = Size of the file.
  3069 + // $p_info['compressed_size'] = Compressed size of the file.
  3070 + // $p_info['mtime'] = Last modification date of the file.
  3071 + // $p_info['comment'] = Comment associated with the file.
  3072 + // $p_info['folder'] = true/false : indicates if the entry is a folder or not.
  3073 + // $p_info['status'] = status of the action on the file.
  3074 + // Parameters :
  3075 + // Return Values :
  3076 + // --------------------------------------------------------------------------------
  3077 + function privConvertHeader2FileInfo($p_header, &$p_info)
  3078 + {
  3079 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privConvertHeader2FileInfo", "Filename='".$p_header['filename']."'");
  3080 + $v_result=1;
  3081 +
  3082 + // ----- Get the interesting attributes
  3083 + $p_info['filename'] = $p_header['filename'];
  3084 + $p_info['stored_filename'] = $p_header['stored_filename'];
  3085 + $p_info['size'] = $p_header['size'];
  3086 + $p_info['compressed_size'] = $p_header['compressed_size'];
  3087 + $p_info['mtime'] = $p_header['mtime'];
  3088 + $p_info['comment'] = $p_header['comment'];
  3089 + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
  3090 + $p_info['index'] = $p_header['index'];
  3091 + $p_info['status'] = $p_header['status'];
  3092 +
  3093 + // ----- Return
  3094 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3095 + return $v_result;
  3096 + }
  3097 + // --------------------------------------------------------------------------------
  3098 +
  3099 + // --------------------------------------------------------------------------------
  3100 + // Function : privExtractByRule()
  3101 + // Description :
  3102 + // Extract a file or directory depending of rules (by index, by name, ...)
  3103 + // Parameters :
  3104 + // $p_file_list : An array where will be placed the properties of each
  3105 + // extracted file
  3106 + // $p_path : Path to add while writing the extracted files
  3107 + // $p_remove_path : Path to remove (from the file memorized path) while writing the
  3108 + // extracted files. If the path does not match the file path,
  3109 + // the file is extracted with its memorized path.
  3110 + // $p_remove_path does not apply to 'list' mode.
  3111 + // $p_path and $p_remove_path are commulative.
  3112 + // Return Values :
  3113 + // 1 on success,0 or less on error (see error code list)
  3114 + // --------------------------------------------------------------------------------
  3115 + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
  3116 + {
  3117 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privExtractByRule", "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
  3118 + $v_result=1;
  3119 +
  3120 + // ----- Magic quotes trick
  3121 + $this->privDisableMagicQuotes();
  3122 +
  3123 + // ----- Check the path
  3124 + if ( ($p_path == "")
  3125 + || ( (substr($p_path, 0, 1) != "/")
  3126 + && (substr($p_path, 0, 3) != "../")
  3127 + && (substr($p_path,1,2)!=":/")))
  3128 + $p_path = "./".$p_path;
  3129 +
  3130 + // ----- Reduce the path last (and duplicated) '/'
  3131 + if (($p_path != "./") && ($p_path != "/"))
  3132 + {
  3133 + // ----- Look for the path end '/'
  3134 + while (substr($p_path, -1) == "/")
  3135 + {
  3136 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'");
  3137 + $p_path = substr($p_path, 0, strlen($p_path)-1);
  3138 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]");
  3139 + }
  3140 + }
  3141 +
  3142 + // ----- Look for path to remove format (should end by /)
  3143 + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
  3144 + {
  3145 + $p_remove_path .= '/';
  3146 + }
  3147 + $p_remove_path_size = strlen($p_remove_path);
  3148 +
  3149 + // ----- Open the zip file
  3150 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  3151 + if (($v_result = $this->privOpenFd('rb')) != 1)
  3152 + {
  3153 + $this->privSwapBackMagicQuotes();
  3154 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3155 + return $v_result;
  3156 + }
  3157 +
  3158 + // ----- Read the central directory informations
  3159 + $v_central_dir = array();
  3160 + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  3161 + {
  3162 + // ----- Close the zip file
  3163 + $this->privCloseFd();
  3164 + $this->privSwapBackMagicQuotes();
  3165 +
  3166 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3167 + return $v_result;
  3168 + }
  3169 +
  3170 + // ----- Start at beginning of Central Dir
  3171 + $v_pos_entry = $v_central_dir['offset'];
  3172 +
  3173 + // ----- Read each entry
  3174 + $j_start = 0;
  3175 + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
  3176 + {
  3177 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry : '$i'");
  3178 +
  3179 + // ----- Read next Central dir entry
  3180 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position before rewind : ".ftell($this->zip_fd)."'");
  3181 + @rewind($this->zip_fd);
  3182 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position after rewind : ".ftell($this->zip_fd)."'");
  3183 + if (@fseek($this->zip_fd, $v_pos_entry))
  3184 + {
  3185 + // ----- Close the zip file
  3186 + $this->privCloseFd();
  3187 + $this->privSwapBackMagicQuotes();
  3188 +
  3189 + // ----- Error log
  3190 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  3191 +
  3192 + // ----- Return
  3193 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3194 + return PclZip::errorCode();
  3195 + }
  3196 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position after fseek : ".ftell($this->zip_fd)."'");
  3197 +
  3198 + // ----- Read the file header
  3199 + $v_header = array();
  3200 + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
  3201 + {
  3202 + // ----- Close the zip file
  3203 + $this->privCloseFd();
  3204 + $this->privSwapBackMagicQuotes();
  3205 +
  3206 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3207 + return $v_result;
  3208 + }
  3209 +
  3210 + // ----- Store the index
  3211 + $v_header['index'] = $i;
  3212 +
  3213 + // ----- Store the file position
  3214 + $v_pos_entry = ftell($this->zip_fd);
  3215 +
  3216 + // ----- Look for the specific extract rules
  3217 + $v_extract = false;
  3218 +
  3219 + // ----- Look for extract by name rule
  3220 + if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))
  3221 + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
  3222 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
  3223 +
  3224 + // ----- Look if the filename is in the list
  3225 + for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {
  3226 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
  3227 +
  3228 + // ----- Look for a directory
  3229 + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
  3230 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
  3231 +
  3232 + // ----- Look if the directory is in the filename path
  3233 + if ( (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
  3234 + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
  3235 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
  3236 + $v_extract = true;
  3237 + }
  3238 + }
  3239 + // ----- Look for a filename
  3240 + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
  3241 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
  3242 + $v_extract = true;
  3243 + }
  3244 + }
  3245 + }
  3246 +
  3247 + // ----- Look for extract by ereg rule
  3248 + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG]))
  3249 + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
  3250 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
  3251 +
  3252 + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {
  3253 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
  3254 + $v_extract = true;
  3255 + }
  3256 + }
  3257 +
  3258 + // ----- Look for extract by preg rule
  3259 + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG]))
  3260 + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
  3261 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
  3262 +
  3263 + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
  3264 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
  3265 + $v_extract = true;
  3266 + }
  3267 + }
  3268 +
  3269 + // ----- Look for extract by index rule
  3270 + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX]))
  3271 + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
  3272 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
  3273 +
  3274 + // ----- Look if the index is in the list
  3275 + for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {
  3276 + //--(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']."]");
  3277 +
  3278 + if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
  3279 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
  3280 + $v_extract = true;
  3281 + }
  3282 + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
  3283 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
  3284 + $j_start = $j+1;
  3285 + }
  3286 +
  3287 + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
  3288 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
  3289 + break;
  3290 + }
  3291 + }
  3292 + }
  3293 +
  3294 + // ----- Look for no rule, which means extract all the archive
  3295 + else {
  3296 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with no rule (extract all)");
  3297 + $v_extract = true;
  3298 + }
  3299 +
  3300 + // ----- Check compression method
  3301 + if ( ($v_extract)
  3302 + && ( ($v_header['compression'] != 8)
  3303 + && ($v_header['compression'] != 0))) {
  3304 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported compression method (".$v_header['compression'].")");
  3305 + $v_header['status'] = 'unsupported_compression';
  3306 +
  3307 + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
  3308 + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  3309 + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  3310 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
  3311 +
  3312 + $this->privSwapBackMagicQuotes();
  3313 +
  3314 + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
  3315 + "Filename '".$v_header['stored_filename']."' is "
  3316 + ."compressed by an unsupported compression "
  3317 + ."method (".$v_header['compression'].") ");
  3318 +
  3319 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3320 + return PclZip::errorCode();
  3321 + }
  3322 + }
  3323 +
  3324 + // ----- Check encrypted files
  3325 + if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
  3326 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported file encryption");
  3327 + $v_header['status'] = 'unsupported_encryption';
  3328 +
  3329 + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
  3330 + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  3331 + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  3332 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
  3333 +
  3334 + $this->privSwapBackMagicQuotes();
  3335 +
  3336 + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
  3337 + "Unsupported encryption for "
  3338 + ." filename '".$v_header['stored_filename']
  3339 + ."'");
  3340 +
  3341 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3342 + return PclZip::errorCode();
  3343 + }
  3344 + }
  3345 +
  3346 + // ----- Look for real extraction
  3347 + if (($v_extract) && ($v_header['status'] != 'ok')) {
  3348 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "No need for extract");
  3349 + $v_result = $this->privConvertHeader2FileInfo($v_header,
  3350 + $p_file_list[$v_nb_extracted++]);
  3351 + if ($v_result != 1) {
  3352 + $this->privCloseFd();
  3353 + $this->privSwapBackMagicQuotes();
  3354 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3355 + return $v_result;
  3356 + }
  3357 +
  3358 + $v_extract = false;
  3359 + }
  3360 +
  3361 + // ----- Look for real extraction
  3362 + if ($v_extract)
  3363 + {
  3364 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file '".$v_header['filename']."', index '$i'");
  3365 +
  3366 + // ----- Go to the file position
  3367 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
  3368 + @rewind($this->zip_fd);
  3369 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
  3370 + if (@fseek($this->zip_fd, $v_header['offset']))
  3371 + {
  3372 + // ----- Close the zip file
  3373 + $this->privCloseFd();
  3374 +
  3375 + $this->privSwapBackMagicQuotes();
  3376 +
  3377 + // ----- Error log
  3378 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  3379 +
  3380 + // ----- Return
  3381 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3382 + return PclZip::errorCode();
  3383 + }
  3384 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
  3385 +
  3386 + // ----- Look for extraction as string
  3387 + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {
  3388 +
  3389 + // ----- Extracting the file
  3390 + $v_result1 = $this->privExtractFileAsString($v_header, $v_string);
  3391 + if ($v_result1 < 1) {
  3392 + $this->privCloseFd();
  3393 + $this->privSwapBackMagicQuotes();
  3394 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
  3395 + return $v_result1;
  3396 + }
  3397 +
  3398 + // ----- Get the only interesting attributes
  3399 + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
  3400 + {
  3401 + // ----- Close the zip file
  3402 + $this->privCloseFd();
  3403 + $this->privSwapBackMagicQuotes();
  3404 +
  3405 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3406 + return $v_result;
  3407 + }
  3408 +
  3409 + // ----- Set the file content
  3410 + $p_file_list[$v_nb_extracted]['content'] = $v_string;
  3411 +
  3412 + // ----- Next extracted file
  3413 + $v_nb_extracted++;
  3414 +
  3415 + // ----- Look for user callback abort
  3416 + if ($v_result1 == 2) {
  3417 + break;
  3418 + }
  3419 + }
  3420 + // ----- Look for extraction in standard output
  3421 + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
  3422 + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
  3423 + // ----- Extracting the file in standard output
  3424 + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
  3425 + if ($v_result1 < 1) {
  3426 + $this->privCloseFd();
  3427 + $this->privSwapBackMagicQuotes();
  3428 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
  3429 + return $v_result1;
  3430 + }
  3431 +
  3432 + // ----- Get the only interesting attributes
  3433 + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
  3434 + $this->privCloseFd();
  3435 + $this->privSwapBackMagicQuotes();
  3436 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3437 + return $v_result;
  3438 + }
  3439 +
  3440 + // ----- Look for user callback abort
  3441 + if ($v_result1 == 2) {
  3442 + break;
  3443 + }
  3444 + }
  3445 + // ----- Look for normal extraction
  3446 + else {
  3447 + // ----- Extracting the file
  3448 + $v_result1 = $this->privExtractFile($v_header,
  3449 + $p_path, $p_remove_path,
  3450 + $p_remove_all_path,
  3451 + $p_options);
  3452 + if ($v_result1 < 1) {
  3453 + $this->privCloseFd();
  3454 + $this->privSwapBackMagicQuotes();
  3455 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
  3456 + return $v_result1;
  3457 + }
  3458 +
  3459 + // ----- Get the only interesting attributes
  3460 + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
  3461 + {
  3462 + // ----- Close the zip file
  3463 + $this->privCloseFd();
  3464 + $this->privSwapBackMagicQuotes();
  3465 +
  3466 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3467 + return $v_result;
  3468 + }
  3469 +
  3470 + // ----- Look for user callback abort
  3471 + if ($v_result1 == 2) {
  3472 + break;
  3473 + }
  3474 + }
  3475 + }
  3476 + }
  3477 +
  3478 + // ----- Close the zip file
  3479 + $this->privCloseFd();
  3480 + $this->privSwapBackMagicQuotes();
  3481 +
  3482 + // ----- Return
  3483 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3484 + return $v_result;
  3485 + }
  3486 + // --------------------------------------------------------------------------------
  3487 +
  3488 + // --------------------------------------------------------------------------------
  3489 + // Function : privExtractFile()
  3490 + // Description :
  3491 + // Parameters :
  3492 + // Return Values :
  3493 + //
  3494 + // 1 : ... ?
  3495 + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback
  3496 + // --------------------------------------------------------------------------------
  3497 + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
  3498 + {
  3499 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFile', "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
  3500 + $v_result=1;
  3501 +
  3502 + // ----- Read the file header
  3503 + if (($v_result = $this->privReadFileHeader($v_header)) != 1)
  3504 + {
  3505 + // ----- Return
  3506 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3507 + return $v_result;
  3508 + }
  3509 +
  3510 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
  3511 +
  3512 + // ----- Check that the file header is coherent with $p_entry info
  3513 + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
  3514 + // TBC
  3515 + }
  3516 +
  3517 + // ----- Look for all path to remove
  3518 + if ($p_remove_all_path == true) {
  3519 + // ----- Look for folder entry that not need to be extracted
  3520 + if (($p_entry['external']&0x00000010)==0x00000010) {
  3521 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The entry is a folder : need to be filtered");
  3522 +
  3523 + $p_entry['status'] = "filtered";
  3524 +
  3525 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3526 + return $v_result;
  3527 + }
  3528 +
  3529 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "All path is removed");
  3530 + // ----- Get the basename of the path
  3531 + $p_entry['filename'] = basename($p_entry['filename']);
  3532 + }
  3533 +
  3534 + // ----- Look for path to remove
  3535 + else if ($p_remove_path != "")
  3536 + {
  3537 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look for some path to remove");
  3538 + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)
  3539 + {
  3540 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The folder is the same as the removed path '".$p_entry['filename']."'");
  3541 +
  3542 + // ----- Change the file status
  3543 + $p_entry['status'] = "filtered";
  3544 +
  3545 + // ----- Return
  3546 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3547 + return $v_result;
  3548 + }
  3549 +
  3550 + $p_remove_path_size = strlen($p_remove_path);
  3551 + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
  3552 + {
  3553 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '".$p_entry['filename']."'");
  3554 +
  3555 + // ----- Remove the path
  3556 + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
  3557 +
  3558 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Resulting file is '".$p_entry['filename']."'");
  3559 + }
  3560 + }
  3561 +
  3562 + // ----- Add the path
  3563 + if ($p_path != '') {
  3564 + $p_entry['filename'] = $p_path."/".$p_entry['filename'];
  3565 + }
  3566 +
  3567 + // ----- Check a base_dir_restriction
  3568 + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
  3569 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Check the extract directory restriction");
  3570 + $v_inclusion
  3571 + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
  3572 + $p_entry['filename']);
  3573 + if ($v_inclusion == 0) {
  3574 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_EXTRACT_DIR_RESTRICTION is selected, file is outside restriction");
  3575 +
  3576 + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
  3577 + "Filename '".$p_entry['filename']."' is "
  3578 + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");
  3579 +
  3580 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3581 + return PclZip::errorCode();
  3582 + }
  3583 + }
  3584 +
  3585 + // ----- Look for pre-extract callback
  3586 + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
  3587 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
  3588 +
  3589 + // ----- Generate a local information
  3590 + $v_local_header = array();
  3591 + $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  3592 +
  3593 + // ----- Call the callback
  3594 + // Here I do not use call_user_func() because I need to send a reference to the
  3595 + // header.
  3596 + eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
  3597 + if ($v_result == 0) {
  3598 + // ----- Change the file status
  3599 + $p_entry['status'] = "skipped";
  3600 + $v_result = 1;
  3601 + }
  3602 +
  3603 + // ----- Look for abort result
  3604 + if ($v_result == 2) {
  3605 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
  3606 + // ----- This status is internal and will be changed in 'skipped'
  3607 + $p_entry['status'] = "aborted";
  3608 + $v_result = PCLZIP_ERR_USER_ABORTED;
  3609 + }
  3610 +
  3611 + // ----- Update the informations
  3612 + // Only some fields can be modified
  3613 + $p_entry['filename'] = $v_local_header['filename'];
  3614 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
  3615 + }
  3616 +
  3617 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
  3618 +
  3619 + // ----- Look if extraction should be done
  3620 + if ($p_entry['status'] == 'ok') {
  3621 +
  3622 + // ----- Look for specific actions while the file exist
  3623 + if (file_exists($p_entry['filename']))
  3624 + {
  3625 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_entry['filename']."' already exists");
  3626 +
  3627 + // ----- Look if file is a directory
  3628 + if (is_dir($p_entry['filename']))
  3629 + {
  3630 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is a directory");
  3631 +
  3632 + // ----- Change the file status
  3633 + $p_entry['status'] = "already_a_directory";
  3634 +
  3635 + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
  3636 + // For historical reason first PclZip implementation does not stop
  3637 + // when this kind of error occurs.
  3638 + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  3639 + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  3640 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
  3641 +
  3642 + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,
  3643 + "Filename '".$p_entry['filename']."' is "
  3644 + ."already used by an existing directory");
  3645 +
  3646 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3647 + return PclZip::errorCode();
  3648 + }
  3649 + }
  3650 + // ----- Look if file is write protected
  3651 + else if (!is_writeable($p_entry['filename']))
  3652 + {
  3653 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is write protected");
  3654 +
  3655 + // ----- Change the file status
  3656 + $p_entry['status'] = "write_protected";
  3657 +
  3658 + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
  3659 + // For historical reason first PclZip implementation does not stop
  3660 + // when this kind of error occurs.
  3661 + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  3662 + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  3663 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
  3664 +
  3665 + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
  3666 + "Filename '".$p_entry['filename']."' exists "
  3667 + ."and is write protected");
  3668 +
  3669 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3670 + return PclZip::errorCode();
  3671 + }
  3672 + }
  3673 +
  3674 + // ----- Look if the extracted file is older
  3675 + else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
  3676 + {
  3677 + //--(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']).")");
  3678 + // ----- Change the file status
  3679 + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))
  3680 + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {
  3681 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_REPLACE_NEWER is selected, file will be replaced");
  3682 + }
  3683 + else {
  3684 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be replaced");
  3685 + $p_entry['status'] = "newer_exist";
  3686 +
  3687 + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
  3688 + // For historical reason first PclZip implementation does not stop
  3689 + // when this kind of error occurs.
  3690 + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  3691 + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  3692 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
  3693 +
  3694 + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
  3695 + "Newer version of '".$p_entry['filename']."' exists "
  3696 + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");
  3697 +
  3698 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  3699 + return PclZip::errorCode();
  3700 + }
  3701 + }
  3702 + }
  3703 + else {
  3704 + //--(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']).")");
  3705 + }
  3706 + }
  3707 +
  3708 + // ----- Check the directory availability and create it if necessary
  3709 + else {
  3710 + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
  3711 + $v_dir_to_check = $p_entry['filename'];
  3712 + else if (!strstr($p_entry['filename'], "/"))
  3713 + $v_dir_to_check = "";
  3714 + else
  3715 + $v_dir_to_check = dirname($p_entry['filename']);
  3716 +
  3717 + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
  3718 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '".$p_entry['filename']."'");
  3719 +
  3720 + // ----- Change the file status
  3721 + $p_entry['status'] = "path_creation_fail";
  3722 +
  3723 + // ----- Return
  3724 + ////--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3725 + //return $v_result;
  3726 + $v_result = 1;
  3727 + }
  3728 + }
  3729 + }
  3730 +
  3731 + // ----- Look if extraction should be done
  3732 + if ($p_entry['status'] == 'ok') {
  3733 +
  3734 + // ----- Do the extraction (if not a folder)
  3735 + if (!(($p_entry['external']&0x00000010)==0x00000010))
  3736 + {
  3737 + // ----- Look for not compressed file
  3738 + if ($p_entry['compression'] == 0) {
  3739 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
  3740 +
  3741 + // ----- Opening destination file
  3742 + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
  3743 + {
  3744 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
  3745 +
  3746 + // ----- Change the file status
  3747 + $p_entry['status'] = "write_error";
  3748 +
  3749 + // ----- Return
  3750 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3751 + return $v_result;
  3752 + }
  3753 +
  3754 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read '".$p_entry['size']."' bytes");
  3755 +
  3756 + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
  3757 + $v_size = $p_entry['compressed_size'];
  3758 + while ($v_size != 0)
  3759 + {
  3760 + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  3761 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes");
  3762 + $v_buffer = @fread($this->zip_fd, $v_read_size);
  3763 + /* Try to speed up the code
  3764 + $v_binary_data = pack('a'.$v_read_size, $v_buffer);
  3765 + @fwrite($v_dest_file, $v_binary_data, $v_read_size);
  3766 + */
  3767 + @fwrite($v_dest_file, $v_buffer, $v_read_size);
  3768 + $v_size -= $v_read_size;
  3769 + }
  3770 +
  3771 + // ----- Closing the destination file
  3772 + fclose($v_dest_file);
  3773 +
  3774 + // ----- Change the file mtime
  3775 + touch($p_entry['filename'], $p_entry['mtime']);
  3776 +
  3777 +
  3778 + }
  3779 + else {
  3780 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (Compression method ".$p_entry['compression'].")");
  3781 + // ----- TBC
  3782 + // Need to be finished
  3783 + if (($p_entry['flag'] & 1) == 1) {
  3784 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File is encrypted");
  3785 + /*
  3786 + // ----- Read the encryption header
  3787 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read 12 encryption header bytes");
  3788 + $v_encryption_header = @fread($this->zip_fd, 12);
  3789 +
  3790 + // ----- Read the encrypted & compressed file in a buffer
  3791 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".($p_entry['compressed_size']-12)."' compressed & encrypted bytes");
  3792 + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']-12);
  3793 +
  3794 + // ----- Decrypt the buffer
  3795 + $this->privDecrypt($v_encryption_header, $v_buffer,
  3796 + $p_entry['compressed_size']-12, $p_entry['crc']);
  3797 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Buffer is '".$v_buffer."'");
  3798 + */
  3799 + }
  3800 + else {
  3801 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".$p_entry['compressed_size']."' compressed bytes");
  3802 + // ----- Read the compressed file in a buffer (one shot)
  3803 + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
  3804 + }
  3805 +
  3806 + // ----- Decompress the file
  3807 + $v_file_content = @gzinflate($v_buffer);
  3808 + unset($v_buffer);
  3809 + if ($v_file_content === FALSE) {
  3810 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to inflate compressed file");
  3811 +
  3812 + // ----- Change the file status
  3813 + // TBC
  3814 + $p_entry['status'] = "error";
  3815 +
  3816 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3817 + return $v_result;
  3818 + }
  3819 +
  3820 + // ----- Opening destination file
  3821 + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
  3822 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
  3823 +
  3824 + // ----- Change the file status
  3825 + $p_entry['status'] = "write_error";
  3826 +
  3827 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3828 + return $v_result;
  3829 + }
  3830 +
  3831 + // ----- Write the uncompressed data
  3832 + @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
  3833 + unset($v_file_content);
  3834 +
  3835 + // ----- Closing the destination file
  3836 + @fclose($v_dest_file);
  3837 +
  3838 + // ----- Change the file mtime
  3839 + @touch($p_entry['filename'], $p_entry['mtime']);
  3840 + }
  3841 +
  3842 + // ----- Look for chmod option
  3843 + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {
  3844 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "chmod option activated '".$p_options[PCLZIP_OPT_SET_CHMOD]."'");
  3845 +
  3846 + // ----- Change the mode of the file
  3847 + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);
  3848 + }
  3849 +
  3850 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
  3851 + }
  3852 + }
  3853 +
  3854 + // ----- Change abort status
  3855 + if ($p_entry['status'] == "aborted") {
  3856 + $p_entry['status'] = "skipped";
  3857 + }
  3858 +
  3859 + // ----- Look for post-extract callback
  3860 + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
  3861 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
  3862 +
  3863 + // ----- Generate a local information
  3864 + $v_local_header = array();
  3865 + $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  3866 +
  3867 + // ----- Call the callback
  3868 + // Here I do not use call_user_func() because I need to send a reference to the
  3869 + // header.
  3870 + eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
  3871 +
  3872 + // ----- Look for abort result
  3873 + if ($v_result == 2) {
  3874 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
  3875 + $v_result = PCLZIP_ERR_USER_ABORTED;
  3876 + }
  3877 + }
  3878 +
  3879 + // ----- Return
  3880 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3881 + return $v_result;
  3882 + }
  3883 + // --------------------------------------------------------------------------------
  3884 +
  3885 + // --------------------------------------------------------------------------------
  3886 + // Function : privExtractFileInOutput()
  3887 + // Description :
  3888 + // Parameters :
  3889 + // Return Values :
  3890 + // --------------------------------------------------------------------------------
  3891 + function privExtractFileInOutput(&$p_entry, &$p_options)
  3892 + {
  3893 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileInOutput', "");
  3894 + $v_result=1;
  3895 +
  3896 + // ----- Read the file header
  3897 + if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
  3898 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  3899 + return $v_result;
  3900 + }
  3901 +
  3902 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
  3903 +
  3904 + // ----- Check that the file header is coherent with $p_entry info
  3905 + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
  3906 + // TBC
  3907 + }
  3908 +
  3909 + // ----- Look for pre-extract callback
  3910 + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
  3911 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
  3912 +
  3913 + // ----- Generate a local information
  3914 + $v_local_header = array();
  3915 + $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  3916 +
  3917 + // ----- Call the callback
  3918 + // Here I do not use call_user_func() because I need to send a reference to the
  3919 + // header.
  3920 + eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
  3921 + if ($v_result == 0) {
  3922 + // ----- Change the file status
  3923 + $p_entry['status'] = "skipped";
  3924 + $v_result = 1;
  3925 + }
  3926 +
  3927 + // ----- Look for abort result
  3928 + if ($v_result == 2) {
  3929 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
  3930 + // ----- This status is internal and will be changed in 'skipped'
  3931 + $p_entry['status'] = "aborted";
  3932 + $v_result = PCLZIP_ERR_USER_ABORTED;
  3933 + }
  3934 +
  3935 + // ----- Update the informations
  3936 + // Only some fields can be modified
  3937 + $p_entry['filename'] = $v_local_header['filename'];
  3938 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
  3939 + }
  3940 +
  3941 + // ----- Trace
  3942 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
  3943 +
  3944 + // ----- Look if extraction should be done
  3945 + if ($p_entry['status'] == 'ok') {
  3946 +
  3947 + // ----- Do the extraction (if not a folder)
  3948 + if (!(($p_entry['external']&0x00000010)==0x00000010)) {
  3949 + // ----- Look for not compressed file
  3950 + if ($p_entry['compressed_size'] == $p_entry['size']) {
  3951 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
  3952 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
  3953 +
  3954 + // ----- Read the file in a buffer (one shot)
  3955 + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
  3956 +
  3957 + // ----- Send the file to the output
  3958 + echo $v_buffer;
  3959 + unset($v_buffer);
  3960 + }
  3961 + else {
  3962 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file");
  3963 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Reading '".$p_entry['size']."' bytes");
  3964 +
  3965 + // ----- Read the compressed file in a buffer (one shot)
  3966 + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
  3967 +
  3968 + // ----- Decompress the file
  3969 + $v_file_content = gzinflate($v_buffer);
  3970 + unset($v_buffer);
  3971 +
  3972 + // ----- Send the file to the output
  3973 + echo $v_file_content;
  3974 + unset($v_file_content);
  3975 + }
  3976 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
  3977 + }
  3978 + }
  3979 +
  3980 + // ----- Change abort status
  3981 + if ($p_entry['status'] == "aborted") {
  3982 + $p_entry['status'] = "skipped";
  3983 + }
  3984 +
  3985 + // ----- Look for post-extract callback
  3986 + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
  3987 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
  3988 +
  3989 + // ----- Generate a local information
  3990 + $v_local_header = array();
  3991 + $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  3992 +
  3993 + // ----- Call the callback
  3994 + // Here I do not use call_user_func() because I need to send a reference to the
  3995 + // header.
  3996 + eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
  3997 +
  3998 + // ----- Look for abort result
  3999 + if ($v_result == 2) {
  4000 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
  4001 + $v_result = PCLZIP_ERR_USER_ABORTED;
  4002 + }
  4003 + }
  4004 +
  4005 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4006 + return $v_result;
  4007 + }
  4008 + // --------------------------------------------------------------------------------
  4009 +
  4010 + // --------------------------------------------------------------------------------
  4011 + // Function : privExtractFileAsString()
  4012 + // Description :
  4013 + // Parameters :
  4014 + // Return Values :
  4015 + // --------------------------------------------------------------------------------
  4016 + function privExtractFileAsString(&$p_entry, &$p_string)
  4017 + {
  4018 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileAsString', "p_entry['filename']='".$p_entry['filename']."'");
  4019 + $v_result=1;
  4020 +
  4021 + // ----- Read the file header
  4022 + $v_header = array();
  4023 + if (($v_result = $this->privReadFileHeader($v_header)) != 1)
  4024 + {
  4025 + // ----- Return
  4026 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4027 + return $v_result;
  4028 + }
  4029 +
  4030 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
  4031 +
  4032 + // ----- Check that the file header is coherent with $p_entry info
  4033 + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
  4034 + // TBC
  4035 + }
  4036 +
  4037 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file in string (with path) '".$p_entry['filename']."', size '$v_header[size]'");
  4038 +
  4039 + // ----- Do the extraction (if not a folder)
  4040 + if (!(($p_entry['external']&0x00000010)==0x00000010))
  4041 + {
  4042 + // ----- Look for not compressed file
  4043 +// if ($p_entry['compressed_size'] == $p_entry['size'])
  4044 + if ($p_entry['compression'] == 0) {
  4045 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
  4046 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
  4047 +
  4048 + // ----- Reading the file
  4049 + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
  4050 + }
  4051 + else {
  4052 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (compression method '".$p_entry['compression']."')");
  4053 +
  4054 + // ----- Reading the file
  4055 + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
  4056 +
  4057 + // ----- Decompress the file
  4058 + if (($p_string = @gzinflate($v_data)) === FALSE) {
  4059 + // TBC
  4060 + }
  4061 + }
  4062 +
  4063 + // ----- Trace
  4064 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
  4065 + }
  4066 + else {
  4067 + // TBC : error : can not extract a folder in a string
  4068 + }
  4069 +
  4070 + // ----- Return
  4071 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4072 + return $v_result;
  4073 + }
  4074 + // --------------------------------------------------------------------------------
  4075 +
  4076 + // --------------------------------------------------------------------------------
  4077 + // Function : privReadFileHeader()
  4078 + // Description :
  4079 + // Parameters :
  4080 + // Return Values :
  4081 + // --------------------------------------------------------------------------------
  4082 + function privReadFileHeader(&$p_header)
  4083 + {
  4084 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadFileHeader", "");
  4085 + $v_result=1;
  4086 +
  4087 + // ----- Read the 4 bytes signature
  4088 + $v_binary_data = @fread($this->zip_fd, 4);
  4089 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
  4090 + $v_data = unpack('Vid', $v_binary_data);
  4091 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
  4092 +
  4093 + // ----- Check signature
  4094 + if ($v_data['id'] != 0x04034b50)
  4095 + {
  4096 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid File header");
  4097 +
  4098 + // ----- Error log
  4099 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
  4100 +
  4101 + // ----- Return
  4102 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4103 + return PclZip::errorCode();
  4104 + }
  4105 +
  4106 + // ----- Read the first 42 bytes of the header
  4107 + $v_binary_data = fread($this->zip_fd, 26);
  4108 +
  4109 + // ----- Look for invalid block size
  4110 + if (strlen($v_binary_data) != 26)
  4111 + {
  4112 + $p_header['filename'] = "";
  4113 + $p_header['status'] = "invalid_header";
  4114 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
  4115 +
  4116 + // ----- Error log
  4117 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
  4118 +
  4119 + // ----- Return
  4120 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4121 + return PclZip::errorCode();
  4122 + }
  4123 +
  4124 + // ----- Extract the values
  4125 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header : '".$v_binary_data."'");
  4126 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header (Hex) : '".bin2hex($v_binary_data)."'");
  4127 + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
  4128 +
  4129 + // ----- Get filename
  4130 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "File name length : ".$v_data['filename_len']);
  4131 + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);
  4132 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename : \''.$p_header['filename'].'\'');
  4133 +
  4134 + // ----- Get extra_fields
  4135 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extra field length : ".$v_data['extra_len']);
  4136 + if ($v_data['extra_len'] != 0) {
  4137 + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
  4138 + }
  4139 + else {
  4140 + $p_header['extra'] = '';
  4141 + }
  4142 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Extra field : \''.bin2hex($p_header['extra']).'\'');
  4143 +
  4144 + // ----- Extract properties
  4145 + $p_header['version_extracted'] = $v_data['version'];
  4146 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : ('.$p_header['version_extracted'].') \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
  4147 + $p_header['compression'] = $v_data['compression'];
  4148 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compression method : \''.$p_header['compression'].'\'');
  4149 + $p_header['size'] = $v_data['size'];
  4150 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_header['size'].'\'');
  4151 + $p_header['compressed_size'] = $v_data['compressed_size'];
  4152 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
  4153 + $p_header['crc'] = $v_data['crc'];
  4154 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
  4155 + $p_header['flag'] = $v_data['flag'];
  4156 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag : \''.$p_header['flag'].'\'');
  4157 + $p_header['filename_len'] = $v_data['filename_len'];
  4158 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename_len : \''.$p_header['filename_len'].'\'');
  4159 +
  4160 + // ----- Recuperate date in UNIX format
  4161 + $p_header['mdate'] = $v_data['mdate'];
  4162 + $p_header['mtime'] = $v_data['mtime'];
  4163 + if ($p_header['mdate'] && $p_header['mtime'])
  4164 + {
  4165 + // ----- Extract time
  4166 + $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
  4167 + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
  4168 + $v_seconde = ($p_header['mtime'] & 0x001F)*2;
  4169 +
  4170 + // ----- Extract date
  4171 + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
  4172 + $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
  4173 + $v_day = $p_header['mdate'] & 0x001F;
  4174 +
  4175 + // ----- Get UNIX date format
  4176 + $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
  4177 +
  4178 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
  4179 + }
  4180 + else
  4181 + {
  4182 + $p_header['mtime'] = time();
  4183 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
  4184 + }
  4185 +
  4186 + // TBC
  4187 + //for(reset($v_data); $key = key($v_data); next($v_data)) {
  4188 + // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Attribut[$key] = ".$v_data[$key]);
  4189 + //}
  4190 +
  4191 + // ----- Set the stored filename
  4192 + $p_header['stored_filename'] = $p_header['filename'];
  4193 +
  4194 + // ----- Set the status field
  4195 + $p_header['status'] = "ok";
  4196 +
  4197 + // ----- Return
  4198 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4199 + return $v_result;
  4200 + }
  4201 + // --------------------------------------------------------------------------------
  4202 +
  4203 + // --------------------------------------------------------------------------------
  4204 + // Function : privReadCentralFileHeader()
  4205 + // Description :
  4206 + // Parameters :
  4207 + // Return Values :
  4208 + // --------------------------------------------------------------------------------
  4209 + function privReadCentralFileHeader(&$p_header)
  4210 + {
  4211 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadCentralFileHeader", "");
  4212 + $v_result=1;
  4213 +
  4214 + // ----- Read the 4 bytes signature
  4215 + $v_binary_data = @fread($this->zip_fd, 4);
  4216 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
  4217 + $v_data = unpack('Vid', $v_binary_data);
  4218 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
  4219 +
  4220 + // ----- Check signature
  4221 + if ($v_data['id'] != 0x02014b50)
  4222 + {
  4223 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid Central Dir File signature");
  4224 +
  4225 + // ----- Error log
  4226 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
  4227 +
  4228 + // ----- Return
  4229 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4230 + return PclZip::errorCode();
  4231 + }
  4232 +
  4233 + // ----- Read the first 42 bytes of the header
  4234 + $v_binary_data = fread($this->zip_fd, 42);
  4235 +
  4236 + // ----- Look for invalid block size
  4237 + if (strlen($v_binary_data) != 42)
  4238 + {
  4239 + $p_header['filename'] = "";
  4240 + $p_header['status'] = "invalid_header";
  4241 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
  4242 +
  4243 + // ----- Error log
  4244 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
  4245 +
  4246 + // ----- Return
  4247 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4248 + return PclZip::errorCode();
  4249 + }
  4250 +
  4251 + // ----- Extract the values
  4252 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header : '".$v_binary_data."'");
  4253 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header (Hex) : '".bin2hex($v_binary_data)."'");
  4254 + $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);
  4255 +
  4256 + // ----- Get filename
  4257 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']);
  4258 + if ($p_header['filename_len'] != 0)
  4259 + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
  4260 + else
  4261 + $p_header['filename'] = '';
  4262 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Filename : \''.$p_header['filename'].'\'');
  4263 +
  4264 + // ----- Get extra
  4265 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Extra length : ".$p_header['extra_len']);
  4266 + if ($p_header['extra_len'] != 0)
  4267 + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
  4268 + else
  4269 + $p_header['extra'] = '';
  4270 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Extra : \''.$p_header['extra'].'\'');
  4271 +
  4272 + // ----- Get comment
  4273 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Comment length : ".$p_header['comment_len']);
  4274 + if ($p_header['comment_len'] != 0)
  4275 + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
  4276 + else
  4277 + $p_header['comment'] = '';
  4278 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Comment : \''.$p_header['comment'].'\'');
  4279 +
  4280 + // ----- Extract properties
  4281 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version : \''.($p_header['version']/10).'.'.($p_header['version']%10).'\'');
  4282 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
  4283 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Size : \''.$p_header['size'].'\'');
  4284 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
  4285 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
  4286 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Flag : \''.$p_header['flag'].'\'');
  4287 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Offset : \''.$p_header['offset'].'\'');
  4288 +
  4289 + // ----- Recuperate date in UNIX format
  4290 + if ($p_header['mdate'] && $p_header['mtime'])
  4291 + {
  4292 + // ----- Extract time
  4293 + $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
  4294 + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
  4295 + $v_seconde = ($p_header['mtime'] & 0x001F)*2;
  4296 +
  4297 + // ----- Extract date
  4298 + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
  4299 + $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
  4300 + $v_day = $p_header['mdate'] & 0x001F;
  4301 +
  4302 + // ----- Get UNIX date format
  4303 + $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
  4304 +
  4305 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
  4306 + }
  4307 + else
  4308 + {
  4309 + $p_header['mtime'] = time();
  4310 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
  4311 + }
  4312 +
  4313 + // ----- Set the stored filename
  4314 + $p_header['stored_filename'] = $p_header['filename'];
  4315 +
  4316 + // ----- Set default status to ok
  4317 + $p_header['status'] = 'ok';
  4318 +
  4319 + // ----- Look if it is a directory
  4320 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Internal (Hex) : '".sprintf("Ox%04X", $p_header['internal'])."'");
  4321 + //--(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').')');
  4322 + if (substr($p_header['filename'], -1) == '/') {
  4323 + //$p_header['external'] = 0x41FF0010;
  4324 + $p_header['external'] = 0x00000010;
  4325 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Force folder external : \''.sprintf("Ox%04X", $p_header['external']).'\'');
  4326 + }
  4327 +
  4328 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Header of filename : \''.$p_header['filename'].'\'');
  4329 +
  4330 + // ----- Return
  4331 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4332 + return $v_result;
  4333 + }
  4334 + // --------------------------------------------------------------------------------
  4335 +
  4336 + // --------------------------------------------------------------------------------
  4337 + // Function : privCheckFileHeaders()
  4338 + // Description :
  4339 + // Parameters :
  4340 + // Return Values :
  4341 + // 1 on success,
  4342 + // 0 on error;
  4343 + // --------------------------------------------------------------------------------
  4344 + function privCheckFileHeaders(&$p_local_header, &$p_central_header)
  4345 + {
  4346 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFileHeaders", "");
  4347 + $v_result=1;
  4348 +
  4349 + // ----- Check the static values
  4350 + // TBC
  4351 + if ($p_local_header['filename'] != $p_central_header['filename']) {
  4352 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename" : TBC To Be Completed');
  4353 + }
  4354 + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {
  4355 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "version_extracted" : TBC To Be Completed');
  4356 + }
  4357 + if ($p_local_header['flag'] != $p_central_header['flag']) {
  4358 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "flag" : TBC To Be Completed');
  4359 + }
  4360 + if ($p_local_header['compression'] != $p_central_header['compression']) {
  4361 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "compression" : TBC To Be Completed');
  4362 + }
  4363 + if ($p_local_header['mtime'] != $p_central_header['mtime']) {
  4364 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "mtime" : TBC To Be Completed');
  4365 + }
  4366 + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {
  4367 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename_len" : TBC To Be Completed');
  4368 + }
  4369 +
  4370 + // ----- Look for flag bit 3
  4371 + if (($p_local_header['flag'] & 8) == 8) {
  4372 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Purpose bit flag bit 3 set !');
  4373 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'File size, compression size and crc found in central header');
  4374 + $p_local_header['size'] = $p_central_header['size'];
  4375 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_local_header['size'].'\'');
  4376 + $p_local_header['compressed_size'] = $p_central_header['compressed_size'];
  4377 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_local_header['compressed_size'].'\'');
  4378 + $p_local_header['crc'] = $p_central_header['crc'];
  4379 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_local_header['crc']).'\'');
  4380 + }
  4381 +
  4382 + // ----- Return
  4383 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4384 + return $v_result;
  4385 + }
  4386 + // --------------------------------------------------------------------------------
  4387 +
  4388 + // --------------------------------------------------------------------------------
  4389 + // Function : privReadEndCentralDir()
  4390 + // Description :
  4391 + // Parameters :
  4392 + // Return Values :
  4393 + // --------------------------------------------------------------------------------
  4394 + function privReadEndCentralDir(&$p_central_dir)
  4395 + {
  4396 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadEndCentralDir", "");
  4397 + $v_result=1;
  4398 +
  4399 + // ----- Go to the end of the zip file
  4400 + $v_size = filesize($this->zipname);
  4401 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size of the file :$v_size");
  4402 + @fseek($this->zip_fd, $v_size);
  4403 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position at end of zip file : \''.ftell($this->zip_fd).'\'');
  4404 + if (@ftell($this->zip_fd) != $v_size)
  4405 + {
  4406 + // ----- Error log
  4407 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');
  4408 +
  4409 + // ----- Return
  4410 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4411 + return PclZip::errorCode();
  4412 + }
  4413 +
  4414 + // ----- First try : look if this is an archive with no commentaries (most of the time)
  4415 + // in this case the end of central dir is at 22 bytes of the file end
  4416 + $v_found = 0;
  4417 + if ($v_size > 26) {
  4418 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Look for central dir with no comment');
  4419 + @fseek($this->zip_fd, $v_size-22);
  4420 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after min central position : \''.ftell($this->zip_fd).'\'');
  4421 + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))
  4422 + {
  4423 + // ----- Error log
  4424 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
  4425 +
  4426 + // ----- Return
  4427 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4428 + return PclZip::errorCode();
  4429 + }
  4430 +
  4431 + // ----- Read for bytes
  4432 + $v_binary_data = @fread($this->zip_fd, 4);
  4433 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
  4434 + $v_data = @unpack('Vid', $v_binary_data);
  4435 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
  4436 +
  4437 + // ----- Check signature
  4438 + if ($v_data['id'] == 0x06054b50) {
  4439 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found central dir at the default position.");
  4440 + $v_found = 1;
  4441 + }
  4442 +
  4443 + $v_pos = ftell($this->zip_fd);
  4444 + }
  4445 +
  4446 + // ----- Go back to the maximum possible size of the Central Dir End Record
  4447 + if (!$v_found) {
  4448 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Start extended search of end central dir');
  4449 + $v_maximum_size = 65557; // 0xFFFF + 22;
  4450 + if ($v_maximum_size > $v_size)
  4451 + $v_maximum_size = $v_size;
  4452 + @fseek($this->zip_fd, $v_size-$v_maximum_size);
  4453 + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))
  4454 + {
  4455 + // ----- Error log
  4456 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
  4457 +
  4458 + // ----- Return
  4459 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4460 + return PclZip::errorCode();
  4461 + }
  4462 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after max central position : \''.ftell($this->zip_fd).'\'');
  4463 +
  4464 + // ----- Read byte per byte in order to find the signature
  4465 + $v_pos = ftell($this->zip_fd);
  4466 + $v_bytes = 0x00000000;
  4467 + while ($v_pos < $v_size)
  4468 + {
  4469 + // ----- Read a byte
  4470 + $v_byte = @fread($this->zip_fd, 1);
  4471 +
  4472 + // ----- Add the byte
  4473 + $v_bytes = ($v_bytes << 8) | Ord($v_byte);
  4474 +
  4475 + // ----- Compare the bytes
  4476 + if ($v_bytes == 0x504b0506)
  4477 + {
  4478 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Found End Central Dir signature at position : \''.ftell($this->zip_fd).'\'');
  4479 + $v_pos++;
  4480 + break;
  4481 + }
  4482 +
  4483 + $v_pos++;
  4484 + }
  4485 +
  4486 + // ----- Look if not found end of central dir
  4487 + if ($v_pos == $v_size)
  4488 + {
  4489 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to find End of Central Dir Record signature");
  4490 +
  4491 + // ----- Error log
  4492 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");
  4493 +
  4494 + // ----- Return
  4495 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4496 + return PclZip::errorCode();
  4497 + }
  4498 + }
  4499 +
  4500 + // ----- Read the first 18 bytes of the header
  4501 + $v_binary_data = fread($this->zip_fd, 18);
  4502 +
  4503 + // ----- Look for invalid block size
  4504 + if (strlen($v_binary_data) != 18)
  4505 + {
  4506 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
  4507 +
  4508 + // ----- Error log
  4509 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
  4510 +
  4511 + // ----- Return
  4512 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4513 + return PclZip::errorCode();
  4514 + }
  4515 +
  4516 + // ----- Extract the values
  4517 + ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record : '".$v_binary_data."'");
  4518 + ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record (Hex) : '".bin2hex($v_binary_data)."'");
  4519 + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
  4520 +
  4521 + // ----- Check the global size
  4522 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Comment length : ".$v_data['comment_size']);
  4523 + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
  4524 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The central dir is not at the end of the archive. Some trailing bytes exists after the archive.");
  4525 +
  4526 + // ----- Removed in release 2.2 see readme file
  4527 + // The check of the file size is a little too strict.
  4528 + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.
  4529 + // While decrypted, zip has training 0 bytes
  4530 + if (0) {
  4531 + // ----- Error log
  4532 + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,
  4533 + 'The central dir is not at the end of the archive.'
  4534 + .' Some trailing bytes exists after the archive.');
  4535 +
  4536 + // ----- Return
  4537 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4538 + return PclZip::errorCode();
  4539 + }
  4540 + }
  4541 +
  4542 + // ----- Get comment
  4543 + if ($v_data['comment_size'] != 0)
  4544 + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
  4545 + else
  4546 + $p_central_dir['comment'] = '';
  4547 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment : \''.$p_central_dir['comment'].'\'');
  4548 +
  4549 + $p_central_dir['entries'] = $v_data['entries'];
  4550 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries : \''.$p_central_dir['entries'].'\'');
  4551 + $p_central_dir['disk_entries'] = $v_data['disk_entries'];
  4552 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries for this disk : \''.$p_central_dir['disk_entries'].'\'');
  4553 + $p_central_dir['offset'] = $v_data['offset'];
  4554 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Offset of Central Dir : \''.$p_central_dir['offset'].'\'');
  4555 + $p_central_dir['size'] = $v_data['size'];
  4556 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size of Central Dir : \''.$p_central_dir['size'].'\'');
  4557 + $p_central_dir['disk'] = $v_data['disk'];
  4558 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Disk number : \''.$p_central_dir['disk'].'\'');
  4559 + $p_central_dir['disk_start'] = $v_data['disk_start'];
  4560 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Start disk number : \''.$p_central_dir['disk_start'].'\'');
  4561 +
  4562 + // TBC
  4563 + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {
  4564 + // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "central_dir[$key] = ".$p_central_dir[$key]);
  4565 + //}
  4566 +
  4567 + // ----- Return
  4568 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4569 + return $v_result;
  4570 + }
  4571 + // --------------------------------------------------------------------------------
  4572 +
  4573 + // --------------------------------------------------------------------------------
  4574 + // Function : privDeleteByRule()
  4575 + // Description :
  4576 + // Parameters :
  4577 + // Return Values :
  4578 + // --------------------------------------------------------------------------------
  4579 + function privDeleteByRule(&$p_result_list, &$p_options)
  4580 + {
  4581 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDeleteByRule", "");
  4582 + $v_result=1;
  4583 + $v_list_detail = array();
  4584 +
  4585 + // ----- Open the zip file
  4586 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  4587 + if (($v_result=$this->privOpenFd('rb')) != 1)
  4588 + {
  4589 + // ----- Return
  4590 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4591 + return $v_result;
  4592 + }
  4593 +
  4594 + // ----- Read the central directory informations
  4595 + $v_central_dir = array();
  4596 + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  4597 + {
  4598 + $this->privCloseFd();
  4599 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4600 + return $v_result;
  4601 + }
  4602 +
  4603 + // ----- Go to beginning of File
  4604 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
  4605 + @rewind($this->zip_fd);
  4606 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
  4607 +
  4608 + // ----- Scan all the files
  4609 + // ----- Start at beginning of Central Dir
  4610 + $v_pos_entry = $v_central_dir['offset'];
  4611 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
  4612 + @rewind($this->zip_fd);
  4613 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
  4614 + if (@fseek($this->zip_fd, $v_pos_entry))
  4615 + {
  4616 + // ----- Close the zip file
  4617 + $this->privCloseFd();
  4618 +
  4619 + // ----- Error log
  4620 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  4621 +
  4622 + // ----- Return
  4623 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4624 + return PclZip::errorCode();
  4625 + }
  4626 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
  4627 +
  4628 + // ----- Read each entry
  4629 + $v_header_list = array();
  4630 + $j_start = 0;
  4631 + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
  4632 + {
  4633 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry (index '$i')");
  4634 +
  4635 + // ----- Read the file header
  4636 + $v_header_list[$v_nb_extracted] = array();
  4637 + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)
  4638 + {
  4639 + // ----- Close the zip file
  4640 + $this->privCloseFd();
  4641 +
  4642 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4643 + return $v_result;
  4644 + }
  4645 +
  4646 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename (index '$i') : '".$v_header_list[$v_nb_extracted]['stored_filename']."'");
  4647 +
  4648 + // ----- Store the index
  4649 + $v_header_list[$v_nb_extracted]['index'] = $i;
  4650 +
  4651 + // ----- Look for the specific extract rules
  4652 + $v_found = false;
  4653 +
  4654 + // ----- Look for extract by name rule
  4655 + if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))
  4656 + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
  4657 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
  4658 +
  4659 + // ----- Look if the filename is in the list
  4660 + for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {
  4661 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
  4662 +
  4663 + // ----- Look for a directory
  4664 + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
  4665 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
  4666 +
  4667 + // ----- Look if the directory is in the filename path
  4668 + if ( (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
  4669 + && (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])) {
  4670 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
  4671 + $v_found = true;
  4672 + }
  4673 + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */
  4674 + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
  4675 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The entry is the searched directory");
  4676 + $v_found = true;
  4677 + }
  4678 + }
  4679 + // ----- Look for a filename
  4680 + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
  4681 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
  4682 + $v_found = true;
  4683 + }
  4684 + }
  4685 + }
  4686 +
  4687 + // ----- Look for extract by ereg rule
  4688 + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG]))
  4689 + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
  4690 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
  4691 +
  4692 + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
  4693 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
  4694 + $v_found = true;
  4695 + }
  4696 + }
  4697 +
  4698 + // ----- Look for extract by preg rule
  4699 + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG]))
  4700 + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
  4701 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
  4702 +
  4703 + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $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 index rule
  4710 + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX]))
  4711 + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
  4712 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
  4713 +
  4714 + // ----- Look if the index is in the list
  4715 + for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {
  4716 + //--(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']."]");
  4717 +
  4718 + if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
  4719 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
  4720 + $v_found = true;
  4721 + }
  4722 + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
  4723 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
  4724 + $j_start = $j+1;
  4725 + }
  4726 +
  4727 + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
  4728 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
  4729 + break;
  4730 + }
  4731 + }
  4732 + }
  4733 + else {
  4734 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "No argument mean remove all file");
  4735 + $v_found = true;
  4736 + }
  4737 +
  4738 + // ----- Look for deletion
  4739 + if ($v_found)
  4740 + {
  4741 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' need to be deleted");
  4742 + unset($v_header_list[$v_nb_extracted]);
  4743 + }
  4744 + else
  4745 + {
  4746 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' will not be deleted");
  4747 + $v_nb_extracted++;
  4748 + }
  4749 + }
  4750 +
  4751 + // ----- Look if something need to be deleted
  4752 + if ($v_nb_extracted > 0) {
  4753 +
  4754 + // ----- Creates a temporay file
  4755 + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
  4756 +
  4757 + // ----- Creates a temporary zip archive
  4758 + $v_temp_zip = new PclZip($v_zip_temp_name);
  4759 +
  4760 + // ----- Open the temporary zip file in write mode
  4761 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary write mode");
  4762 + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
  4763 + $this->privCloseFd();
  4764 +
  4765 + // ----- Return
  4766 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4767 + return $v_result;
  4768 + }
  4769 +
  4770 + // ----- Look which file need to be kept
  4771 + for ($i=0; $i<sizeof($v_header_list); $i++) {
  4772 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Keep entry index '$i' : '".$v_header_list[$i]['filename']."'");
  4773 +
  4774 + // ----- Calculate the position of the header
  4775 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset='". $v_header_list[$i]['offset']."'");
  4776 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
  4777 + @rewind($this->zip_fd);
  4778 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
  4779 + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {
  4780 + // ----- Close the zip file
  4781 + $this->privCloseFd();
  4782 + $v_temp_zip->privCloseFd();
  4783 + @unlink($v_zip_temp_name);
  4784 +
  4785 + // ----- Error log
  4786 + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  4787 +
  4788 + // ----- Return
  4789 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4790 + return PclZip::errorCode();
  4791 + }
  4792 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
  4793 +
  4794 + // ----- Read the file header
  4795 + $v_local_header = array();
  4796 + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
  4797 + // ----- Close the zip file
  4798 + $this->privCloseFd();
  4799 + $v_temp_zip->privCloseFd();
  4800 + @unlink($v_zip_temp_name);
  4801 +
  4802 + // ----- Return
  4803 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4804 + return $v_result;
  4805 + }
  4806 +
  4807 + // ----- Check that local file header is same as central file header
  4808 + if ($this->privCheckFileHeaders($v_local_header,
  4809 + $v_header_list[$i]) != 1) {
  4810 + // TBC
  4811 + }
  4812 + unset($v_local_header);
  4813 +
  4814 + // ----- Write the file header
  4815 + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
  4816 + // ----- Close the zip file
  4817 + $this->privCloseFd();
  4818 + $v_temp_zip->privCloseFd();
  4819 + @unlink($v_zip_temp_name);
  4820 +
  4821 + // ----- Return
  4822 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4823 + return $v_result;
  4824 + }
  4825 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset for this file is '".$v_header_list[$i]['offset']."'");
  4826 +
  4827 + // ----- Read/write the data block
  4828 + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
  4829 + // ----- Close the zip file
  4830 + $this->privCloseFd();
  4831 + $v_temp_zip->privCloseFd();
  4832 + @unlink($v_zip_temp_name);
  4833 +
  4834 + // ----- Return
  4835 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4836 + return $v_result;
  4837 + }
  4838 + }
  4839 +
  4840 + // ----- Store the offset of the central dir
  4841 + $v_offset = @ftell($v_temp_zip->zip_fd);
  4842 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "New offset of central dir : $v_offset");
  4843 +
  4844 + // ----- Re-Create the Central Dir files header
  4845 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the new central directory");
  4846 + for ($i=0; $i<sizeof($v_header_list); $i++) {
  4847 + // ----- Create the file header
  4848 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset of file : ".$v_header_list[$i]['offset']);
  4849 + if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  4850 + $v_temp_zip->privCloseFd();
  4851 + $this->privCloseFd();
  4852 + @unlink($v_zip_temp_name);
  4853 +
  4854 + // ----- Return
  4855 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4856 + return $v_result;
  4857 + }
  4858 +
  4859 + // ----- Transform the header to a 'usable' info
  4860 + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  4861 + }
  4862 +
  4863 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the central directory footer");
  4864 +
  4865 + // ----- Zip file comment
  4866 + $v_comment = '';
  4867 + if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  4868 + $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  4869 + }
  4870 +
  4871 + // ----- Calculate the size of the central header
  4872 + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;
  4873 +
  4874 + // ----- Create the central dir footer
  4875 + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
  4876 + // ----- Reset the file list
  4877 + unset($v_header_list);
  4878 + $v_temp_zip->privCloseFd();
  4879 + $this->privCloseFd();
  4880 + @unlink($v_zip_temp_name);
  4881 +
  4882 + // ----- Return
  4883 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4884 + return $v_result;
  4885 + }
  4886 +
  4887 + // ----- Close
  4888 + $v_temp_zip->privCloseFd();
  4889 + $this->privCloseFd();
  4890 +
  4891 + // ----- Delete the zip file
  4892 + // TBC : I should test the result ...
  4893 + @unlink($this->zipname);
  4894 +
  4895 + // ----- Rename the temporary file
  4896 + // TBC : I should test the result ...
  4897 + //@rename($v_zip_temp_name, $this->zipname);
  4898 + PclZipUtilRename($v_zip_temp_name, $this->zipname);
  4899 +
  4900 + // ----- Destroy the temporary archive
  4901 + unset($v_temp_zip);
  4902 + }
  4903 +
  4904 + // ----- Remove every files : reset the file
  4905 + else if ($v_central_dir['entries'] != 0) {
  4906 + $this->privCloseFd();
  4907 +
  4908 + if (($v_result = $this->privOpenFd('wb')) != 1) {
  4909 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4910 + return $v_result;
  4911 + }
  4912 +
  4913 + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
  4914 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4915 + return $v_result;
  4916 + }
  4917 +
  4918 + $this->privCloseFd();
  4919 + }
  4920 +
  4921 + // ----- Return
  4922 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4923 + return $v_result;
  4924 + }
  4925 + // --------------------------------------------------------------------------------
  4926 +
  4927 + // --------------------------------------------------------------------------------
  4928 + // Function : privDirCheck()
  4929 + // Description :
  4930 + // Check if a directory exists, if not it creates it and all the parents directory
  4931 + // which may be useful.
  4932 + // Parameters :
  4933 + // $p_dir : Directory path to check.
  4934 + // Return Values :
  4935 + // 1 : OK
  4936 + // -1 : Unable to create directory
  4937 + // --------------------------------------------------------------------------------
  4938 + function privDirCheck($p_dir, $p_is_dir=false)
  4939 + {
  4940 + $v_result = 1;
  4941 +
  4942 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'");
  4943 +
  4944 + // ----- Remove the final '/'
  4945 + if (($p_is_dir) && (substr($p_dir, -1)=='/'))
  4946 + {
  4947 + $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
  4948 + }
  4949 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'");
  4950 +
  4951 + // ----- Check the directory availability
  4952 + if ((is_dir($p_dir)) || ($p_dir == ""))
  4953 + {
  4954 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory");
  4955 + return 1;
  4956 + }
  4957 +
  4958 + // ----- Extract parent directory
  4959 + $p_parent_dir = dirname($p_dir);
  4960 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'");
  4961 +
  4962 + // ----- Just a check
  4963 + if ($p_parent_dir != $p_dir)
  4964 + {
  4965 + // ----- Look for parent directory
  4966 + if ($p_parent_dir != "")
  4967 + {
  4968 + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)
  4969 + {
  4970 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  4971 + return $v_result;
  4972 + }
  4973 + }
  4974 + }
  4975 +
  4976 + // ----- Create the directory
  4977 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'");
  4978 + if (!@mkdir($p_dir, 0777))
  4979 + {
  4980 + // ----- Error log
  4981 + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");
  4982 +
  4983 + // ----- Return
  4984 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  4985 + return PclZip::errorCode();
  4986 + }
  4987 +
  4988 + // ----- Return
  4989 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created");
  4990 + return $v_result;
  4991 + }
  4992 + // --------------------------------------------------------------------------------
  4993 +
  4994 + // --------------------------------------------------------------------------------
  4995 + // Function : privMerge()
  4996 + // Description :
  4997 + // If $p_archive_to_add does not exist, the function exit with a success result.
  4998 + // Parameters :
  4999 + // Return Values :
  5000 + // --------------------------------------------------------------------------------
  5001 + function privMerge(&$p_archive_to_add)
  5002 + {
  5003 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privMerge", "archive='".$p_archive_to_add->zipname."'");
  5004 + $v_result=1;
  5005 +
  5006 + // ----- Look if the archive_to_add exists
  5007 + if (!is_file($p_archive_to_add->zipname))
  5008 + {
  5009 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to add does not exist. End of merge.");
  5010 +
  5011 + // ----- Nothing to merge, so merge is a success
  5012 + $v_result = 1;
  5013 +
  5014 + // ----- Return
  5015 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5016 + return $v_result;
  5017 + }
  5018 +
  5019 + // ----- Look if the archive exists
  5020 + if (!is_file($this->zipname))
  5021 + {
  5022 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, duplicate the archive_to_add.");
  5023 +
  5024 + // ----- Do a duplicate
  5025 + $v_result = $this->privDuplicate($p_archive_to_add->zipname);
  5026 +
  5027 + // ----- Return
  5028 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5029 + return $v_result;
  5030 + }
  5031 +
  5032 + // ----- Open the zip file
  5033 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  5034 + if (($v_result=$this->privOpenFd('rb')) != 1)
  5035 + {
  5036 + // ----- Return
  5037 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5038 + return $v_result;
  5039 + }
  5040 +
  5041 + // ----- Read the central directory informations
  5042 + $v_central_dir = array();
  5043 + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  5044 + {
  5045 + $this->privCloseFd();
  5046 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5047 + return $v_result;
  5048 + }
  5049 +
  5050 + // ----- Go to beginning of File
  5051 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
  5052 + @rewind($this->zip_fd);
  5053 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
  5054 +
  5055 + // ----- Open the archive_to_add file
  5056 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open archive_to_add in binary read mode");
  5057 + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)
  5058 + {
  5059 + $this->privCloseFd();
  5060 +
  5061 + // ----- Return
  5062 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5063 + return $v_result;
  5064 + }
  5065 +
  5066 + // ----- Read the central directory informations
  5067 + $v_central_dir_to_add = array();
  5068 + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)
  5069 + {
  5070 + $this->privCloseFd();
  5071 + $p_archive_to_add->privCloseFd();
  5072 +
  5073 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5074 + return $v_result;
  5075 + }
  5076 +
  5077 + // ----- Go to beginning of File
  5078 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
  5079 + @rewind($p_archive_to_add->zip_fd);
  5080 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
  5081 +
  5082 + // ----- Creates a temporay file
  5083 + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
  5084 +
  5085 + // ----- Open the temporary file in write mode
  5086 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  5087 + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
  5088 + {
  5089 + $this->privCloseFd();
  5090 + $p_archive_to_add->privCloseFd();
  5091 +
  5092 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
  5093 +
  5094 + // ----- Return
  5095 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  5096 + return PclZip::errorCode();
  5097 + }
  5098 +
  5099 + // ----- Copy the files from the archive to the temporary file
  5100 + // TBC : Here I should better append the file and go back to erase the central dir
  5101 + $v_size = $v_central_dir['offset'];
  5102 + while ($v_size != 0)
  5103 + {
  5104 + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  5105 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  5106 + $v_buffer = fread($this->zip_fd, $v_read_size);
  5107 + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  5108 + $v_size -= $v_read_size;
  5109 + }
  5110 +
  5111 + // ----- Copy the files from the archive_to_add into the temporary file
  5112 + $v_size = $v_central_dir_to_add['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($p_archive_to_add->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 + // ----- Store the offset of the central dir
  5123 + $v_offset = @ftell($v_zip_temp_fd);
  5124 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
  5125 +
  5126 + // ----- Copy the block of file headers from the old archive
  5127 + $v_size = $v_central_dir['size'];
  5128 + while ($v_size != 0)
  5129 + {
  5130 + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  5131 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  5132 + $v_buffer = @fread($this->zip_fd, $v_read_size);
  5133 + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  5134 + $v_size -= $v_read_size;
  5135 + }
  5136 +
  5137 + // ----- Copy the block of file headers from the archive_to_add
  5138 + $v_size = $v_central_dir_to_add['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($p_archive_to_add->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 + // ----- Merge the file comments
  5149 + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];
  5150 +
  5151 + // ----- Calculate the size of the (new) central header
  5152 + $v_size = @ftell($v_zip_temp_fd)-$v_offset;
  5153 +
  5154 + // ----- Swap the file descriptor
  5155 + // Here is a trick : I swap the temporary fd with the zip fd, in order to use
  5156 + // the following methods on the temporary fil and not the real archive fd
  5157 + $v_swap = $this->zip_fd;
  5158 + $this->zip_fd = $v_zip_temp_fd;
  5159 + $v_zip_temp_fd = $v_swap;
  5160 +
  5161 + // ----- Create the central dir footer
  5162 + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)
  5163 + {
  5164 + $this->privCloseFd();
  5165 + $p_archive_to_add->privCloseFd();
  5166 + @fclose($v_zip_temp_fd);
  5167 + $this->zip_fd = null;
  5168 +
  5169 + // ----- Reset the file list
  5170 + unset($v_header_list);
  5171 +
  5172 + // ----- Return
  5173 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5174 + return $v_result;
  5175 + }
  5176 +
  5177 + // ----- Swap back the file descriptor
  5178 + $v_swap = $this->zip_fd;
  5179 + $this->zip_fd = $v_zip_temp_fd;
  5180 + $v_zip_temp_fd = $v_swap;
  5181 +
  5182 + // ----- Close
  5183 + $this->privCloseFd();
  5184 + $p_archive_to_add->privCloseFd();
  5185 +
  5186 + // ----- Close the temporary file
  5187 + @fclose($v_zip_temp_fd);
  5188 +
  5189 + // ----- Delete the zip file
  5190 + // TBC : I should test the result ...
  5191 + @unlink($this->zipname);
  5192 +
  5193 + // ----- Rename the temporary file
  5194 + // TBC : I should test the result ...
  5195 + //@rename($v_zip_temp_name, $this->zipname);
  5196 + PclZipUtilRename($v_zip_temp_name, $this->zipname);
  5197 +
  5198 + // ----- Return
  5199 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5200 + return $v_result;
  5201 + }
  5202 + // --------------------------------------------------------------------------------
  5203 +
  5204 + // --------------------------------------------------------------------------------
  5205 + // Function : privDuplicate()
  5206 + // Description :
  5207 + // Parameters :
  5208 + // Return Values :
  5209 + // --------------------------------------------------------------------------------
  5210 + function privDuplicate($p_archive_filename)
  5211 + {
  5212 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'");
  5213 + $v_result=1;
  5214 +
  5215 + // ----- Look if the $p_archive_filename exists
  5216 + if (!is_file($p_archive_filename))
  5217 + {
  5218 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate.");
  5219 +
  5220 + // ----- Nothing to duplicate, so duplicate is a success.
  5221 + $v_result = 1;
  5222 +
  5223 + // ----- Return
  5224 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5225 + return $v_result;
  5226 + }
  5227 +
  5228 + // ----- Open the zip file
  5229 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  5230 + if (($v_result=$this->privOpenFd('wb')) != 1)
  5231 + {
  5232 + // ----- Return
  5233 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5234 + return $v_result;
  5235 + }
  5236 +
  5237 + // ----- Open the temporary file in write mode
  5238 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
  5239 + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)
  5240 + {
  5241 + $this->privCloseFd();
  5242 +
  5243 + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');
  5244 +
  5245 + // ----- Return
  5246 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
  5247 + return PclZip::errorCode();
  5248 + }
  5249 +
  5250 + // ----- Copy the files from the archive to the temporary file
  5251 + // TBC : Here I should better append the file and go back to erase the central dir
  5252 + $v_size = filesize($p_archive_filename);
  5253 + while ($v_size != 0)
  5254 + {
  5255 + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  5256 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes");
  5257 + $v_buffer = fread($v_zip_temp_fd, $v_read_size);
  5258 + @fwrite($this->zip_fd, $v_buffer, $v_read_size);
  5259 + $v_size -= $v_read_size;
  5260 + }
  5261 +
  5262 + // ----- Close
  5263 + $this->privCloseFd();
  5264 +
  5265 + // ----- Close the temporary file
  5266 + @fclose($v_zip_temp_fd);
  5267 +
  5268 + // ----- Return
  5269 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5270 + return $v_result;
  5271 + }
  5272 + // --------------------------------------------------------------------------------
  5273 +
  5274 + // --------------------------------------------------------------------------------
  5275 + // Function : privErrorLog()
  5276 + // Description :
  5277 + // Parameters :
  5278 + // --------------------------------------------------------------------------------
  5279 + function privErrorLog($p_error_code=0, $p_error_string='')
  5280 + {
  5281 + if (PCLZIP_ERROR_EXTERNAL == 1) {
  5282 + PclError($p_error_code, $p_error_string);
  5283 + }
  5284 + else {
  5285 + $this->error_code = $p_error_code;
  5286 + $this->error_string = $p_error_string;
  5287 + }
  5288 + }
  5289 + // --------------------------------------------------------------------------------
  5290 +
  5291 + // --------------------------------------------------------------------------------
  5292 + // Function : privErrorReset()
  5293 + // Description :
  5294 + // Parameters :
  5295 + // --------------------------------------------------------------------------------
  5296 + function privErrorReset()
  5297 + {
  5298 + if (PCLZIP_ERROR_EXTERNAL == 1) {
  5299 + PclErrorReset();
  5300 + }
  5301 + else {
  5302 + $this->error_code = 0;
  5303 + $this->error_string = '';
  5304 + }
  5305 + }
  5306 + // --------------------------------------------------------------------------------
  5307 +
  5308 + // --------------------------------------------------------------------------------
  5309 + // Function : privDecrypt()
  5310 + // Description :
  5311 + // Parameters :
  5312 + // Return Values :
  5313 + // --------------------------------------------------------------------------------
  5314 + function privDecrypt($p_encryption_header, &$p_buffer, $p_size, $p_crc)
  5315 + {
  5316 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDecrypt', "size=".$p_size."");
  5317 + $v_result=1;
  5318 +
  5319 + // ----- To Be Modified ;-)
  5320 + $v_pwd = "test";
  5321 +
  5322 + $p_buffer = PclZipUtilZipDecrypt($p_buffer, $p_size, $p_encryption_header,
  5323 + $p_crc, $v_pwd);
  5324 +
  5325 + // ----- Return
  5326 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5327 + return $v_result;
  5328 + }
  5329 + // --------------------------------------------------------------------------------
  5330 +
  5331 + // --------------------------------------------------------------------------------
  5332 + // Function : privDisableMagicQuotes()
  5333 + // Description :
  5334 + // Parameters :
  5335 + // Return Values :
  5336 + // --------------------------------------------------------------------------------
  5337 + function privDisableMagicQuotes()
  5338 + {
  5339 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDisableMagicQuotes', "");
  5340 + $v_result=1;
  5341 +
  5342 + // ----- Look if function exists
  5343 + if ( (!function_exists("get_magic_quotes_runtime"))
  5344 + || (!function_exists("set_magic_quotes_runtime"))) {
  5345 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
  5346 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5347 + return $v_result;
  5348 + }
  5349 +
  5350 + // ----- Look if already done
  5351 + if ($this->magic_quotes_status != -1) {
  5352 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote already disabled");
  5353 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5354 + return $v_result;
  5355 + }
  5356 +
  5357 + // ----- Get and memorize the magic_quote value
  5358 + $this->magic_quotes_status = @get_magic_quotes_runtime();
  5359 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Current magic_quotes_runtime status is '".($this->magic_quotes_status==0?'disable':'enable')."'");
  5360 +
  5361 + // ----- Disable magic_quotes
  5362 + if ($this->magic_quotes_status == 1) {
  5363 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Disable magic_quotes");
  5364 + @set_magic_quotes_runtime(0);
  5365 + }
  5366 +
  5367 + // ----- Return
  5368 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5369 + return $v_result;
  5370 + }
  5371 + // --------------------------------------------------------------------------------
  5372 +
  5373 + // --------------------------------------------------------------------------------
  5374 + // Function : privSwapBackMagicQuotes()
  5375 + // Description :
  5376 + // Parameters :
  5377 + // Return Values :
  5378 + // --------------------------------------------------------------------------------
  5379 + function privSwapBackMagicQuotes()
  5380 + {
  5381 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privSwapBackMagicQuotes', "");
  5382 + $v_result=1;
  5383 +
  5384 + // ----- Look if function exists
  5385 + if ( (!function_exists("get_magic_quotes_runtime"))
  5386 + || (!function_exists("set_magic_quotes_runtime"))) {
  5387 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
  5388 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5389 + return $v_result;
  5390 + }
  5391 +
  5392 + // ----- Look if something to do
  5393 + if ($this->magic_quotes_status != -1) {
  5394 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote not modified");
  5395 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5396 + return $v_result;
  5397 + }
  5398 +
  5399 + // ----- Swap back magic_quotes
  5400 + if ($this->magic_quotes_status == 1) {
  5401 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Enable back magic_quotes");
  5402 + @set_magic_quotes_runtime($this->magic_quotes_status);
  5403 + }
  5404 +
  5405 + // ----- Return
  5406 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5407 + return $v_result;
  5408 + }
  5409 + // --------------------------------------------------------------------------------
  5410 +
  5411 + }
  5412 + // End of class
  5413 + // --------------------------------------------------------------------------------
  5414 +
  5415 + // --------------------------------------------------------------------------------
  5416 + // Function : PclZipUtilPathReduction()
  5417 + // Description :
  5418 + // Parameters :
  5419 + // Return Values :
  5420 + // --------------------------------------------------------------------------------
  5421 + function PclZipUtilPathReduction($p_dir)
  5422 + {
  5423 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathReduction", "dir='$p_dir'");
  5424 + $v_result = "";
  5425 +
  5426 + // ----- Look for not empty path
  5427 + if ($p_dir != "") {
  5428 + // ----- Explode path by directory names
  5429 + $v_list = explode("/", $p_dir);
  5430 +
  5431 + // ----- Study directories from last to first
  5432 + $v_skip = 0;
  5433 + for ($i=sizeof($v_list)-1; $i>=0; $i--) {
  5434 + // ----- Look for current path
  5435 + if ($v_list[$i] == ".") {
  5436 + // ----- Ignore this directory
  5437 + // Should be the first $i=0, but no check is done
  5438 + }
  5439 + else if ($v_list[$i] == "..") {
  5440 + $v_skip++;
  5441 + }
  5442 + else if ($v_list[$i] == "") {
  5443 + // ----- First '/' i.e. root slash
  5444 + if ($i == 0) {
  5445 + $v_result = "/".$v_result;
  5446 + if ($v_skip > 0) {
  5447 + // ----- It is an invalid path, so the path is not modified
  5448 + // TBC
  5449 + $v_result = $p_dir;
  5450 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid path is unchanged");
  5451 + $v_skip = 0;
  5452 + }
  5453 + }
  5454 + // ----- Last '/' i.e. indicates a directory
  5455 + else if ($i == (sizeof($v_list)-1)) {
  5456 + $v_result = $v_list[$i];
  5457 + }
  5458 + // ----- Double '/' inside the path
  5459 + else {
  5460 + // ----- Ignore only the double '//' in path,
  5461 + // but not the first and last '/'
  5462 + }
  5463 + }
  5464 + else {
  5465 + // ----- Look for item to skip
  5466 + if ($v_skip > 0) {
  5467 + $v_skip--;
  5468 + }
  5469 + else {
  5470 + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
  5471 + }
  5472 + }
  5473 + }
  5474 +
  5475 + // ----- Look for skip
  5476 + if ($v_skip > 0) {
  5477 + while ($v_skip > 0) {
  5478 + $v_result = '../'.$v_result;
  5479 + $v_skip--;
  5480 + }
  5481 + }
  5482 + }
  5483 +
  5484 + // ----- Return
  5485 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5486 + return $v_result;
  5487 + }
  5488 + // --------------------------------------------------------------------------------
  5489 +
  5490 + // --------------------------------------------------------------------------------
  5491 + // Function : PclZipUtilPathInclusion()
  5492 + // Description :
  5493 + // This function indicates if the path $p_path is under the $p_dir tree. Or,
  5494 + // said in an other way, if the file or sub-dir $p_path is inside the dir
  5495 + // $p_dir.
  5496 + // The function indicates also if the path is exactly the same as the dir.
  5497 + // This function supports path with duplicated '/' like '//', but does not
  5498 + // support '.' or '..' statements.
  5499 + // Parameters :
  5500 + // Return Values :
  5501 + // 0 if $p_path is not inside directory $p_dir
  5502 + // 1 if $p_path is inside directory $p_dir
  5503 + // 2 if $p_path is exactly the same as $p_dir
  5504 + // --------------------------------------------------------------------------------
  5505 + function PclZipUtilPathInclusion($p_dir, $p_path)
  5506 + {
  5507 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'");
  5508 + $v_result = 1;
  5509 +
  5510 + // ----- Look for path beginning by ./
  5511 + if ( ($p_dir == '.')
  5512 + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
  5513 + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);
  5514 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_dir '".$p_dir."'");
  5515 + }
  5516 + if ( ($p_path == '.')
  5517 + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {
  5518 + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);
  5519 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_path '".$p_path."'");
  5520 + }
  5521 +
  5522 + // ----- Explode dir and path by directory separator
  5523 + $v_list_dir = explode("/", $p_dir);
  5524 + $v_list_dir_size = sizeof($v_list_dir);
  5525 + $v_list_path = explode("/", $p_path);
  5526 + $v_list_path_size = sizeof($v_list_path);
  5527 +
  5528 + // ----- Study directories paths
  5529 + $i = 0;
  5530 + $j = 0;
  5531 + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {
  5532 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'");
  5533 +
  5534 + // ----- Look for empty dir (path reduction)
  5535 + if ($v_list_dir[$i] == '') {
  5536 + $i++;
  5537 + continue;
  5538 + }
  5539 + if ($v_list_path[$j] == '') {
  5540 + $j++;
  5541 + continue;
  5542 + }
  5543 +
  5544 + // ----- Compare the items
  5545 + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) {
  5546 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different");
  5547 + $v_result = 0;
  5548 + }
  5549 +
  5550 + // ----- Next items
  5551 + $i++;
  5552 + $j++;
  5553 + }
  5554 +
  5555 + // ----- Look if everything seems to be the same
  5556 + if ($v_result) {
  5557 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break");
  5558 + // ----- Skip all the empty items
  5559 + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
  5560 + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;
  5561 + //--(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]:'')."'");
  5562 +
  5563 + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
  5564 + // ----- There are exactly the same
  5565 + $v_result = 2;
  5566 + }
  5567 + else if ($i < $v_list_dir_size) {
  5568 + // ----- The path is shorter than the dir
  5569 + $v_result = 0;
  5570 + }
  5571 + }
  5572 +
  5573 + // ----- Return
  5574 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5575 + return $v_result;
  5576 + }
  5577 + // --------------------------------------------------------------------------------
  5578 +
  5579 + // --------------------------------------------------------------------------------
  5580 + // Function : PclZipUtilCopyBlock()
  5581 + // Description :
  5582 + // Parameters :
  5583 + // $p_mode : read/write compression mode
  5584 + // 0 : src & dest normal
  5585 + // 1 : src gzip, dest normal
  5586 + // 2 : src normal, dest gzip
  5587 + // 3 : src & dest gzip
  5588 + // Return Values :
  5589 + // --------------------------------------------------------------------------------
  5590 + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)
  5591 + {
  5592 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilCopyBlock", "size=$p_size, mode=$p_mode");
  5593 + $v_result = 1;
  5594 +
  5595 + if ($p_mode==0)
  5596 + {
  5597 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset before read :".(@ftell($p_src)));
  5598 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset before write :".(@ftell($p_dest)));
  5599 + while ($p_size != 0)
  5600 + {
  5601 + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
  5602 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  5603 + $v_buffer = @fread($p_src, $v_read_size);
  5604 + @fwrite($p_dest, $v_buffer, $v_read_size);
  5605 + $p_size -= $v_read_size;
  5606 + }
  5607 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset after read :".(@ftell($p_src)));
  5608 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset after write :".(@ftell($p_dest)));
  5609 + }
  5610 + else if ($p_mode==1)
  5611 + {
  5612 + while ($p_size != 0)
  5613 + {
  5614 + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
  5615 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
  5616 + $v_buffer = @gzread($p_src, $v_read_size);
  5617 + @fwrite($p_dest, $v_buffer, $v_read_size);
  5618 + $p_size -= $v_read_size;
  5619 + }
  5620 + }
  5621 + else if ($p_mode==2)
  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 = @fread($p_src, $v_read_size);
  5628 + @gzwrite($p_dest, $v_buffer, $v_read_size);
  5629 + $p_size -= $v_read_size;
  5630 + }
  5631 + }
  5632 + else if ($p_mode==3)
  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 = @gzread($p_src, $v_read_size);
  5639 + @gzwrite($p_dest, $v_buffer, $v_read_size);
  5640 + $p_size -= $v_read_size;
  5641 + }
  5642 + }
  5643 +
  5644 + // ----- Return
  5645 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5646 + return $v_result;
  5647 + }
  5648 + // --------------------------------------------------------------------------------
  5649 +
  5650 + // --------------------------------------------------------------------------------
  5651 + // Function : PclZipUtilRename()
  5652 + // Description :
  5653 + // This function tries to do a simple rename() function. If it fails, it
  5654 + // tries to copy the $p_src file in a new $p_dest file and then unlink the
  5655 + // first one.
  5656 + // Parameters :
  5657 + // $p_src : Old filename
  5658 + // $p_dest : New filename
  5659 + // Return Values :
  5660 + // 1 on success, 0 on failure.
  5661 + // --------------------------------------------------------------------------------
  5662 + function PclZipUtilRename($p_src, $p_dest)
  5663 + {
  5664 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilRename", "source=$p_src, destination=$p_dest");
  5665 + $v_result = 1;
  5666 +
  5667 + // ----- Try to rename the files
  5668 + if (!@rename($p_src, $p_dest)) {
  5669 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to rename file, try copy+unlink");
  5670 +
  5671 + // ----- Try to copy & unlink the src
  5672 + if (!@copy($p_src, $p_dest)) {
  5673 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to copy file");
  5674 + $v_result = 0;
  5675 + }
  5676 + else if (!@unlink($p_src)) {
  5677 + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to unlink old filename");
  5678 + $v_result = 0;
  5679 + }
  5680 + }
  5681 +
  5682 + // ----- Return
  5683 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5684 + return $v_result;
  5685 + }
  5686 + // --------------------------------------------------------------------------------
  5687 +
  5688 + // --------------------------------------------------------------------------------
  5689 + // Function : PclZipUtilOptionText()
  5690 + // Description :
  5691 + // Translate option value in text. Mainly for debug purpose.
  5692 + // Parameters :
  5693 + // $p_option : the option value.
  5694 + // Return Values :
  5695 + // The option text value.
  5696 + // --------------------------------------------------------------------------------
  5697 + function PclZipUtilOptionText($p_option)
  5698 + {
  5699 + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilOptionText", "option='".$p_option."'");
  5700 +
  5701 + $v_list = get_defined_constants();
  5702 + for (reset($v_list); $v_key = key($v_list); next($v_list)) {
  5703 + $v_prefix = substr($v_key, 0, 10);
  5704 + if (( ($v_prefix == 'PCLZIP_OPT')
  5705 + || ($v_prefix == 'PCLZIP_CB_')
  5706 + || ($v_prefix == 'PCLZIP_ATT'))
  5707 + && ($v_list[$v_key] == $p_option)) {
  5708 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_key);
  5709 + return $v_key;
  5710 + }
  5711 + }
  5712 +
  5713 + $v_result = 'Unknown';
  5714 +
  5715 + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  5716 + return $v_result;
  5717 + }
  5718 + // --------------------------------------------------------------------------------
  5719 +
  5720 + // --------------------------------------------------------------------------------
  5721 + // Function : PclZipUtilTranslateWinPath()
  5722 + // Description :
  5723 + // Translate windows path by replacing '\' by '/' and optionally removing
  5724 + // drive letter.
  5725 + // Parameters :
  5726 + // $p_path : path to translate.
  5727 + // $p_remove_disk_letter : true | false
  5728 + // Return Values :
  5729 + // The path translated.
  5730 + // --------------------------------------------------------------------------------
  5731 + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)
  5732 + {
  5733 + if (stristr(php_uname(), 'windows')) {
  5734 + // ----- Look for potential disk letter
  5735 + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
  5736 + $p_path = substr($p_path, $v_position+1);
  5737 + }
  5738 + // ----- Change potential windows directory separator
  5739 + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
  5740 + $p_path = strtr($p_path, '\\', '/');
  5741 + }
  5742 + }
  5743 + return $p_path;
  5744 + }
  5745 + // --------------------------------------------------------------------------------
  5746 +
  5747 +
  5748 +?>
webservice/clienttools/services/0.2/kt.php
@@ -298,7 +298,8 @@ class kt extends client_service { @@ -298,7 +298,8 @@ class kt extends client_service {
298 'modified'=>$item['modified_date'], 298 'modified'=>$item['modified_date'],
299 'checked_out_by'=>$item['checked_out_by'], 299 'checked_out_by'=>$item['checked_out_by'],
300 'relevance'=>$item['relevance'], 300 'relevance'=>$item['relevance'],
301 - 'qtip'=> $qtip 301 + 'qtip'=> $qtip,
  302 + 'version'=>$item['version']
302 ); 303 );
303 } 304 }
304 305
@@ -323,7 +324,8 @@ class kt extends client_service { @@ -323,7 +324,8 @@ class kt extends client_service {
323 'content_id'=>$item['content_id'], 324 'content_id'=>$item['content_id'],
324 'filesize'=>$item['filesize'], 325 'filesize'=>$item['filesize'],
325 'modified'=>$item['modified_date'], 326 'modified'=>$item['modified_date'],
326 - 'checked_out_by'=>$item['checked_out_by'] 327 + 'checked_out_by'=>$item['checked_out_by'],
  328 + 'version'=>$item['version']
327 ); 329 );
328 } 330 }
329 331