%PDF- %PDF-
Direktori : /var/www/projetos/suporte.iigd.com.br/vendor/wapmorgan/unified-archive/src/Drivers/ |
Current File : //var/www/projetos/suporte.iigd.com.br/vendor/wapmorgan/unified-archive/src/Drivers/TarByPear.php |
<?php namespace wapmorgan\UnifiedArchive\Drivers; use Archive_Tar; use wapmorgan\UnifiedArchive\ArchiveEntry; use wapmorgan\UnifiedArchive\ArchiveInformation; use wapmorgan\UnifiedArchive\Drivers\Basic\BasicDriver; use wapmorgan\UnifiedArchive\Drivers\Basic\BasicPureDriver; use wapmorgan\UnifiedArchive\Exceptions\ArchiveCreationException; use wapmorgan\UnifiedArchive\Exceptions\ArchiveExtractionException; use wapmorgan\UnifiedArchive\Exceptions\ArchiveModificationException; use wapmorgan\UnifiedArchive\Exceptions\NonExistentArchiveFileException; use wapmorgan\UnifiedArchive\Exceptions\UnsupportedOperationException; use wapmorgan\UnifiedArchive\Formats; use wapmorgan\UnifiedArchive\LzwStreamWrapper; class TarByPear extends BasicPureDriver { const MAIN_CLASS = '\\Archive_Tar'; /** * @var Archive_Tar */ protected $tar; /** * @var float Overall compression ratio of Tar archive when Archive_Tar is used */ protected $pearCompressionRatio; /** * @var array<string, integer> List of files and their index in listContent() result */ protected $pearFilesIndex; protected $pureFilesNumber; /** * @inheritDoc */ public static function getDescription() { return 'php-library for tar'; } /** * @inheritDoc */ public static function getInstallationInstruction() { return 'install library [pear/archive_tar]: `composer require pear/archive_tar`' . "\n" . ' and optionally php-extensions (zlib, bz2)'; } /** * @return array */ public static function getSupportedFormats() { return [ Formats::TAR, Formats::TAR_GZIP, Formats::TAR_BZIP, Formats::TAR_LZMA, Formats::TAR_LZW, ]; } /** * @param $format * @return array * @throws \Exception */ public static function checkFormatSupport($format) { if (!static::isInstalled()) { return []; } $abilities = [ BasicDriver::OPEN, BasicDriver::EXTRACT_CONTENT, Basic\BasicDriver::APPEND, Basic\BasicDriver::CREATE, ]; switch ($format) { case Formats::TAR: return $abilities; case Formats::TAR_GZIP: if (!extension_loaded('zlib')) { return []; } return $abilities; case Formats::TAR_BZIP: if (!extension_loaded('bz2')) { return []; } return $abilities; case Formats::TAR_LZMA: if (!extension_loaded('xz')) { return []; } return $abilities; case Formats::TAR_LZW: if (!LzwStreamWrapper::isBinaryAvailable()) { return []; } return $abilities; } } /** * @param array $files * @param string $archiveFileName * @param int $archiveFormat * @param int $compressionLevel * @param null $password * @param $fileProgressCallable * @return int * @throws ArchiveCreationException * @throws UnsupportedOperationException */ public static function createArchive( array $files, $archiveFileName, $archiveFormat, $compressionLevel = self::COMPRESSION_AVERAGE, $password = null, $fileProgressCallable = null ) { if ($password !== null) { throw new UnsupportedOperationException('One-file format ('.__CLASS__.') could not encrypt an archive'); } if ($fileProgressCallable !== null && !is_callable($fileProgressCallable)) { throw new ArchiveCreationException('File progress callable is not callable'); } $compression = null; switch (strtolower(pathinfo($archiveFileName, PATHINFO_EXTENSION))) { case 'gz': case 'tgz': $compression = 'gz'; break; case 'bz2': case 'tbz2': $compression = 'bz2'; break; case 'xz': $compression = 'lzma2'; break; case 'z': $tar_aname = 'compress.lzw://' . $archiveFileName; break; } if (isset($tar_aname)) $tar = new Archive_Tar($tar_aname, $compression); else $tar = new Archive_Tar($archiveFileName, $compression); $current_file = 0; $total_files = count($files); foreach ($files as $localName => $filename) { $remove_dir = dirname($filename); $add_dir = dirname($localName); if (is_null($filename)) { // if ($tar->addString($localName, '') === false) // throw new ArchiveCreationException('Error when adding directory '.$localName.' to archive'); } else { if ($tar->addModify($filename, $add_dir, $remove_dir) === false) throw new ArchiveCreationException('Error when adding file '.$filename.' to archive'); } if ($fileProgressCallable !== null) { call_user_func_array($fileProgressCallable, [$current_file++, $total_files, $filename, $localName]); } } $tar = null; return count($files); } /** * @inheritDoc */ public function __construct($archiveFileName, $format, $password = null) { parent::__construct($archiveFileName, $format); $this->open($format); } protected function open($archiveType) { switch ($archiveType) { case Formats::TAR_GZIP: $this->tar = new Archive_Tar($this->fileName, 'gz'); break; case Formats::TAR_BZIP: $this->tar = new Archive_Tar($this->fileName, 'bz2'); break; case Formats::TAR_LZMA: $this->tar = new Archive_Tar($this->fileName, 'lzma2'); break; case Formats::TAR_LZW: LzwStreamWrapper::registerWrapper(); $this->tar = new Archive_Tar('compress.lzw://' . $this->fileName); break; default: $this->tar = new Archive_Tar($this->fileName); break; } } /** * @inheritDoc */ public function getArchiveInformation() { $information = new ArchiveInformation(); $this->pearFilesIndex = []; $this->pureFilesNumber = 0; foreach ($this->tar->listContent() as $i => $file) { // BUG workaround: http://pear.php.net/bugs/bug.php?id=20275 if ($file['filename'] === 'pax_global_header') { continue; } // skip directories if ($file['typeflag'] == '5' || substr($file['filename'], -1) === '/') continue; $information->files[] = $file['filename']; $information->uncompressedFilesSize += $file['size']; $this->pearFilesIndex[$file['filename']] = $i; $this->pureFilesNumber++; } $information->compressedFilesSize = filesize($this->fileName); $this->pearCompressionRatio = $information->uncompressedFilesSize != 0 ? ceil($information->compressedFilesSize / $information->uncompressedFilesSize) : 1; return $information; } /** * @inheritDoc */ public function getFileNames() { $files = []; $Content = $this->tar->listContent(); foreach ($Content as $i => $file) { // BUG workaround: http://pear.php.net/bugs/bug.php?id=20275 if ($file['filename'] === 'pax_global_header') { continue; } $files[] = $file['filename']; } return $files; } /** * @inheritDoc */ public function isFileExists($fileName) { return isset($this->pearFilesIndex[$fileName]); } /** * @inheritDoc */ public function getFileData($fileName) { if (!isset($this->pearFilesIndex[$fileName])) throw new NonExistentArchiveFileException('File '.$fileName.' is not found in archive files list'); $index = $this->pearFilesIndex[$fileName]; $files_list = $this->tar->listContent(); if (!isset($files_list[$index])) throw new NonExistentArchiveFileException('File '.$fileName.' is not found in Tar archive'); $data = $files_list[$index]; unset($files_list); return new ArchiveEntry($fileName, $data['size'] / $this->pearCompressionRatio, $data['size'], $data['mtime'], in_array(strtolower(pathinfo($this->fileName, PATHINFO_EXTENSION)), ['gz', 'bz2', 'xz', 'z'])); } /** * @inheritDoc */ public function getFileContent($fileName) { if (!isset($this->pearFilesIndex[$fileName])) throw new NonExistentArchiveFileException('File '.$fileName.' is not found in archive files list'); return $this->tar->extractInString($fileName); } /** * @inheritDoc */ public function getFileStream($fileName) { if (!isset($this->pearFilesIndex[$fileName])) throw new NonExistentArchiveFileException('File '.$fileName.' is not found in archive files list'); return self::wrapStringInStream($this->tar->extractInString($fileName)); } /** * @inheritDoc */ public function extractFiles($outputFolder, array $files) { $result = $this->tar->extractList($files, $outputFolder); if ($result === false) { if (isset($this->tar->error_object)) { throw new ArchiveExtractionException('Error when extracting from ' . $this->fileName . ': ' . $this->tar->error_object->getMessage(0)); } throw new ArchiveExtractionException('Error when extracting from '.$this->fileName); } return count($files); } /** * @inheritDoc */ public function extractArchive($outputFolder) { $result = $this->tar->extract($outputFolder); if ($result === false) { if (isset($this->tar->error_object)) { throw new ArchiveExtractionException('Error when extracting ' . $this->fileName . ': ' . $this->tar->error_object->toString() ); } throw new ArchiveExtractionException('Error when extracting '.$this->fileName); } return $this->pureFilesNumber; } /** * @inheritDoc */ public function addFiles(array $files) { $added = 0; foreach ($files as $localName => $filename) { $remove_dir = dirname($filename); $add_dir = dirname($localName); if (is_null($filename)) { // if ($this->tar->addString($localName, "") === false) { // throw new ArchiveModificationException('Could not add directory "'.$filename.'": '.$this->tar->error_object->message, $this->tar->error_object->code); // } } else { if ($this->tar->addModify($filename, $add_dir, $remove_dir) === false) { throw new ArchiveModificationException('Could not add file "'.$filename.'": '.$this->tar->error_object->message, $this->tar->error_object->code); } $added++; } } return $added; } /** * @param string $inArchiveName * @param string $content * @return bool|true */ public function addFileFromString($inArchiveName, $content) { return $this->tar->addString($inArchiveName, $content); } }