%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/NelexaZip.php |
<?php
namespace wapmorgan\UnifiedArchive\Drivers;
use PhpZip\ZipFile;
use wapmorgan\UnifiedArchive\ArchiveEntry;
use wapmorgan\UnifiedArchive\ArchiveInformation;
use wapmorgan\UnifiedArchive\Commands\BaseArchiveCommand;
use wapmorgan\UnifiedArchive\Drivers\Basic\BasicDriver;
use wapmorgan\UnifiedArchive\Drivers\Basic\BasicPureDriver;
use wapmorgan\UnifiedArchive\Exceptions\ArchiveCreationException;
use wapmorgan\UnifiedArchive\Exceptions\NonExistentArchiveFileException;
use wapmorgan\UnifiedArchive\Exceptions\UnsupportedOperationException;
use wapmorgan\UnifiedArchive\Formats;
class NelexaZip extends BasicPureDriver
{
const PACKAGE_NAME = 'nelexa/zip';
const MAIN_CLASS = '\\PhpZip\\ZipFile';
/**
* @var ZipFile
*/
protected $zip;
/**
* @var array
*/
protected $files;
public static function getDescription()
{
return 'nelexa/zip driver';
}
public static function getSupportedFormats()
{
return [
Formats::ZIP,
];
}
public static function checkFormatSupport($format)
{
if (!static::isInstalled()) {
return [];
}
return [
BasicDriver::OPEN,
BasicDriver::OPEN_ENCRYPTED,
BasicDriver::GET_COMMENT,
BasicDriver::SET_COMMENT,
BasicDriver::EXTRACT_CONTENT,
BasicDriver::APPEND,
BasicDriver::DELETE,
BasicDriver::CREATE,
BasicDriver::CREATE_ENCRYPTED,
BasicDriver::CREATE_IN_STRING,
];
}
/**
* @param array $files
* @param $archiveFileName
* @param $archiveFormat
* @param $compressionLevel
* @param $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 ($fileProgressCallable !== null && !is_callable($fileProgressCallable)) {
throw new ArchiveCreationException('File progress callable is not callable');
}
try {
$zipFile = static::createArchiveInternal($files, $password, $fileProgressCallable);
$zipFile->saveAsFile($archiveFileName)->close();
} catch (\Exception $e) {
throw new ArchiveCreationException('Could not create archive: '.$e->getMessage(), $e->getCode(), $e);
}
return count($files);
}
/**
* @param array $files
* @param string $archiveFormat
* @param int $compressionLevel
* @param string $password
* @param callable|null $fileProgressCallable
* @return string Content of archive
* @throws ArchiveCreationException
*/
public static function createArchiveInString(
array $files,
$archiveFormat,
$compressionLevel = self::COMPRESSION_AVERAGE,
$password = null,
$fileProgressCallable = null
) {
if ($fileProgressCallable !== null && !is_callable($fileProgressCallable)) {
throw new ArchiveCreationException('File progress callable is not callable');
}
try {
$zipFile = static::createArchiveInternal($files, $password, $fileProgressCallable);
return $zipFile->outputAsString();
} catch (\Exception $e) {
throw new ArchiveCreationException('Could not create archive: '.$e->getMessage(), $e->getCode(), $e);
}
}
protected static function createArchiveInternal(array $files, $password, $fileProgressCallable = null)
{
$current_file = 0;
$total_files = count($files);
$zipFile = new \PhpZip\ZipFile();
foreach ($files as $localName => $archiveName) {
$zipFile->addFile($localName, $archiveName);
if ($fileProgressCallable !== null) {
call_user_func_array(
$fileProgressCallable,
[$current_file++, $total_files, $localName, $archiveName]
);
}
}
if ($password !== null) {
$zipFile->setPassword($password);
}
return $zipFile;
}
/**
* @inheritDoc
* @throws \PhpZip\Exception\ZipException
*/
public function __construct($archiveFileName, $format, $password = null)
{
parent::__construct($archiveFileName, $format);
$this->zip = new ZipFile();
$this->zip->openFile($archiveFileName);
if ($password !== null) {
$this->zip->setReadPassword($password);
}
}
/**
* @inheritDoc
*/
public function getArchiveInformation()
{
$this->files = [];
$information = new ArchiveInformation();
$files = method_exists($this->zip, 'getAllInfo')
? $this->zip->getAllInfo()
: $this->zip->getEntries();
foreach ($files as $info) {
if (method_exists($info, 'isFolder') ? $info->isFolder() : $info->isDirectory())
continue;
$this->files[] = $information->files[] = str_replace('\\', '/', $info->getName());
$information->compressedFilesSize += $info->getCompressedSize();
$information->uncompressedFilesSize += method_exists($info, 'getSize') ? $info->getSize() : $info->getUncompressedSize();
}
return $information;
}
/**
* @inheritDoc
*/
public function getFileNames()
{
return $this->files;
}
/**
* @inheritDoc
*/
public function isFileExists($fileName)
{
return $this->zip->hasEntry($fileName);
}
/**
* @inheritDoc
*/
public function getFileData($fileName)
{
$info = method_exists($this->zip, 'getEntryInfo')
? $this->zip->getEntryInfo($fileName)
: $this->zip->getEntry($fileName);
return new ArchiveEntry(
$fileName,
$info->getCompressedSize(),
method_exists($info, 'getSize') ? $info->getSize() : $info->getUncompressedSize(),
$info->getMtime()->getTimestamp(),
null,
$info->getComment(),
$info->getCrc()
);
}
/**
* @inheritDoc
*/
public function getFileContent($fileName)
{
return $this->zip->getEntryContents($fileName);
}
/**
* @inheritDoc
* @throws NonExistentArchiveFileException
*/
public function getFileStream($fileName)
{
return static::wrapStringInStream($this->getFileContent($fileName));
}
/**
* @inheritDoc
*/
public function extractFiles($outputFolder, array $files)
{
$this->zip->extractTo($outputFolder, $files);
return count($files);
}
/**
* @inheritDoc
*/
public function extractArchive($outputFolder)
{
$this->zip->extractTo($outputFolder);
return count($this->files);
}
/**
* @inheritDoc
* @throws \PhpZip\Exception\ZipException
*/
public function addFileFromString($inArchiveName, $content)
{
return $this->zip->addFromString($inArchiveName, $content);
}
public function getComment()
{
return $this->zip->getArchiveComment();
}
public function setComment($comment)
{
return $this->zip->setArchiveComment($comment);
}
public function deleteFiles(array $files)
{
$deleted = 0;
foreach ($files as $file) {
$this->zip->deleteFromName($file);
$deleted++;
}
return $deleted;
}
public function addFiles(array $files)
{
foreach ($files as $inArchiveName => $fsFileName)
{
$this->zip->addFile($fsFileName, $inArchiveName);
}
}
}