Skip to content
Snippets Groups Projects
Commit dd6c671b authored by Aurelien Bompard's avatar Aurelien Bompard
Browse files

multiple fixes for the zip library

 1. A recursive zip function. "$basedir" will be stripped from the path in the
    archive.

 2. and 3. : Documentation

 4. : Avoid a PHP "Notice"

 5., 6. and 7. : handle ODT files where some headers are equal to 0.

 8.: Avoid a PHP "Notice"

darcs-hash:20080227231447-5a6cd-45ff763079ad0a7d8f4029639cf53fe10faa4389.gz
parent dee0b27a
No related branches found
No related tags found
No related merge requests found
......@@ -53,6 +53,34 @@ class ZipLib
return $ret;
}
/**
* Zips recursively the $folder directory, from the $basedir directory
*/
function Compress($folder, $basedir=null, $parent=null)
{
$full_path = $basedir."/".$parent.$folder;
$zip_path = $parent.$folder;
if ($zip_path) {
$zip_path .= "/";
$this->add_dir($zip_path);
}
$dir = new DirectoryIterator($full_path);
foreach($dir as $file) {
if(!$file->isDot()) {
$filename = $file->getFilename();
if($file->isDir()) {
$this->Compress($filename, $basedir, $zip_path);
} else {
$content = join('', file($full_path.'/'.$filename));
$this->add_File($content, $zip_path.$filename);
}
}
}
}
/**
* Returns the Zip file
*/
function get_file()
{
$data = implode('', $this -> datasec);
......@@ -85,6 +113,9 @@ class ZipLib
$this -> dirs[] = $name;
}
/**
* Add a file named $name from a string $data
*/
function add_File($data, $name, $compact = 1)
{
$name = str_replace('\\', '/', $name);
......@@ -138,6 +169,9 @@ class ZipLib
($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
}
/**
* Extract a zip file $zn to the $to directory
*/
function Extract ( $zn, $to, $index = Array(-1) )
{
if(!@is_dir($to)) $this->_mkdir($to);
......@@ -147,7 +181,7 @@ class ZipLib
$pos_entry = $cdir['offset'];
if(!is_array($index)){ $index = array($index); }
for($i=0; $index[$i];$i++){
for($i=0; isset($index[$i]);$i++){
if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir['entries'])
return(-1);
}
......@@ -166,7 +200,7 @@ class ZipLib
return $stat;
}
function ReadFileHeader($zip)
function ReadFileHeader($zip, $header)
{
$binary_data = fread($zip, 30);
$data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data);
......@@ -176,9 +210,11 @@ class ZipLib
$header['extra'] = fread($zip, $data['extra_len']);
} else { $header['extra'] = ''; }
$header['compression'] = $data['compression'];$header['size'] = $data['size'];
$header['compressed_size'] = $data['compressed_size'];
$header['crc'] = $data['crc']; $header['flag'] = $data['flag'];
$header['compression'] = $data['compression'];
foreach (array('size','compressed_size','crc') as $hd) { // On ODT files, these headers are 0. Keep the previous value.
if ($data[$hd] != 0) $header[$hd] = $data[$hd];
}
$header['flag'] = $data['flag'];
$header['mdate'] = $data['mdate'];$header['mtime'] = $data['mtime'];
if ($header['mdate'] && $header['mtime']){
......@@ -258,7 +294,7 @@ class ZipLib
function ExtractFile($header,$to,$zip)
{
$header = $this->readfileheader($zip);
$header = $this->readfileheader($zip, $header);
if(substr($to,-1)!="/") $to.="/";
if(substr($header['filename'],-1)=="/")
......@@ -276,7 +312,7 @@ class ZipLib
// }
if (!$this->_mkdir($to.dirname($header['filename']))) return (-1); //--CS
if (!($header['external']==0x41FF0010)&&!($header['external']==16))
if (!array_key_exists("external", $header) || (!($header['external']==0x41FF0010)&&!($header['external']==16)))
{
if ($header['compression']==0)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment