From 5e79ac7d8f981bed29e48364422c6e68da04536c Mon Sep 17 00:00:00 2001 From: "Paul S. Owen" Date: Sat, 9 Aug 2003 12:36:14 +0000 Subject: [PATCH] Further tidy ups for zip compatibility ... still seem to be problems deleting entries via Powerarchiver ... works fine under Linux git-svn-id: file:///svn/phpbb/trunk@4355 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/includes/functions_compress.php | 110 +++++++++++++------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/phpBB/includes/functions_compress.php b/phpBB/includes/functions_compress.php index 6b3bacd0f9..f3a8f6272e 100644 --- a/phpBB/includes/functions_compress.php +++ b/phpBB/includes/functions_compress.php @@ -1,23 +1,15 @@ fp); } + // Create the structures ... note we assume version made by is MSDOS function data($name, $data, $mtime = false, $is_dir = false) { $name = str_replace('\\', '/', $name); @@ -278,25 +268,35 @@ class compress_zip extends compress $zdata = gzcompress($data); $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug $c_len = strlen($zdata); + + // Did we compress? No, then use data as is + if ($c_len > $unc_len) + { + $zdata = $data; + $c_len = $unc_len; + } } unset($data); - $fr = "\x50\x4b\x03\x04"; // - $fr .= "\x14\x00"; // ver needed to extract 4 - $fr .= "\x00\x00"; // gen purpose bit flag 6 - $fr .= "\x08\x00"; // compression method 8 - $fr .= $hexdtime; // last mod time and date 10 - $fr .= pack('V', $crc); // crc32 14 - $fr .= pack('V', $c_len); // compressed filesize 18 - $fr .= pack('V', $unc_len); // uncompressed filesize 22 - $fr .= pack('v', strlen($name));// length of filename 26 - $fr .= pack('v', 0); // extra field length 28 - $fr .= $name; // 30 + // If we didn't compress set method to store, else deflate + $c_method = ($c_len == $unc_len) ? "\x00\x00" : "\x08\x00"; + + $fr = "\x50\x4b\x03\x04"; // Local file header 4bytes + $fr .= "\x14\x00"; // ver needed to extract 2bytes + $fr .= "\x00\x00"; // gen purpose bit flag 2bytes + $fr .= $c_method; // compression method 2bytes + $fr .= $hexdtime; // last mod time and date 2+2bytes + $fr .= pack('V', $crc); // crc32 4bytes + $fr .= pack('V', $c_len); // compressed filesize 4bytes + $fr .= pack('V', $unc_len); // uncompressed filesize 4bytes + $fr .= pack('v', strlen($name));// length of filename 2bytes + $fr .= pack('v', 0); // extra field length 2bytes + $fr .= $name; $fr .= $zdata; unset($zdata); - $fr .= pack('V', $crc); - $fr .= pack('V', $c_len); // compressed filesize - $fr .= pack('V', $unc_len); // uncompressed filesize + $fr .= pack('V', $crc); // crc32 4bytes + $fr .= pack('V', $c_len); // compressed filesize 4bytes + $fr .= pack('V', $unc_len); // uncompressed filesize 4bytes $this->datasec_len += strlen($fr); @@ -308,15 +308,15 @@ class compress_zip extends compress // Are we a file or a directory? Set archive for file $attrib = ($is_dir) ? 16 : 32; - $cdrec = "\x50\x4b\x01\x02"; - $cdrec .= "\x00\x00"; // version made by - $cdrec .= "\x14\x00"; // version needed to extract - $cdrec .= "\x00\x00"; // gen purpose bit flag - $cdrec .= "\x08\x00"; // compression method - $cdrec .= $hexdtime; // last mod time & date - $cdrec .= pack('V', $crc); // crc32 - $cdrec .= pack('V', $c_len); // compressed filesize - $cdrec .= pack('V', $unc_len); // uncompressed filesize + $cdrec = "\x50\x4b\x01\x02"; // header 4bytes + $cdrec .= "\x00\x00"; // version made by + $cdrec .= "\x14\x00"; // version needed to extract + $cdrec .= "\x00\x00"; // gen purpose bit flag + $cdrec .= $c_method; // compression method + $cdrec .= $hexdtime; // last mod time & date + $cdrec .= pack('V', $crc); // crc32 + $cdrec .= pack('V', $c_len); // compressed filesize + $cdrec .= pack('V', $unc_len); // uncompressed filesize $cdrec .= pack('v', strlen($name)); // length of filename $cdrec .= pack('v', 0); // extra field length $cdrec .= pack('v', 0); // file comment length @@ -335,13 +335,15 @@ class compress_zip extends compress function file() { $ctrldir = implode('', $this->ctrl_dir); + $comment = 'Created by phpBB 2.2'; - return $ctrldir . $this->eof_ctrl_dir . + return $ctrldir . "\x50\x4b\x05\x06\x00\x00\x00\x00" . pack('v', sizeof($this->ctrl_dir)) . // total # of entries "on this disk" pack('v', sizeof($this->ctrl_dir)) . // total # of entries overall pack('V', strlen($ctrldir)) . // size of central dir pack('V', $this->datasec_len) . // offset to start of central dir - "\x00\x00"; // .zip file comment length + pack('v', strlen($comment)) . // .zip file comment length + $comment; } }