You are here

function PclZip::privAddFile in Loft Data Grids 7.2

Same name and namespace in other branches
  1. 6.2 vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php \PclZip::privAddFile()
1 call to PclZip::privAddFile()
PclZip::privAddFileList in vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php

File

vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php, line 2525

Class

PclZip

Code

function privAddFile($p_filedescr, &$p_header, &$p_options) {
  $v_result = 1;

  // ----- Working variable
  $p_filename = $p_filedescr['filename'];

  // TBC : Already done in the fileAtt check ... ?
  if ($p_filename == "") {

    // ----- Error log
    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");

    // ----- Return
    return PclZip::errorCode();
  }

  // ----- Look for a stored different filename

  /* TBC : Removed
     if (isset($p_filedescr['stored_filename'])) {
       $v_stored_filename = $p_filedescr['stored_filename'];
     }
     else {
       $v_stored_filename = $p_filedescr['stored_filename'];
     }
     */

  // ----- Set the file properties
  clearstatcache();
  $p_header['version'] = 20;
  $p_header['version_extracted'] = 10;
  $p_header['flag'] = 0;
  $p_header['compression'] = 0;
  $p_header['crc'] = 0;
  $p_header['compressed_size'] = 0;
  $p_header['filename_len'] = strlen($p_filename);
  $p_header['extra_len'] = 0;
  $p_header['disk'] = 0;
  $p_header['internal'] = 0;
  $p_header['offset'] = 0;
  $p_header['filename'] = $p_filename;

  // TBC : Removed    $p_header['stored_filename'] = $v_stored_filename;
  $p_header['stored_filename'] = $p_filedescr['stored_filename'];
  $p_header['extra'] = '';
  $p_header['status'] = 'ok';
  $p_header['index'] = -1;

  // ----- Look for regular file
  if ($p_filedescr['type'] == 'file') {
    $p_header['external'] = 0x0;
    $p_header['size'] = filesize($p_filename);
  }
  else {
    if ($p_filedescr['type'] == 'folder') {
      $p_header['external'] = 0x10;
      $p_header['mtime'] = filemtime($p_filename);
      $p_header['size'] = filesize($p_filename);
    }
    else {
      if ($p_filedescr['type'] == 'virtual_file') {
        $p_header['external'] = 0x0;
        $p_header['size'] = strlen($p_filedescr['content']);
      }
    }
  }

  // ----- Look for filetime
  if (isset($p_filedescr['mtime'])) {
    $p_header['mtime'] = $p_filedescr['mtime'];
  }
  else {
    if ($p_filedescr['type'] == 'virtual_file') {
      $p_header['mtime'] = time();
    }
    else {
      $p_header['mtime'] = filemtime($p_filename);
    }
  }

  // ------ Look for file comment
  if (isset($p_filedescr['comment'])) {
    $p_header['comment_len'] = strlen($p_filedescr['comment']);
    $p_header['comment'] = $p_filedescr['comment'];
  }
  else {
    $p_header['comment_len'] = 0;
    $p_header['comment'] = '';
  }

  // ----- Look for pre-add callback
  if (isset($p_options[PCLZIP_CB_PRE_ADD])) {

    // ----- Generate a local information
    $v_local_header = array();
    $this
      ->privConvertHeader2FileInfo($p_header, $v_local_header);

    // ----- Call the callback
    // Here I do not use call_user_func() because I need to send a reference to the
    // header.
    //      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');
    $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);
    if ($v_result == 0) {

      // ----- Change the file status
      $p_header['status'] = "skipped";
      $v_result = 1;
    }

    // ----- Update the informations
    // Only some fields can be modified
    if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
      $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
    }
  }

  // ----- Look for empty stored filename
  if ($p_header['stored_filename'] == "") {
    $p_header['status'] = "filtered";
  }

  // ----- Check the path length
  if (strlen($p_header['stored_filename']) > 0xff) {
    $p_header['status'] = 'filename_too_long';
  }

  // ----- Look if no error, or file not skipped
  if ($p_header['status'] == 'ok') {

    // ----- Look for a file
    if ($p_filedescr['type'] == 'file') {

      // ----- Look for using temporary file to zip
      if (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) {
        $v_result = $this
          ->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);
        if ($v_result < PCLZIP_ERR_NO_ERROR) {
          return $v_result;
        }
      }
      else {

        // ----- Open the source file
        if (($v_file = @fopen($p_filename, "rb")) == 0) {
          PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '{$p_filename}' in binary read mode");
          return PclZip::errorCode();
        }

        // ----- Read the file content
        $v_content = @fread($v_file, $p_header['size']);

        // ----- Close the file
        @fclose($v_file);

        // ----- Calculate the CRC
        $p_header['crc'] = @crc32($v_content);

        // ----- Look for no compression
        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {

          // ----- Set header parameters
          $p_header['compressed_size'] = $p_header['size'];
          $p_header['compression'] = 0;
        }
        else {

          // ----- Compress the content
          $v_content = @gzdeflate($v_content);

          // ----- Set header parameters
          $p_header['compressed_size'] = strlen($v_content);
          $p_header['compression'] = 8;
        }

        // ----- Call the header generation
        if (($v_result = $this
          ->privWriteFileHeader($p_header)) != 1) {
          @fclose($v_file);
          return $v_result;
        }

        // ----- Write the compressed (or not) content
        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
      }
    }
    else {
      if ($p_filedescr['type'] == 'virtual_file') {
        $v_content = $p_filedescr['content'];

        // ----- Calculate the CRC
        $p_header['crc'] = @crc32($v_content);

        // ----- Look for no compression
        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {

          // ----- Set header parameters
          $p_header['compressed_size'] = $p_header['size'];
          $p_header['compression'] = 0;
        }
        else {

          // ----- Compress the content
          $v_content = @gzdeflate($v_content);

          // ----- Set header parameters
          $p_header['compressed_size'] = strlen($v_content);
          $p_header['compression'] = 8;
        }

        // ----- Call the header generation
        if (($v_result = $this
          ->privWriteFileHeader($p_header)) != 1) {
          @fclose($v_file);
          return $v_result;
        }

        // ----- Write the compressed (or not) content
        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
      }
      else {
        if ($p_filedescr['type'] == 'folder') {

          // ----- Look for directory last '/'
          if (@substr($p_header['stored_filename'], -1) != '/') {
            $p_header['stored_filename'] .= '/';
          }

          // ----- Set the file properties
          $p_header['size'] = 0;

          //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
          $p_header['external'] = 0x10;

          // Value for a folder : to be checked
          // ----- Call the header generation
          if (($v_result = $this
            ->privWriteFileHeader($p_header)) != 1) {
            return $v_result;
          }
        }
      }
    }
  }

  // ----- Look for post-add callback
  if (isset($p_options[PCLZIP_CB_POST_ADD])) {

    // ----- Generate a local information
    $v_local_header = array();
    $this
      ->privConvertHeader2FileInfo($p_header, $v_local_header);

    // ----- Call the callback
    // Here I do not use call_user_func() because I need to send a reference to the
    // header.
    //      eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');
    $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);
    if ($v_result == 0) {

      // ----- Ignored
      $v_result = 1;
    }

    // ----- Update the informations
    // Nothing can be modified
  }

  // ----- Return
  return $v_result;
}