PclZip::privExtractFileInOutput PHP Метод

privExtractFileInOutput() публичный Метод

--------------------------------------------------------------------------------
public privExtractFileInOutput ( &$p_entry, &$p_options )
    public 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;
    }