You are here

function PclZip::privExtractFileInOutput 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::privExtractFileInOutput()
1 call to PclZip::privExtractFileInOutput()
PclZip::privExtractByRule in vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php

File

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

Class

PclZip

Code

function privExtractFileInOutput(&$p_entry, &$p_options) {
  $v_result = 1;

  // ----- Read the file header
  if (($v_result = $this
    ->privReadFileHeader($v_header)) != 1) {
    return $v_result;
  }

  // ----- Check that the file header is coherent with $p_entry info
  if ($this
    ->privCheckFileHeaders($v_header, $p_entry) != 1) {

    // TBC
  }

  // ----- Look for pre-extract callback
  if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {

    // ----- Generate a local information
    $v_local_header = array();
    $this
      ->privConvertHeader2FileInfo($p_entry, $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_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
    $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
    if ($v_result == 0) {

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

    // ----- Look for abort result
    if ($v_result == 2) {

      // ----- This status is internal and will be changed in 'skipped'
      $p_entry['status'] = "aborted";
      $v_result = PCLZIP_ERR_USER_ABORTED;
    }

    // ----- Update the informations
    // Only some fields can be modified
    $p_entry['filename'] = $v_local_header['filename'];
  }

  // ----- Trace
  // ----- Look if extraction should be done
  if ($p_entry['status'] == 'ok') {

    // ----- Do the extraction (if not a folder)
    if (!(($p_entry['external'] & 0x10) == 0x10)) {

      // ----- Look for not compressed file
      if ($p_entry['compressed_size'] == $p_entry['size']) {

        // ----- Read the file in a buffer (one shot)
        $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);

        // ----- Send the file to the output
        echo $v_buffer;
        unset($v_buffer);
      }
      else {

        // ----- Read the compressed file in a buffer (one shot)
        $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);

        // ----- Decompress the file
        $v_file_content = gzinflate($v_buffer);
        unset($v_buffer);

        // ----- Send the file to the output
        echo $v_file_content;
        unset($v_file_content);
      }
    }
  }

  // ----- Change abort status
  if ($p_entry['status'] == "aborted") {
    $p_entry['status'] = "skipped";
  }
  elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {

    // ----- Generate a local information
    $v_local_header = array();
    $this
      ->privConvertHeader2FileInfo($p_entry, $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_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
    $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);

    // ----- Look for abort result
    if ($v_result == 2) {
      $v_result = PCLZIP_ERR_USER_ABORTED;
    }
  }
  return $v_result;
}