%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/Iso.php |
<?php
namespace wapmorgan\UnifiedArchive\Drivers;
use wapmorgan\UnifiedArchive\ArchiveEntry;
use wapmorgan\UnifiedArchive\ArchiveInformation;
use wapmorgan\UnifiedArchive\Drivers\Basic\BasicDriver;
use wapmorgan\UnifiedArchive\Drivers\Basic\BasicPureDriver;
use wapmorgan\UnifiedArchive\Exceptions\UnsupportedOperationException;
use wapmorgan\UnifiedArchive\Formats;
class Iso extends BasicPureDriver
{
const PACKAGE_NAME = 'phpclasses/php-iso-file';
const MAIN_CLASS = '\CISOFile';
/** @var \CISOFile */
protected $iso;
/** @var array List of files */
protected $files = [];
/** @var array */
protected $filesData = [];
/** @var int */
protected $filesSize = 0;
/** @var null|int Size of block in ISO. Used to find real position of file in ISO */
protected $blockSize;
/**
* @inheritDoc
*/
public static function getDescription()
{
return 'iso archives reader';
}
/**
* @return array
*/
public static function getSupportedFormats()
{
return [
Formats::ISO,
];
}
/**
* @param $format
* @return array
*/
public static function checkFormatSupport($format)
{
if (!static::isInstalled()) {
return [];
}
switch ($format) {
case Formats::ISO:
return [
BasicDriver::OPEN,
BasicDriver::EXTRACT_CONTENT,
];
}
}
/**
* @inheritDoc
* @throws UnsupportedOperationException
*/
public function __construct($archiveFileName, $format, $password = null)
{
parent::__construct($archiveFileName, $format);
$this->open($archiveFileName);
if ($password !== null)
throw new UnsupportedOperationException('Iso archive does not support password!');
}
/**
* Iso format destructor
*/
public function __destruct()
{
$this->iso->close();
}
/**
* @param $archiveFileName
*/
protected function open($archiveFileName)
{
// load php-iso-files
$this->iso = new \CISOFile;
$this->iso->open($archiveFileName);
$this->iso->ISOInit();
/** @var \CVolumeDescriptor $usedDesc */
$usedDesc = $this->iso->GetDescriptor(SUPPLEMENTARY_VOLUME_DESC);
if (!$usedDesc)
$usedDesc = $this->iso->GetDescriptor(PRIMARY_VOLUME_DESC);
$this->blockSize = $usedDesc->iBlockSize;
$directories = $usedDesc->LoadMPathTable($this->iso);
// iterate over all directories
/** @var \CPathTableRecord $Directory */
foreach ($directories as $Directory) {
$directory = $Directory->GetFullPath($directories);
// ? here is for some unexpected problem with ? appearing
$directory = trim($directory, '/?');
if ($directory != '') {
$directory .= '/';
// $this->files[$Directory->Location] = $directory;
}
// $this->isoCatalogsStructure[$Directory->Location]
// = $directory;
/** @var \CFileDirDescriptors[] $files */
$files = $Directory->LoadExtents($this->iso,
$usedDesc->iBlockSize, true);
if ($files) {
/** @var \CFileDirDescriptors $file */
foreach ($files as $file) {
if (in_array($file->strd_FileId, ['.', '..']) || $file->IsDirectory())
continue;
$this->files[$file->Location] = $directory.$file->strd_FileId;
$this->filesSize += $file->DataLen;
$this->filesData[$directory . $file->strd_FileId] =
[
'size' => $file->DataLen,
'mtime' =>
strtotime((string)$file->isoRecDate),
];
}
}
// break;
}
}
/**
* @return ArchiveInformation
*/
public function getArchiveInformation()
{
$information = new ArchiveInformation();
$information->files = array_values($this->files);
$information->compressedFilesSize = $information->uncompressedFilesSize = $this->filesSize;
return $information;
}
/**
* @return array
*/
public function getFileNames()
{
return array_values($this->files);
}
/**
* @param string $fileName
*
* @return bool
*/
public function isFileExists($fileName)
{
return array_key_exists($fileName, $this->filesData);
}
/**
* @param string $fileName
*
* @return ArchiveEntry|false
*/
public function getFileData($fileName)
{
if (!isset($this->filesData[$fileName]))
return false;
return new ArchiveEntry(
$fileName,
$this->filesData[$fileName]['size'],
$this->filesData[$fileName]['size'],
$this->filesData[$fileName]['mtime'],
false
);
}
/**
* @param string $fileName
*
* @return string|false
*/
public function getFileContent($fileName)
{
$data = $this->prepareForFileExtracting($fileName);
return $this->iso->Read($data['size']);
}
/**
* @param string $fileName
*
* @return bool|resource|string
*/
public function getFileStream($fileName)
{
$data = $this->prepareForFileExtracting($fileName);
return self::wrapStringInStream($this->iso->Read($data['size']));
}
/**
* @param string $fileName
* @return array
*/
protected function prepareForFileExtracting($fileName)
{
$Location = array_search($fileName, $this->files, true);
if (!isset($this->filesData[$fileName])) return false;
$data = $this->filesData[$fileName];
$Location_Real = $Location * $this->blockSize;
if ($this->iso->Seek($Location_Real, SEEK_SET) === false)
return false;
return $data;
}
/**
* @param string $outputFolder
* @param array $files
* @return int
* @throws UnsupportedOperationException
*/
public function extractFiles($outputFolder, array $files)
{
foreach ($files as $file) {
$destination_file = rtrim($outputFolder, '/'). '/' . ltrim($file, '/');
$destination_dir = dirname($destination_file);
if (!empty($destination_dir)) {
if (!is_dir($destination_dir)) {
mkdir($destination_dir, 0777, true);
} else {
if (!is_writable($destination_dir)) {
chmod($destination_dir, 0777);
}
}
}
file_put_contents($destination_file, $this->getFileContent($file));
}
return count($files);
}
/**
* @param string $outputFolder
* @return int
* @throws UnsupportedOperationException
* @todo Implement extracting with reading & writing to FS
*/
public function extractArchive($outputFolder)
{
return $this->extractFiles($outputFolder, $this->files);
}
}