blob: 1fd0e70596460ce319ecc76a5a7468d709038e99 [file] [log] [blame]
<?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, and the
* directory feature doesn't seem to work right, 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
?>