mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 14:18:52 +00:00
It's amazing what a strategically placed = can do for normal operation ...
git-svn-id: file:///svn/phpbb/trunk@4356 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
parent
5e79ac7d8f
commit
2efff50736
1 changed files with 24 additions and 19 deletions
|
@ -99,7 +99,7 @@ class compress_zip extends compress
|
||||||
{
|
{
|
||||||
var $datasec = array();
|
var $datasec = array();
|
||||||
var $ctrl_dir = array();
|
var $ctrl_dir = array();
|
||||||
var $eof_ctrl_dir = 0x06054b50;
|
var $eof_cdh = "\x50\x4b\x05\x06\x00\x00\x00\x00";
|
||||||
|
|
||||||
var $old_offset = 0;
|
var $old_offset = 0;
|
||||||
var $datasec_len = 0;
|
var $datasec_len = 0;
|
||||||
|
@ -144,11 +144,11 @@ class compress_zip extends compress
|
||||||
{
|
{
|
||||||
$buffer = fread($this->fp, 46);
|
$buffer = fread($this->fp, 46);
|
||||||
|
|
||||||
$tmp = unpack("Vcrc/Vc_size/Vuc_size/vstrlen", substr($buffer, 16, 14));
|
$tmp = unpack("vc_method/Vmtime/Vcrc/Vc_size/Vuc_size/vstrlen", substr($buffer, 10, 20));
|
||||||
|
$c_method = (int) trim($tmp['c_method']);
|
||||||
$crc = (int) trim($tmp['crc']);
|
$crc = (int) trim($tmp['crc']);
|
||||||
$strlen = (int) trim($tmp['strlen']);
|
$strlen = (int) trim($tmp['strlen']);
|
||||||
$uc_size = (int) trim($tmp['uc_size']);
|
$uc_size = (int) trim($tmp['uc_size']);
|
||||||
$c_size = (int) trim($tmp['c_size']);
|
|
||||||
|
|
||||||
$tmp = unpack("Vattrib/Voffset", substr($buffer, 38, 8));
|
$tmp = unpack("Vattrib/Voffset", substr($buffer, 38, 8));
|
||||||
$attrib = (int) trim($tmp['attrib']);
|
$attrib = (int) trim($tmp['attrib']);
|
||||||
|
@ -158,10 +158,10 @@ class compress_zip extends compress
|
||||||
|
|
||||||
if ($attrib == 32)
|
if ($attrib == 32)
|
||||||
{
|
{
|
||||||
|
$seek_ary[$j]['c_method'] = $c_method;
|
||||||
$seek_ary[$j]['crc'] = $crc;
|
$seek_ary[$j]['crc'] = $crc;
|
||||||
$seek_ary[$j]['strlen'] = $strlen;
|
$seek_ary[$j]['strlen'] = $strlen;
|
||||||
$seek_ary[$j]['uc_size'] = $uc_size;
|
$seek_ary[$j]['uc_size'] = $uc_size;
|
||||||
$seek_ary[$j]['c_size'] = $c_size;
|
|
||||||
|
|
||||||
$seek_ary[$j]['offset'] = $offset;
|
$seek_ary[$j]['offset'] = $offset;
|
||||||
$seek_ary[$j]['filename'] = $dst . $filename;
|
$seek_ary[$j]['filename'] = $dst . $filename;
|
||||||
|
@ -192,12 +192,16 @@ class compress_zip extends compress
|
||||||
{
|
{
|
||||||
$filename = $seek['filename'];
|
$filename = $seek['filename'];
|
||||||
|
|
||||||
|
// fseek($this->fp, $seek['offset'] + 8); // To grab file header info
|
||||||
|
// fseek($this->fp, $seek['offset'] + 30 + $tmp['strlen'] + $tmp['c_size']); // To grab file header info2
|
||||||
|
|
||||||
|
// Jump to data
|
||||||
fseek($this->fp, $seek['offset'] + 30 + $seek['strlen']);
|
fseek($this->fp, $seek['offset'] + 30 + $seek['strlen']);
|
||||||
|
|
||||||
// Was data compressed? If so we have to fudge a solution thanks
|
// Was data compressed? If so we have to fudge a solution thanks
|
||||||
// to some "issues" with gzuncompress. Else we just write out the
|
// to some "issues" with gzuncompress. Else we just write out the
|
||||||
// data
|
// data
|
||||||
if ($seek['uc_size'] != $seek['c_size'])
|
if ($seek['c_method'] == 8)
|
||||||
{
|
{
|
||||||
// Temp gzip file -> .gz header -> data -> gz footer
|
// Temp gzip file -> .gz header -> data -> gz footer
|
||||||
if (!($fp = fopen($filename . '.gz', 'wb')))
|
if (!($fp = fopen($filename . '.gz', 'wb')))
|
||||||
|
@ -234,7 +238,7 @@ class compress_zip extends compress
|
||||||
trigger_error("Could not create $filename");
|
trigger_error("Could not create $filename");
|
||||||
}
|
}
|
||||||
|
|
||||||
fwrite($fp, fread($this->fp, $seek['c_size']));
|
fwrite($fp, fread($this->fp, $seek['uc_size']));
|
||||||
fclose($fp);
|
fclose($fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,7 +274,7 @@ class compress_zip extends compress
|
||||||
$c_len = strlen($zdata);
|
$c_len = strlen($zdata);
|
||||||
|
|
||||||
// Did we compress? No, then use data as is
|
// Did we compress? No, then use data as is
|
||||||
if ($c_len > $unc_len)
|
if ($c_len >= $unc_len)
|
||||||
{
|
{
|
||||||
$zdata = $data;
|
$zdata = $data;
|
||||||
$c_len = $unc_len;
|
$c_len = $unc_len;
|
||||||
|
@ -281,8 +285,13 @@ class compress_zip extends compress
|
||||||
// If we didn't compress set method to store, else deflate
|
// If we didn't compress set method to store, else deflate
|
||||||
$c_method = ($c_len == $unc_len) ? "\x00\x00" : "\x08\x00";
|
$c_method = ($c_len == $unc_len) ? "\x00\x00" : "\x08\x00";
|
||||||
|
|
||||||
|
// Are we a file or a directory? Set archive for file
|
||||||
|
$attrib = ($is_dir) ? 16 : 32;
|
||||||
|
$var_ext = ($is_dir) ? "\x0a" : "\x14";
|
||||||
|
|
||||||
|
// File Record Header
|
||||||
$fr = "\x50\x4b\x03\x04"; // Local file header 4bytes
|
$fr = "\x50\x4b\x03\x04"; // Local file header 4bytes
|
||||||
$fr .= "\x14\x00"; // ver needed to extract 2bytes
|
$fr .= "$var_ext\x00"; // ver needed to extract 2bytes
|
||||||
$fr .= "\x00\x00"; // gen purpose bit flag 2bytes
|
$fr .= "\x00\x00"; // gen purpose bit flag 2bytes
|
||||||
$fr .= $c_method; // compression method 2bytes
|
$fr .= $c_method; // compression method 2bytes
|
||||||
$fr .= $hexdtime; // last mod time and date 2+2bytes
|
$fr .= $hexdtime; // last mod time and date 2+2bytes
|
||||||
|
@ -290,6 +299,7 @@ class compress_zip extends compress
|
||||||
$fr .= pack('V', $c_len); // compressed filesize 4bytes
|
$fr .= pack('V', $c_len); // compressed filesize 4bytes
|
||||||
$fr .= pack('V', $unc_len); // uncompressed filesize 4bytes
|
$fr .= pack('V', $unc_len); // uncompressed filesize 4bytes
|
||||||
$fr .= pack('v', strlen($name));// length of filename 2bytes
|
$fr .= pack('v', strlen($name));// length of filename 2bytes
|
||||||
|
|
||||||
$fr .= pack('v', 0); // extra field length 2bytes
|
$fr .= pack('v', 0); // extra field length 2bytes
|
||||||
$fr .= $name;
|
$fr .= $name;
|
||||||
$fr .= $zdata;
|
$fr .= $zdata;
|
||||||
|
@ -300,17 +310,14 @@ class compress_zip extends compress
|
||||||
|
|
||||||
$this->datasec_len += strlen($fr);
|
$this->datasec_len += strlen($fr);
|
||||||
|
|
||||||
// Add data to file ... by writing data out incrementally we
|
// Add data to file ... by writing data out incrementally we save some memory
|
||||||
// save some memory
|
|
||||||
fwrite($this->fp, $fr);
|
fwrite($this->fp, $fr);
|
||||||
unset($fr);
|
unset($fr);
|
||||||
|
|
||||||
// Are we a file or a directory? Set archive for file
|
// Central Directory Header
|
||||||
$attrib = ($is_dir) ? 16 : 32;
|
|
||||||
|
|
||||||
$cdrec = "\x50\x4b\x01\x02"; // header 4bytes
|
$cdrec = "\x50\x4b\x01\x02"; // header 4bytes
|
||||||
$cdrec .= "\x00\x00"; // version made by
|
$cdrec .= "\x00\x00"; // version made by
|
||||||
$cdrec .= "\x14\x00"; // version needed to extract
|
$cdrec .= "$var_ext\x00"; // version needed to extract
|
||||||
$cdrec .= "\x00\x00"; // gen purpose bit flag
|
$cdrec .= "\x00\x00"; // gen purpose bit flag
|
||||||
$cdrec .= $c_method; // compression method
|
$cdrec .= $c_method; // compression method
|
||||||
$cdrec .= $hexdtime; // last mod time & date
|
$cdrec .= $hexdtime; // last mod time & date
|
||||||
|
@ -322,7 +329,7 @@ class compress_zip extends compress
|
||||||
$cdrec .= pack('v', 0); // file comment length
|
$cdrec .= pack('v', 0); // file comment length
|
||||||
$cdrec .= pack('v', 0); // disk number start
|
$cdrec .= pack('v', 0); // disk number start
|
||||||
$cdrec .= pack('v', 0); // internal file attributes
|
$cdrec .= pack('v', 0); // internal file attributes
|
||||||
$cdrec .= pack('V', $attrib); // external file attributes
|
$cdrec .= pack('V', $attrib); // external file attributes
|
||||||
$cdrec .= pack('V', $this->old_offset); // relative offset of local header
|
$cdrec .= pack('V', $this->old_offset); // relative offset of local header
|
||||||
$cdrec .= $name;
|
$cdrec .= $name;
|
||||||
|
|
||||||
|
@ -335,15 +342,13 @@ class compress_zip extends compress
|
||||||
function file()
|
function file()
|
||||||
{
|
{
|
||||||
$ctrldir = implode('', $this->ctrl_dir);
|
$ctrldir = implode('', $this->ctrl_dir);
|
||||||
$comment = 'Created by phpBB 2.2';
|
|
||||||
|
|
||||||
return $ctrldir . "\x50\x4b\x05\x06\x00\x00\x00\x00" .
|
return $ctrldir . $this->eof_cdh .
|
||||||
pack('v', sizeof($this->ctrl_dir)) . // total # of entries "on this disk"
|
pack('v', sizeof($this->ctrl_dir)) . // total # of entries "on this disk"
|
||||||
pack('v', sizeof($this->ctrl_dir)) . // total # of entries overall
|
pack('v', sizeof($this->ctrl_dir)) . // total # of entries overall
|
||||||
pack('V', strlen($ctrldir)) . // size of central dir
|
pack('V', strlen($ctrldir)) . // size of central dir
|
||||||
pack('V', $this->datasec_len) . // offset to start of central dir
|
pack('V', $this->datasec_len) . // offset to start of central dir
|
||||||
pack('v', strlen($comment)) . // .zip file comment length
|
"\x00\x00"; // .zip file comment length
|
||||||
$comment;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue