protected function _add_data($filepath, $data, $file_mtime, $file_mdate)
{
$filepath = str_replace('\\', '/', $filepath);
$uncompressed_size = strlen($data);
$crc32 = crc32($data);
$gzdata = substr(gzcompress($data, $this->compression_level), 2, -4);
$compressed_size = strlen($gzdata);
$this->zipdata .= "PK" . pack('v', $file_mtime) . pack('v', $file_mdate) . pack('V', $crc32) . pack('V', $compressed_size) . pack('V', $uncompressed_size) . pack('v', strlen($filepath)) . pack('v', 0) . $filepath . $gzdata;
// "file data" segment
$this->directory .= "PK" . pack('v', $file_mtime) . pack('v', $file_mdate) . pack('V', $crc32) . pack('V', $compressed_size) . pack('V', $uncompressed_size) . pack('v', strlen($filepath)) . pack('v', 0) . pack('v', 0) . pack('v', 0) . pack('v', 0) . pack('V', 32) . pack('V', $this->offset) . $filepath;
$this->offset = strlen($this->zipdata);
$this->entries++;
$this->file_num++;
}