%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br.old/vendor/wapmorgan/unified-archive/src/Drivers/ |
| Current File : /var/www/projetos/suporte.iigd.com.br.old/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\BasicDriver;
use wapmorgan\UnifiedArchive\Exceptions\UnsupportedOperationException;
use wapmorgan\UnifiedArchive\Formats;
class Iso extends BasicDriver
{
/** @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;
/**
* @return array
*/
public static function getSupportedFormats()
{
return [
Formats::ISO,
];
}
/**
* @param $format
* @return bool
*/
public static function checkFormatSupport($format)
{
switch ($format) {
case Formats::ISO:
return class_exists('\CISOFile');
}
}
/**
* @inheritDoc
*/
public static function getDescription()
{
return 'php-library';
}
/**
* @inheritDoc
*/
public static function getInstallationInstruction()
{
return !class_exists('\CISOFile')
? 'install library `phpclasses/php-iso-file`'
: null;
}
/**
* @inheritDoc
*/
public function __construct($archiveFileName, $format, $password = null)
{
$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);
$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 void
* @throws UnsupportedOperationException
* @todo Implement extracting with reading & writing to FS
*/
public function extractFiles($outputFolder, array $files)
{
throw new UnsupportedOperationException();
}
/**
* @param string $outputFolder
* @return void
* @throws UnsupportedOperationException
* @todo Implement extracting with reading & writing to FS
*/
public function extractArchive($outputFolder)
{
throw new UnsupportedOperationException();
}
/**
* @param $inArchiveName
* @param $content
* @return void
* @throws UnsupportedOperationException
*/
public function addFileFromString($inArchiveName, $content)
{
throw new UnsupportedOperationException();
}
}