You are here

function apachesolr_confgen_zipfile::addFile in Apache Solr Config Generator 7

Same name and namespace in other branches
  1. 8 lib/apachesolr_confgen_zipfile.php \apachesolr_confgen_zipfile::addFile()
  2. 6 lib/apachesolr_confgen_zipfile.php \apachesolr_confgen_zipfile::addFile()

Adds "file" to archive

@access public

Parameters

string file contents:

string name of the file in the archive (may contains the path):

integer the current timestamp:

1 call to apachesolr_confgen_zipfile::addFile()
apachesolr_confgen_zipfile::addFiles in lib/apachesolr_confgen_zipfile.php
A Wrapper of original addFile Function

File

lib/apachesolr_confgen_zipfile.php, line 163
Zip file creation class to pack Apache Solr configuration files

Class

apachesolr_confgen_zipfile
Zip file creation class. Makes zip files.

Code

function addFile($data, $name, $time = 0) {
  $name = str_replace('\\', '/', $name);
  $dtime = dechex($this
    ->unix2DosTime($time));
  $hexdtime = '\\x' . $dtime[6] . $dtime[7] . '\\x' . $dtime[4] . $dtime[5] . '\\x' . $dtime[2] . $dtime[3] . '\\x' . $dtime[0] . $dtime[1];
  eval('$hexdtime = "' . $hexdtime . '";');
  $fr = "PK\3\4";
  $fr .= "\24\0";

  // ver needed to extract
  $fr .= "\0\0";

  // gen purpose bit flag
  $fr .= "\10\0";

  // compression method
  $fr .= $hexdtime;

  // last mod time and date
  // "local file header" segment
  $unc_len = strlen($data);
  $crc = crc32($data);
  $zdata = gzcompress($data);
  $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);

  // fix crc bug
  $c_len = strlen($zdata);
  $fr .= pack('V', $crc);

  // crc32
  $fr .= pack('V', $c_len);

  // compressed filesize
  $fr .= pack('V', $unc_len);

  // uncompressed filesize
  $fr .= pack('v', strlen($name));

  // length of filename
  $fr .= pack('v', 0);

  // extra field length
  $fr .= $name;

  // "file data" segment
  $fr .= $zdata;

  // "data descriptor" segment (optional but necessary if archive is not
  // served as file)
  $fr .= pack('V', $crc);

  // crc32
  $fr .= pack('V', $c_len);

  // compressed filesize
  $fr .= pack('V', $unc_len);

  // uncompressed filesize
  // add this entry to array
  $this->datasec[] = $fr;

  // now add to central directory record
  $cdrec = "PK\1\2";
  $cdrec .= "\0\0";

  // version made by
  $cdrec .= "\24\0";

  // version needed to extract
  $cdrec .= "\0\0";

  // gen purpose bit flag
  $cdrec .= "\10\0";

  // 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
  $cdrec .= pack('v', 0);

  // disk number start
  $cdrec .= pack('v', 0);

  // internal file attributes
  $cdrec .= pack('V', 32);

  // external file attributes - 'archive' bit set
  $cdrec .= pack('V', $this->old_offset);

  // relative offset of local header
  $this->old_offset += strlen($fr);
  $cdrec .= $name;

  // optional extra field, file comment goes here
  // save to central directory
  $this->ctrl_dir[] = $cdrec;
}