summaryrefslogtreecommitdiffstats
path: root/system/libraries/Zip.php
diff options
context:
space:
mode:
authoradmin <devnull@localhost>2006-09-30 21:25:07 +0200
committeradmin <devnull@localhost>2006-09-30 21:25:07 +0200
commitae58a5de4fc040847c43209173dbc7f1193f6c53 (patch)
tree027caa23ae32b7a051ddedf940d1b4531de8b9d3 /system/libraries/Zip.php
parent3dd978f680076be842bfcb5c9e2cbf35b926373b (diff)
Diffstat (limited to 'system/libraries/Zip.php')
-rw-r--r--system/libraries/Zip.php154
1 files changed, 154 insertions, 0 deletions
diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php
new file mode 100644
index 000000000..9cfe9593d
--- /dev/null
+++ b/system/libraries/Zip.php
@@ -0,0 +1,154 @@
+<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author Rick Ellis
+ * @copyright Copyright (c) 2006, pMachine, Inc.
+ * @license http://www.codeignitor.com/user_guide/license.html
+ * @link http://www.codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Zip Compression Class
+ *
+ * This class is based on a library aquired at Zend:
+ * http://www.zend.com/codex.php?id=696&single=1
+ *
+ * I'm not sure this library is all that reliable, but it's the only
+ * zip compressor I'm aware of -- Rick Ellis
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Encryption
+ * @author Rick Ellis
+ * @link http://www.codeigniter.com/user_guide/general/encryption.html
+ */
+class Zip {
+
+ var $zdata = array();
+ var $cdir = array();
+ var $offset = 0;
+
+ /**
+ * Add a Directory
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function add_dir($name)
+ {
+ $name =str_replace ("\\", "/", $name);
+
+ $fd = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ .pack("V", 0)
+ .pack("V", 0)
+ .pack("V", 0)
+ .pack("v", strlen($name))
+ .pack("v", 0)
+ .$name;
+
+ $this->cdata[] = $fd;
+
+ $cd = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ .pack("V", 0)
+ .pack("V", 0)
+ .pack("V", 0)
+ .pack("v", strlen ($name))
+ .pack("v", 0)
+ .pack("v", 0)
+ .pack("v", 0)
+ .pack("v", 0)
+ .pack("V", 16)
+ .pack("V", $this->offset)
+ .$name;
+
+ $this->offset = strlen(implode('', $this->cdata));
+
+ $this->cdir[] = $cd;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add a File
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function add_file($data, $name)
+ {
+ $name = str_replace("\\", "/", $name);
+
+ $u_len = strlen($data);
+ $crc = crc32($data);
+ $data = gzcompress($data);
+ $data = substr(substr($data, 0,strlen ($data) - 4), 2);
+ $c_len = strlen($data);
+
+ $fd = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ .pack("V", $crc)
+ .pack("V", $c_len)
+ .pack("V", $u_len)
+ .pack("v", strlen($name))
+ .pack("v", 0)
+ .$name
+ .$data
+ .pack("V", $crc)
+ .pack("V", $c_len)
+ .pack("V", $u_len);
+
+ $this->zdata[] = $fd;
+
+ $cd = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ .pack("V", $crc)
+ .pack("V", $c_len)
+ .pack("V", $u_len)
+ .pack("v", strlen ($name))
+ .pack("v", 0)
+ .pack("v", 0)
+ .pack("v", 0)
+ .pack("v", 0)
+ .pack("V", 32 )
+ .pack("V", $this->offset)
+ .$name;
+
+ $this->offset = strlen(implode('', $this->zdata));
+
+ $this->cdir[] = $cd;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Output the zip file
+ *
+ * @access public
+ * @return string
+ */
+ function output_zipfile()
+ {
+ $data = implode("", $this->zdata);
+ $cdir = implode("", $this->cdir);
+
+ return $data
+ .$cdir
+ ."\x50\x4b\x05\x06\x00\x00\x00\x00"
+ .pack("v", sizeof($this->cdir))
+ .pack("v", sizeof($this->cdir))
+ .pack("V", strlen($cdir))
+ .pack("V", strlen($data))
+ ."\x00\x00";
+ }
+
+}
+// END CLASS
+?> \ No newline at end of file