public function Analyze()
 {
     $info =& $this->getid3->info;
     $info['fileformat'] = 'rar';
     if ($this->option_use_rar_extension === true) {
         if (function_exists('rar_open')) {
             if ($rp = rar_open($info['filenamepath'])) {
                 $info['rar']['files'] = array();
                 $entries = rar_list($rp);
                 foreach ($entries as $entry) {
                     $info['rar']['files'] = getid3_lib::array_merge_clobber($info['rar']['files'], getid3_lib::CreateDeepArray($entry->getName(), '/', $entry->getUnpackedSize()));
                 }
                 rar_close($rp);
                 return true;
             } else {
                 $info['error'][] = 'failed to rar_open(' . $info['filename'] . ')';
             }
         } else {
             $info['error'][] = 'RAR support does not appear to be available in this PHP installation';
         }
     } else {
         $info['error'][] = 'PHP-RAR processing has been disabled (set $getid3_rar->option_use_rar_extension=true to enable)';
     }
     return false;
 }
예제 #2
0
 static function array_merge_clobber($array1, $array2)
 {
     // written by kcØhireability*com
     // taken from http://www.php.net/manual/en/function.array-merge-recursive.php
     if (!is_array($array1) || !is_array($array2)) {
         return false;
     }
     $newarray = $array1;
     foreach ($array2 as $key => $val) {
         if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) {
             $newarray[$key] = getid3_lib::array_merge_clobber($newarray[$key], $val);
         } else {
             $newarray[$key] = $val;
         }
     }
     return $newarray;
 }
예제 #3
0
 function ParseDirectoryRecord(&$fd, $directorydata, &$ThisFileInfo)
 {
     if (isset($ThisFileInfo['iso']['supplementary_volume_descriptor'])) {
         $TextEncoding = 'UTF-16BE';
         // Big-Endian Unicode
     } else {
         $TextEncoding = 'ISO-8859-1';
         // Latin-1
     }
     fseek($fd, $directorydata['location_bytes'], SEEK_SET);
     $DirectoryRecordData = fread($fd, 1);
     while (ord($DirectoryRecordData[0]) > 33) {
         $DirectoryRecordData .= fread($fd, ord($DirectoryRecordData[0]) - 1);
         $ThisDirectoryRecord['raw']['length'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 0, 1));
         $ThisDirectoryRecord['raw']['extended_attribute_length'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 1, 1));
         $ThisDirectoryRecord['raw']['offset_logical'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 2, 4));
         $ThisDirectoryRecord['raw']['filesize'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 10, 4));
         $ThisDirectoryRecord['raw']['recording_date_time'] = substr($DirectoryRecordData, 18, 7);
         $ThisDirectoryRecord['raw']['file_flags'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 25, 1));
         $ThisDirectoryRecord['raw']['file_unit_size'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 26, 1));
         $ThisDirectoryRecord['raw']['interleave_gap_size'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 27, 1));
         $ThisDirectoryRecord['raw']['volume_sequence_number'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 28, 2));
         $ThisDirectoryRecord['raw']['file_identifier_length'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 32, 1));
         $ThisDirectoryRecord['raw']['file_identifier'] = substr($DirectoryRecordData, 33, $ThisDirectoryRecord['raw']['file_identifier_length']);
         $ThisDirectoryRecord['file_identifier_ascii'] = getid3_lib::iconv_fallback($TextEncoding, $ThisFileInfo['encoding'], $ThisDirectoryRecord['raw']['file_identifier']);
         $ThisDirectoryRecord['filesize'] = $ThisDirectoryRecord['raw']['filesize'];
         $ThisDirectoryRecord['offset_bytes'] = $ThisDirectoryRecord['raw']['offset_logical'] * 2048;
         $ThisDirectoryRecord['file_flags']['hidden'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x1);
         $ThisDirectoryRecord['file_flags']['directory'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x2);
         $ThisDirectoryRecord['file_flags']['associated'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x4);
         $ThisDirectoryRecord['file_flags']['extended'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x8);
         $ThisDirectoryRecord['file_flags']['permissions'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x10);
         $ThisDirectoryRecord['file_flags']['multiple'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x80);
         $ThisDirectoryRecord['recording_timestamp'] = $this->ISOtime2UNIXtime($ThisDirectoryRecord['raw']['recording_date_time']);
         if ($ThisDirectoryRecord['file_flags']['directory']) {
             $ThisDirectoryRecord['filename'] = $directorydata['full_path'];
         } else {
             $ThisDirectoryRecord['filename'] = $directorydata['full_path'] . $this->ISOstripFilenameVersion($ThisDirectoryRecord['file_identifier_ascii']);
             $ThisFileInfo['iso']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['iso']['files'], getid3_lib::CreateDeepArray($ThisDirectoryRecord['filename'], '/', $ThisDirectoryRecord['filesize']));
         }
         $DirectoryRecord[] = $ThisDirectoryRecord;
         $DirectoryRecordData = fread($fd, 1);
     }
     return $DirectoryRecord;
 }
