openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

ArchiveZip.class.php (1850B)


      1 <?php
      2 
      3 
      4 namespace util;
      5 /**
      6  * This source is taken from http://www.zend.com/zend/spotlight/creating-zip-files1.php
      7  * Thank you!
      8  */
      9 class ArchiveZip
     10 {
     11 	var $datasec = array();
     12 	var $ctrl_dir = array();
     13 	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
     14 	var $old_offset = 0;
     15 
     16 
     17 	function add_file($data, $name)
     18 	{
     19 		$name = str_replace("\\", "/", $name);
     20 		$unc_len = strlen($data);
     21 		$crc = crc32($data);
     22 		$zdata = gzcompress($data);
     23 		$zdate = substr($zdata, 2, -4);
     24 		$c_len = strlen($zdata);
     25 
     26 
     27 		$fr = "\x50\x4b\x03\x04";
     28 		$fr .= "\x14\x00";
     29 		$fr .= "\x00\x00";
     30 		$fr .= "\x08\x00";
     31 		$fr .= "\x00\x00\x00\x00";
     32 		$fr .= pack("V", $crc);
     33 		$fr .= pack("V", $c_len);
     34 		$fr .= pack("V", $unc_len);
     35 		$fr .= pack("v", strlen($name));
     36 		$fr .= pack("v", 0);
     37 		$fr .= $name;
     38 		$fr .= $zdata;
     39 		$fr .= pack("V", $crc);
     40 		$fr .= pack("V", $c_len);
     41 		$fr .= pack("V", $unc_len);
     42 
     43 		$this->datasec[] = $fr;
     44 
     45 
     46 		$new_offset = strlen(implode("", $this->datasec));
     47 
     48 		$cdrec = "\x50\x4b\x01\x02";
     49 		$cdrec .= "\x00\x00";
     50 		$cdrec .= "\x14\x00";
     51 		$cdrec .= "\x00\x00";
     52 		$cdrec .= "\x08\x00";
     53 		$cdrec .= "\x00\x00\x00\x00";
     54 		$cdrec .= pack("V", $crc);
     55 		$cdrec .= pack("V", $c_len);
     56 		$cdrec .= pack("V", $unc_len);
     57 		$cdrec .= pack("v", strlen($name));
     58 		$cdrec .= pack("v", 0);
     59 		$cdrec .= pack("v", 0);
     60 		$cdrec .= pack("v", 0);
     61 		$cdrec .= pack("v", 0);
     62 		$cdrec .= pack("V", 32);
     63 		$cdrec .= pack("V", $this->old_offset);
     64 
     65 		$this->old_offset = $new_offset;
     66 
     67 		$cdrec .= $name;
     68 		$this->ctrl_dir[] = $cdrec;
     69 	}
     70 
     71 
     72 	function file()
     73 	{
     74 		$data = implode("", $this->datasec);
     75 		$ctrldir = implode("", $this->ctrl_dir);
     76 
     77 		return
     78 			$data .
     79 			$ctrldir .
     80 			$this->eof_ctrl_dir .
     81 			pack("v", sizeof($this->ctrl_dir)) .
     82 			pack("v", sizeof($this->ctrl_dir)) .
     83 			pack("V", strlen($ctrldir)) .
     84 			pack("V", strlen($data)) .
     85 			"\x00\x00";
     86 	}
     87 }
     88 
     89 ?>