PclZip::privDeleteByRule PHP Method

privDeleteByRule() public method

--------------------------------------------------------------------------------
public privDeleteByRule ( &$p_result_list, &$p_options )
    public function privDeleteByRule(&$p_result_list, &$p_options)
    {
        $v_result = 1;
        $v_list_detail = array();
        // ----- Open the zip file
        if (($v_result = $this->privOpenFd('rb')) != 1) {
            // ----- Return
            return $v_result;
        }
        // ----- Read the central directory informations
        $v_central_dir = array();
        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {
            $this->privCloseFd();
            return $v_result;
        }
        // ----- Go to beginning of File
        @rewind($this->zip_fd);
        // ----- Scan all the files
        // ----- Start at beginning of Central Dir
        $v_pos_entry = $v_central_dir['offset'];
        @rewind($this->zip_fd);
        if (@fseek($this->zip_fd, $v_pos_entry)) {
            // ----- Close the zip file
            $this->privCloseFd();
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
            // ----- Return
            return PclZip::errorCode();
        }
        // ----- Read each entry
        $v_header_list = array();
        $j_start = 0;
        for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) {
            // ----- Read the file header
            $v_header_list[$v_nb_extracted] = array();
            if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) {
                // ----- Close the zip file
                $this->privCloseFd();
                return $v_result;
            }
            // ----- Store the index
            $v_header_list[$v_nb_extracted]['index'] = $i;
            // ----- Look for the specific extract rules
            $v_found = 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_found; $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_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]) && substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                            $v_found = true;
                        } elseif (($v_header_list[$v_nb_extracted]['external'] & 0x10) == 0x10 && $v_header_list[$v_nb_extracted]['stored_filename'] . '/' == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                            $v_found = true;
                        }
                    } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                        $v_found = 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_list[$v_nb_extracted]['stored_filename'])) {
                    $v_found = 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_found; $j++) {
                    if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] && $i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
                        $v_found = 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_found = true;
            }
            // ----- Look for deletion
            if ($v_found) {
                unset($v_header_list[$v_nb_extracted]);
            } else {
                $v_nb_extracted++;
            }
        }
        // ----- Look if something need to be deleted
        if ($v_nb_extracted > 0) {
            // ----- Creates a temporay file
            $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp';
            // ----- Creates a temporary zip archive
            $v_temp_zip = new PclZip($v_zip_temp_name);
            // ----- Open the temporary zip file in write mode
            if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
                $this->privCloseFd();
                // ----- Return
                return $v_result;
            }
            // ----- Look which file need to be kept
            for ($i = 0; $i < count($v_header_list); $i++) {
                // ----- Calculate the position of the header
                @rewind($this->zip_fd);
                if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {
                    // ----- Close the zip file
                    $this->privCloseFd();
                    $v_temp_zip->privCloseFd();
                    @unlink($v_zip_temp_name);
                    // ----- Error log
                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
                    // ----- Return
                    return PclZip::errorCode();
                }
                // ----- Read the file header
                $v_local_header = array();
                if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
                    // ----- Close the zip file
                    $this->privCloseFd();
                    $v_temp_zip->privCloseFd();
                    @unlink($v_zip_temp_name);
                    // ----- Return
                    return $v_result;
                }
                // ----- Check that local file header is same as central file header
                if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) {
                    // TBC
                }
                unset($v_local_header);
                // ----- Write the file header
                if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
                    // ----- Close the zip file
                    $this->privCloseFd();
                    $v_temp_zip->privCloseFd();
                    @unlink($v_zip_temp_name);
                    // ----- Return
                    return $v_result;
                }
                // ----- Read/write the data block
                if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
                    // ----- Close the zip file
                    $this->privCloseFd();
                    $v_temp_zip->privCloseFd();
                    @unlink($v_zip_temp_name);
                    // ----- Return
                    return $v_result;
                }
            }
            // ----- Store the offset of the central dir
            $v_offset = @ftell($v_temp_zip->zip_fd);
            // ----- Re-Create the Central Dir files header
            for ($i = 0; $i < count($v_header_list); $i++) {
                // ----- Create the file header
                if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
                    $v_temp_zip->privCloseFd();
                    $this->privCloseFd();
                    @unlink($v_zip_temp_name);
                    // ----- Return
                    return $v_result;
                }
                // ----- Transform the header to a 'usable' info
                $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
            }
            // ----- Zip file comment
            $v_comment = '';
            if (isset($p_options[PCLZIP_OPT_COMMENT])) {
                $v_comment = $p_options[PCLZIP_OPT_COMMENT];
            }
            // ----- Calculate the size of the central header
            $v_size = @ftell($v_temp_zip->zip_fd) - $v_offset;
            // ----- Create the central dir footer
            if (($v_result = $v_temp_zip->privWriteCentralHeader(count($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
                // ----- Reset the file list
                unset($v_header_list);
                $v_temp_zip->privCloseFd();
                $this->privCloseFd();
                @unlink($v_zip_temp_name);
                // ----- Return
                return $v_result;
            }
            // ----- Close
            $v_temp_zip->privCloseFd();
            $this->privCloseFd();
            // ----- Delete the zip file
            // TBC : I should test the result ...
            @unlink($this->zipname);
            // ----- Rename the temporary file
            // TBC : I should test the result ...
            //@rename($v_zip_temp_name, $this->zipname);
            PclZipUtilRename($v_zip_temp_name, $this->zipname);
            // ----- Destroy the temporary archive
            unset($v_temp_zip);
        } elseif ($v_central_dir['entries'] != 0) {
            $this->privCloseFd();
            if (($v_result = $this->privOpenFd('wb')) != 1) {
                return $v_result;
            }
            if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
                return $v_result;
            }
            $this->privCloseFd();
        }
        // ----- Return
        return $v_result;
    }