예제 #4
0
 function getid3_zip(&$fd, &$ThisFileInfo)
 {
     $ThisFileInfo['fileformat'] = 'zip';
     $ThisFileInfo['zip']['encoding'] = 'ISO-8859-1';
     $ThisFileInfo['zip']['files'] = array();
     $ThisFileInfo['zip']['compressed_size'] = 0;
     $ThisFileInfo['zip']['uncompressed_size'] = 0;
     $ThisFileInfo['zip']['entries_count'] = 0;
     if ($ThisFileInfo['filesize'] < pow(2, 31)) {
         $EOCDsearchData = '';
         $EOCDsearchCounter = 0;
         while ($EOCDsearchCounter++ < 512) {
             fseek($fd, -128 * $EOCDsearchCounter, SEEK_END);
             $EOCDsearchData = fread($fd, 128) . $EOCDsearchData;
             if (strstr($EOCDsearchData, 'PK' . "")) {
                 $EOCDposition = strpos($EOCDsearchData, 'PK' . "");
                 fseek($fd, -128 * $EOCDsearchCounter + $EOCDposition, SEEK_END);
                 $ThisFileInfo['zip']['end_central_directory'] = $this->ZIPparseEndOfCentralDirectory($fd);
                 fseek($fd, $ThisFileInfo['zip']['end_central_directory']['directory_offset'], SEEK_SET);
                 $ThisFileInfo['zip']['entries_count'] = 0;
                 while ($centraldirectoryentry = $this->ZIPparseCentralDirectory($fd)) {
                     $ThisFileInfo['zip']['central_directory'][] = $centraldirectoryentry;
                     $ThisFileInfo['zip']['entries_count']++;
                     $ThisFileInfo['zip']['compressed_size'] += $centraldirectoryentry['compressed_size'];
                     $ThisFileInfo['zip']['uncompressed_size'] += $centraldirectoryentry['uncompressed_size'];
                     if ($centraldirectoryentry['uncompressed_size'] > 0) {
                         $ThisFileInfo['zip']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['zip']['files'], getid3_lib::CreateDeepArray($centraldirectoryentry['filename'], '/', $centraldirectoryentry['uncompressed_size']));
                     }
                 }
                 if ($ThisFileInfo['zip']['entries_count'] == 0) {
                     $ThisFileInfo['error'][] = 'No Central Directory entries found (truncated file?)';
                     return false;
                 }
                 if (!empty($ThisFileInfo['zip']['end_central_directory']['comment'])) {
                     $ThisFileInfo['zip']['comments']['comment'][] = $ThisFileInfo['zip']['end_central_directory']['comment'];
                 }
                 if (isset($ThisFileInfo['zip']['central_directory'][0]['compression_method'])) {
                     $ThisFileInfo['zip']['compression_method'] = $ThisFileInfo['zip']['central_directory'][0]['compression_method'];
                 }
                 if (isset($ThisFileInfo['zip']['central_directory'][0]['flags']['compression_speed'])) {
                     $ThisFileInfo['zip']['compression_speed'] = $ThisFileInfo['zip']['central_directory'][0]['flags']['compression_speed'];
                 }
                 if (isset($ThisFileInfo['zip']['compression_method']) && $ThisFileInfo['zip']['compression_method'] == 'store' && !isset($ThisFileInfo['zip']['compression_speed'])) {
                     $ThisFileInfo['zip']['compression_speed'] = 'store';
                 }
                 return true;
             }
         }
     }
     if ($this->getZIPentriesFilepointer($fd, $ThisFileInfo)) {
         // central directory couldn't be found and/or parsed
         // scan through actual file data entries, recover as much as possible from probable trucated file
         if ($ThisFileInfo['zip']['compressed_size'] > $ThisFileInfo['filesize'] - 46 - 22) {
             $ThisFileInfo['error'][] = 'Warning: Truncated file! - Total compressed file sizes (' . $ThisFileInfo['zip']['compressed_size'] . ' bytes) is greater than filesize minus Central Directory and End Of Central Directory structures (' . ($ThisFileInfo['filesize'] - 46 - 22) . ' bytes)';
         }
         $ThisFileInfo['error'][] = 'Cannot find End Of Central Directory - returned list of files in [zip][entries] array may not be complete';
         foreach ($ThisFileInfo['zip']['entries'] as $key => $valuearray) {
             $ThisFileInfo['zip']['files'][$valuearray['filename']] = $valuearray['uncompressed_size'];
         }
         return true;
     } else {
         unset($ThisFileInfo['zip']);
         $ThisFileInfo['fileformat'] = '';
         $ThisFileInfo['error'][] = 'Cannot find End Of Central Directory (truncated file?)';
         return false;
     }
 }
 function getid3_tar(&$fd, &$ThisFileInfo)
 {
     $ThisFileInfo['fileformat'] = 'tar';
     $ThisFileInfo['tar']['files'] = array();
     $unpack_header = 'a100fname/a8mode/a8uid/a8gid/a12size/a12mtime/a8chksum/a1typflag/a100lnkname/a6magic/a2ver/a32uname/a32gname/a8devmaj/a8devmin/a155/prefix';
     $null_512k = str_repeat("", 512);
     // end-of-file marker
     @fseek($fd, 0);
     while (!feof($fd)) {
         $buffer = fread($fd, 512);
         // check the block
         $checksum = 0;
         for ($i = 0; $i < 148; $i++) {
             $checksum += ord($buffer[$i]);
         }
         for ($i = 148; $i < 156; $i++) {
             $checksum += ord(' ');
         }
         for ($i = 156; $i < 512; $i++) {
             $checksum += ord($buffer[$i]);
         }
         $attr = unpack($unpack_header, $buffer);
         $name = trim(@$attr['fname']);
         $mode = octdec(trim(@$attr['mode']));
         $uid = octdec(trim(@$attr['uid']));
         $gid = octdec(trim(@$attr['gid']));
         $size = octdec(trim(@$attr['size']));
         $mtime = octdec(trim(@$attr['mtime']));
         $chksum = octdec(trim(@$attr['chksum']));
         $typflag = trim(@$attr['typflag']);
         $lnkname = trim(@$attr['lnkname']);
         $magic = trim(@$attr['magic']);
         $ver = trim(@$attr['ver']);
         $uname = trim(@$attr['uname']);
         $gname = trim(@$attr['gname']);
         $devmaj = octdec(trim(@$attr['devmaj']));
         $devmin = octdec(trim(@$attr['devmin']));
         $prefix = trim(@$attr['prefix']);
         if ($checksum == 256 && $chksum == 0) {
             // EOF Found
             break;
         }
         if ($prefix) {
             $name = $prefix . '/' . $name;
         }
         if (preg_match('#/$#', $name) && !$name) {
             $typeflag = 5;
         }
         if ($buffer == $null_512k) {
             // it's the end of the tar-file...
             break;
         }
         // Read to the next chunk
         fseek($fd, $size, SEEK_CUR);
         $diff = $size % 512;
         if ($diff != 0) {
             // Padding, throw away
             fseek($fd, 512 - $diff, SEEK_CUR);
         }
         // Protect against tar-files with garbage at the end
         if ($name == '') {
             break;
         }
         $ThisFileInfo['tar']['file_details'][$name] = array('name' => $name, 'mode_raw' => $mode, 'mode' => getid3_tar::display_perms($mode), 'uid' => $uid, 'gid' => $gid, 'size' => $size, 'mtime' => $mtime, 'chksum' => $chksum, 'typeflag' => getid3_tar::get_flag_type($typflag), 'linkname' => $lnkname, 'magic' => $magic, 'version' => $ver, 'uname' => $uname, 'gname' => $gname, 'devmajor' => $devmaj, 'devminor' => $devmin);
         $ThisFileInfo['tar']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['tar']['files'], getid3_lib::CreateDeepArray($ThisFileInfo['tar']['file_details'][$name]['name'], '/', $size));
     }
     return true;
 }
