PclZip::privExtractByRule PHP Метод

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

--------------------------------------------------------------------------------
public privExtractByRule ( &$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options )
    public function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
    {
        $v_result = 1;
        // ----- Magic quotes trick
        $this->privDisableMagicQuotes();
        // ----- Check the path
        if ($p_path == '' || substr($p_path, 0, 1) != '/' && substr($p_path, 0, 3) != '../' && substr($p_path, 1, 2) != ':/') {
            $p_path = './' . $p_path;
        }
        // ----- Reduce the path last (and duplicated) '/'
        if ($p_path != './' && $p_path != '/') {
            // ----- Look for the path end '/'
            while (substr($p_path, -1) == '/') {
                $p_path = substr($p_path, 0, strlen($p_path) - 1);
            }
        }
        // ----- Look for path to remove format (should end by /)
        if ($p_remove_path != '' && substr($p_remove_path, -1) != '/') {
            $p_remove_path .= '/';
        }
        $p_remove_path_size = strlen($p_remove_path);
        // ----- Open the zip file
        if (($v_result = $this->privOpenFd('rb')) != 1) {
            $this->privSwapBackMagicQuotes();
            return $v_result;
        }
        // ----- Read the central directory informations
        $v_central_dir = array();
        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {
            // ----- Close the zip file
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();
            return $v_result;
        }
        // ----- Start at beginning of Central Dir
        $v_pos_entry = $v_central_dir['offset'];
        // ----- Read each entry
        $j_start = 0;
        for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) {
            // ----- Read next Central dir entry
            @rewind($this->zip_fd);
            if (@fseek($this->zip_fd, $v_pos_entry)) {
                // ----- Close the zip file
                $this->privCloseFd();
                $this->privSwapBackMagicQuotes();
                // ----- Error log
                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
                // ----- Return
                return PclZip::errorCode();
            }
            // ----- Read the file header
            $v_header = array();
            if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) {
                // ----- Close the zip file
                $this->privCloseFd();
                $this->privSwapBackMagicQuotes();
                return $v_result;
            }
            // ----- Store the index
            $v_header['index'] = $i;
            // ----- Store the file position
            $v_pos_entry = ftell($this->zip_fd);
            // ----- Look for the specific extract rules
            $v_extract = false;
            // ----- Look for extract by name rule
            if (isset($p_options[PCLZIP_OPT_BY_NAME]) && $p_options[PCLZIP_OPT_BY_NAME] != 0) {
                // ----- Look if the filename is in the list
                for ($j = 0; $j < count($p_options[PCLZIP_OPT_BY_NAME]) && !$v_extract; $j++) {
                    // ----- Look for a directory
                    if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == '/') {
                        // ----- Look if the directory is in the filename path
                        if (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]) && substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                            $v_extract = true;
                        }
                    } elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                        $v_extract = true;
                    }
                }
            } elseif (isset($p_options[PCLZIP_OPT_BY_PREG]) && $p_options[PCLZIP_OPT_BY_PREG] != '') {
                if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
                    $v_extract = true;
                }
            } elseif (isset($p_options[PCLZIP_OPT_BY_INDEX]) && $p_options[PCLZIP_OPT_BY_INDEX] != 0) {
                // ----- Look if the index is in the list
                for ($j = $j_start; $j < count($p_options[PCLZIP_OPT_BY_INDEX]) && !$v_extract; $j++) {
                    if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] && $i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
                        $v_extract = true;
                    }
                    if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
                        $j_start = $j + 1;
                    }
                    if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) {
                        break;
                    }
                }
            } else {
                $v_extract = true;
            }
            // ----- Check compression method
            if ($v_extract && ($v_header['compression'] != 8 && $v_header['compression'] != 0)) {
                $v_header['status'] = 'unsupported_compression';
                // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
                if (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]) && $p_options[PCLZIP_OPT_STOP_ON_ERROR] === true) {
                    $this->privSwapBackMagicQuotes();
                    PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, "Filename '" . $v_header['stored_filename'] . "' is " . 'compressed by an unsupported compression ' . 'method (' . $v_header['compression'] . ') ');
                    return PclZip::errorCode();
                }
            }
            // ----- Check encrypted files
            if ($v_extract && ($v_header['flag'] & 1) == 1) {
                $v_header['status'] = 'unsupported_encryption';
                // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
                if (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]) && $p_options[PCLZIP_OPT_STOP_ON_ERROR] === true) {
                    $this->privSwapBackMagicQuotes();
                    PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'Unsupported encryption for ' . " filename '" . $v_header['stored_filename'] . "'");
                    return PclZip::errorCode();
                }
            }
            // ----- Look for real extraction
            if ($v_extract && $v_header['status'] != 'ok') {
                $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]);
                if ($v_result != 1) {
                    $this->privCloseFd();
                    $this->privSwapBackMagicQuotes();
                    return $v_result;
                }
                $v_extract = false;
            }
            // ----- Look for real extraction
            if ($v_extract) {
                // ----- Go to the file position
                @rewind($this->zip_fd);
                if (@fseek($this->zip_fd, $v_header['offset'])) {
                    // ----- Close the zip file
                    $this->privCloseFd();
                    $this->privSwapBackMagicQuotes();
                    // ----- Error log
                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
                    // ----- Return
                    return PclZip::errorCode();
                }
                // ----- Look for extraction as string
                if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {
                    $v_string = '';
                    // ----- Extracting the file
                    $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);
                    if ($v_result1 < 1) {
                        $this->privCloseFd();
                        $this->privSwapBackMagicQuotes();
                        return $v_result1;
                    }
                    // ----- Get the only interesting attributes
                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) {
                        // ----- Close the zip file
                        $this->privCloseFd();
                        $this->privSwapBackMagicQuotes();
                        return $v_result;
                    }
                    // ----- Set the file content
                    $p_file_list[$v_nb_extracted]['content'] = $v_string;
                    // ----- Next extracted file
                    $v_nb_extracted++;
                    // ----- Look for user callback abort
                    if ($v_result1 == 2) {
                        break;
                    }
                } elseif (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]) && $p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]) {
                    // ----- Extracting the file in standard output
                    $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
                    if ($v_result1 < 1) {
                        $this->privCloseFd();
                        $this->privSwapBackMagicQuotes();
                        return $v_result1;
                    }
                    // ----- Get the only interesting attributes
                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
                        $this->privCloseFd();
                        $this->privSwapBackMagicQuotes();
                        return $v_result;
                    }
                    // ----- Look for user callback abort
                    if ($v_result1 == 2) {
                        break;
                    }
                } else {
                    // ----- Extracting the file
                    $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options);
                    if ($v_result1 < 1) {
                        $this->privCloseFd();
                        $this->privSwapBackMagicQuotes();
                        return $v_result1;
                    }
                    // ----- Get the only interesting attributes
                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
                        // ----- Close the zip file
                        $this->privCloseFd();
                        $this->privSwapBackMagicQuotes();
                        return $v_result;
                    }
                    // ----- Look for user callback abort
                    if ($v_result1 == 2) {
                        break;
                    }
                }
            }
        }
        // ----- Close the zip file
        $this->privCloseFd();
        $this->privSwapBackMagicQuotes();
        // ----- Return
        return $v_result;
    }