PclZip::privAddFile PHP Method

privAddFile() public method

--------------------------------------------------------------------------------
public privAddFile ( $p_filedescr, &$p_header, &$p_options )
    public 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);
        } elseif ($p_filedescr['type'] == 'folder') {
            $p_header['external'] = 0x10;
            $p_header['mtime'] = filemtime($p_filename);
            $p_header['size'] = filesize($p_filename);
        } elseif ($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'];
        } elseif ($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']);
                }
            } elseif ($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']);
            } elseif ($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;
    }