예제 #6
0
 public function Analyze()
 {
     $info =& $this->getid3->info;
     $info['fileformat'] = 'zip';
     $info['zip']['encoding'] = 'ISO-8859-1';
     $info['zip']['files'] = array();
     $info['zip']['compressed_size'] = 0;
     $info['zip']['uncompressed_size'] = 0;
     $info['zip']['entries_count'] = 0;
     if (!getid3_lib::intValueSupported($info['filesize'])) {
         $info['error'][] = 'File is larger than ' . round(PHP_INT_MAX / 1073741824) . 'GB, not supported by PHP';
         return false;
     } else {
         $EOCDsearchData = '';
         $EOCDsearchCounter = 0;
         while ($EOCDsearchCounter++ < 512) {
             $this->fseek(-128 * $EOCDsearchCounter, SEEK_END);
             $EOCDsearchData = $this->fread(128) . $EOCDsearchData;
             if (strstr($EOCDsearchData, 'PK' . "")) {
                 $EOCDposition = strpos($EOCDsearchData, 'PK' . "");
                 $this->fseek(-128 * $EOCDsearchCounter + $EOCDposition, SEEK_END);
                 $info['zip']['end_central_directory'] = $this->ZIPparseEndOfCentralDirectory();
                 $this->fseek($info['zip']['end_central_directory']['directory_offset']);
                 $info['zip']['entries_count'] = 0;
                 while ($centraldirectoryentry = $this->ZIPparseCentralDirectory($this->getid3->fp)) {
                     $info['zip']['central_directory'][] = $centraldirectoryentry;
                     $info['zip']['entries_count']++;
                     $info['zip']['compressed_size'] += $centraldirectoryentry['compressed_size'];
                     $info['zip']['uncompressed_size'] += $centraldirectoryentry['uncompressed_size'];
                     //if ($centraldirectoryentry['uncompressed_size'] > 0) { zero-byte files are valid
                     if (!empty($centraldirectoryentry['filename'])) {
                         $info['zip']['files'] = getid3_lib::array_merge_clobber($info['zip']['files'], getid3_lib::CreateDeepArray($centraldirectoryentry['filename'], '/', $centraldirectoryentry['uncompressed_size']));
                     }
                 }
                 if ($info['zip']['entries_count'] == 0) {
                     $info['error'][] = 'No Central Directory entries found (truncated file?)';
                     return false;
                 }
                 if (!empty($info['zip']['end_central_directory']['comment'])) {
                     $info['zip']['comments']['comment'][] = $info['zip']['end_central_directory']['comment'];
                 }
                 if (isset($info['zip']['central_directory'][0]['compression_method'])) {
                     $info['zip']['compression_method'] = $info['zip']['central_directory'][0]['compression_method'];
                 }
                 if (isset($info['zip']['central_directory'][0]['flags']['compression_speed'])) {
                     $info['zip']['compression_speed'] = $info['zip']['central_directory'][0]['flags']['compression_speed'];
                 }
                 if (isset($info['zip']['compression_method']) && $info['zip']['compression_method'] == 'store' && !isset($info['zip']['compression_speed'])) {
                     $info['zip']['compression_speed'] = 'store';
                 }
                 // secondary check - we (should) already have all the info we NEED from the Central Directory above, but scanning each
                 // Local File Header entry will
                 foreach ($info['zip']['central_directory'] as $central_directory_entry) {
                     $this->fseek($central_directory_entry['entry_offset']);
                     if ($fileentry = $this->ZIPparseLocalFileHeader()) {
                         $info['zip']['entries'][] = $fileentry;
                     } else {
                         $info['warning'][] = 'Error parsing Local File Header at offset ' . $central_directory_entry['entry_offset'];
                     }
                 }
                 if (!empty($info['zip']['files']['[Content_Types].xml']) && !empty($info['zip']['files']['_rels']['.rels']) && !empty($info['zip']['files']['docProps']['app.xml']) && !empty($info['zip']['files']['docProps']['core.xml'])) {
                     // http://technet.microsoft.com/en-us/library/cc179224.aspx
                     $info['fileformat'] = 'zip.msoffice';
                     if (!empty($ThisFileInfo['zip']['files']['ppt'])) {
                         $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
                     } elseif (!empty($ThisFileInfo['zip']['files']['xl'])) {
                         $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                     } elseif (!empty($ThisFileInfo['zip']['files']['word'])) {
                         $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
                     }
                 }
                 return true;
             }
         }
     }
     if (!$this->getZIPentriesFilepointer()) {
         unset($info['zip']);
         $info['fileformat'] = '';
         $info['error'][] = 'Cannot find End Of Central Directory (truncated file?)';
         return false;
     }
     // central directory couldn't be found and/or parsed
     // scan through actual file data entries, recover as much as possible from probable trucated file
     if ($info['zip']['compressed_size'] > $info['filesize'] - 46 - 22) {
         $info['error'][] = 'Warning: Truncated file! - Total compressed file sizes (' . $info['zip']['compressed_size'] . ' bytes) is greater than filesize minus Central Directory and End Of Central Directory structures (' . ($info['filesize'] - 46 - 22) . ' bytes)';
     }
     $info['error'][] = 'Cannot find End Of Central Directory - returned list of files in [zip][entries] array may not be complete';
     foreach ($info['zip']['entries'] as $key => $valuearray) {
         $info['zip']['files'][$valuearray['filename']] = $valuearray['uncompressed_size'];
     }
     return true;
 }
 function read_gzip($fd, &$ThisFileInfo)
 {
     $start_length = 10;
     $unpack_header = 'a1id1/a1id2/a1cmethod/a1flags/a4mtime/a1xflags/a1os';
     //+---+---+---+---+---+---+---+---+---+---+
     //|ID1|ID2|CM |FLG|     MTIME     |XFL|OS |
     //+---+---+---+---+---+---+---+---+---+---+
     @fseek($fd, 0);
     $buffer = @fread($fd, $ThisFileInfo['filesize']);
     $arr_members = explode("‹", $buffer);
     while (true) {
         $is_wrong_members = false;
         $num_members = intval(count($arr_members));
         for ($i = 0; $i < $num_members; $i++) {
             if (strlen($arr_members[$i]) == 0) {
                 continue;
             }
             $buf = "‹" . $arr_members[$i];
             $attr = unpack($unpack_header, substr($buf, 0, $start_length));
             if (!$this->get_os_type(ord($attr['os']))) {
                 // Merge member with previous if wrong OS type
                 $arr_members[$i - 1] .= $buf;
                 $arr_members[$i] = '';
                 $is_wrong_members = true;
                 continue;
             }
         }
         if (!$is_wrong_members) {
             break;
         }
     }
     $ThisFileInfo['gzip']['files'] = array();
     $fpointer = 0;
     $idx = 0;
     for ($i = 0; $i < $num_members; $i++) {
         if (strlen($arr_members[$i]) == 0) {
             continue;
         }
         $thisThisFileInfo =& $ThisFileInfo['gzip']['member_header'][++$idx];
         $buff = "‹" . $arr_members[$i];
         $attr = unpack($unpack_header, substr($buff, 0, $start_length));
         $thisThisFileInfo['filemtime'] = getid3_lib::LittleEndian2Int($attr['mtime']);
         $thisThisFileInfo['raw']['id1'] = ord($attr['cmethod']);
         $thisThisFileInfo['raw']['id2'] = ord($attr['cmethod']);
         $thisThisFileInfo['raw']['cmethod'] = ord($attr['cmethod']);
         $thisThisFileInfo['raw']['os'] = ord($attr['os']);
         $thisThisFileInfo['raw']['xflags'] = ord($attr['xflags']);
         $thisThisFileInfo['raw']['flags'] = ord($attr['flags']);
         $thisThisFileInfo['flags']['crc16'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x2);
         $thisThisFileInfo['flags']['extra'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x4);
         $thisThisFileInfo['flags']['filename'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x8);
         $thisThisFileInfo['flags']['comment'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x10);
         $thisThisFileInfo['compression'] = $this->get_xflag_type($thisThisFileInfo['raw']['xflags']);
         $thisThisFileInfo['os'] = $this->get_os_type($thisThisFileInfo['raw']['os']);
         if (!$thisThisFileInfo['os']) {
             $ThisFileInfo['error'][] = 'Read error on gzip file';
             return false;
         }
         $fpointer = 10;
         $arr_xsubfield = array();
         // bit 2 - FLG.FEXTRA
         //+---+---+=================================+
         //| XLEN  |...XLEN bytes of "extra field"...|
         //+---+---+=================================+
         if ($thisThisFileInfo['flags']['extra']) {
             $w_xlen = substr($buff, $fpointer, 2);
             $xlen = getid3_lib::LittleEndian2Int($w_xlen);
             $fpointer += 2;
             $thisThisFileInfo['raw']['xfield'] = substr($buff, $fpointer, $xlen);
             // Extra SubFields
             //+---+---+---+---+==================================+
             //|SI1|SI2|  LEN  |... LEN bytes of subfield data ...|
             //+---+---+---+---+==================================+
             $idx = 0;
             while (true) {
                 if ($idx >= $xlen) {
                     break;
                 }
                 $si1 = ord(substr($buff, $fpointer + $idx++, 1));
                 $si2 = ord(substr($buff, $fpointer + $idx++, 1));
                 if ($si1 == 0x41 && $si2 == 0x70) {
                     $w_xsublen = substr($buff, $fpointer + $idx, 2);
                     $xsublen = getid3_lib::LittleEndian2Int($w_xsublen);
                     $idx += 2;
                     $arr_xsubfield[] = substr($buff, $fpointer + $idx, $xsublen);
                     $idx += $xsublen;
                 } else {
                     break;
                 }
             }
             $fpointer += $xlen;
         }
         // bit 3 - FLG.FNAME
         //+=========================================+
         //|...original file name, zero-terminated...|
         //+=========================================+
         // GZIP files may have only one file, with no filename, so assume original filename is current filename without .gz
         $thisThisFileInfo['filename'] = preg_replace('{.gz$}i', '', $ThisFileInfo['filename']);
         if ($thisThisFileInfo['flags']['filename']) {
             while (true) {
                 if (ord($buff[$fpointer]) == 0) {
                     $fpointer++;
                     break;
                 }
                 $thisThisFileInfo['filename'] .= $buff[$fpointer];
                 $fpointer++;
             }
         }
         // bit 4 - FLG.FCOMMENT
         //+===================================+
         //|...file comment, zero-terminated...|
         //+===================================+
         if ($thisThisFileInfo['flags']['comment']) {
             while (true) {
                 if (ord($buff[$fpointer]) == 0) {
                     $fpointer++;
                     break;
                 }
                 $thisThisFileInfo['comment'] .= $buff[$fpointer];
                 $fpointer++;
             }
         }
         // bit 1 - FLG.FHCRC
         //+---+---+
         //| CRC16 |
         //+---+---+
         if ($thisThisFileInfo['flags']['crc16']) {
             $w_crc = substr($buff, $fpointer, 2);
             $thisThisFileInfo['crc16'] = getid3_lib::LittleEndian2Int($w_crc);
             $fpointer += 2;
         }
         // bit 0 - FLG.FTEXT
         //if ($thisThisFileInfo['raw']['flags'] & 0x01) {
         //	Ignored...
         //}
         // bits 5, 6, 7 - reserved
         $thisThisFileInfo['crc32'] = getid3_lib::LittleEndian2Int(substr($buff, strlen($buff) - 8, 4));
         $thisThisFileInfo['filesize'] = getid3_lib::LittleEndian2Int(substr($buff, strlen($buff) - 4));
         $ThisFileInfo['gzip']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['gzip']['files'], getid3_lib::CreateDeepArray($thisThisFileInfo['filename'], '/', $thisThisFileInfo['filesize']));
         if ($this->option_gzip_parse_contents) {
             // Try to inflate GZip
             $csize = 0;
             $inflated = '';
             $chkcrc32 = '';
             if (function_exists('gzinflate')) {
                 $cdata = substr($buff, $fpointer);
                 $cdata = substr($cdata, 0, strlen($cdata) - 8);
                 $csize = strlen($cdata);
                 $inflated = gzinflate($cdata);
                 // Calculate CRC32 for inflated content
                 $thisThisFileInfo['crc32_valid'] = (bool) (sprintf('%u', crc32($inflated)) == $thisThisFileInfo['crc32']);
                 // determine format
                 $formattest = substr($inflated, 0, 32774);
                 $newgetID3 = new getID3();
                 $determined_format = $newgetID3->GetFileFormat($formattest);
                 unset($newgetID3);
                 // file format is determined
                 switch (@$determined_format['module']) {
                     case 'tar':
                         // view TAR-file info
                         if (file_exists(GETID3_INCLUDEPATH . $determined_format['include']) && @(include_once GETID3_INCLUDEPATH . $determined_format['include'])) {
                             getid3_tar::read_tar($inflated, $ThisFileInfo['gzip']['member_header'][$idx]);
                         }
                         break;
                     case '':
                     default:
                         // unknown or unhandled format
                         break;
                 }
             }
         }
     }
     return true;
 }