%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br/vendor/wapmorgan/unified-archive/src/ |
| Current File : /var/www/projetos/suporte.iigd.com.br/vendor/wapmorgan/unified-archive/src/Formats.php |
<?php
namespace wapmorgan\UnifiedArchive;
use wapmorgan\UnifiedArchive\Drivers\AlchemyZippy;
use wapmorgan\UnifiedArchive\Drivers\Basic\BasicDriver;
use wapmorgan\UnifiedArchive\Drivers\Cab;
use wapmorgan\UnifiedArchive\Drivers\Iso;
use wapmorgan\UnifiedArchive\Drivers\NelexaZip;
use wapmorgan\UnifiedArchive\Drivers\OneFile\Bzip;
use wapmorgan\UnifiedArchive\Drivers\OneFile\Gzip;
use wapmorgan\UnifiedArchive\Drivers\OneFile\Lzma;
use wapmorgan\UnifiedArchive\Drivers\Rar;
use wapmorgan\UnifiedArchive\Drivers\SevenZip;
use wapmorgan\UnifiedArchive\Drivers\SplitbrainPhpArchive;
use wapmorgan\UnifiedArchive\Drivers\TarByPear;
use wapmorgan\UnifiedArchive\Drivers\TarByPhar;
use wapmorgan\UnifiedArchive\Drivers\Zip;
class Formats
{
// archived and compressed
const ZIP = 'zip';
const SEVEN_ZIP = '7z';
const RAR = 'rar';
const CAB = 'cab';
const TAR = 'tar';
const TAR_GZIP = 'tgz';
const TAR_BZIP = 'tbz2';
const TAR_LZMA = 'txz';
const TAR_LZW = 'tar.z';
const ARJ = 'arj';
// compressed
const GZIP = 'gz';
const BZIP = 'bz2';
const LZMA = 'xz';
// non-usual archives
const UEFI = 'uefi';
const GPT = 'gpt';
const MBR = 'mbr';
const MSI = 'msi';
const ISO = 'iso';
const DMG = 'dmg';
const UDF = 'udf';
const RPM = 'rpm';
const DEB = 'deb';
/**
* @var string[] List of archive format drivers
*/
public static $drivers = [
Zip::class,
Rar::class,
Gzip::class,
Bzip::class,
Lzma::class,
TarByPhar::class,
SevenZip::class,
AlchemyZippy::class,
SplitbrainPhpArchive::class,
NelexaZip::class,
TarByPear::class,
Iso::class,
Cab::class,
];
/** @var array<string, array<string>> List of all available types with their drivers */
protected static $declaredDriversFormats;
/** @var array List of all drivers with formats and support-state */
protected static $supportedDriversFormats;
protected static $oneLevelExtensions = [
'zip' => Formats::ZIP,
'jar' => Formats::ZIP,
'7z' => Formats::SEVEN_ZIP,
'rar' => Formats::RAR,
'gz' => Formats::GZIP,
'bz2' => Formats::BZIP,
'xz' => Formats::LZMA,
'iso' => Formats::ISO,
'cab' => Formats::CAB,
'tar' => Formats::TAR,
'tgz' => Formats::TAR_GZIP,
'tbz2' => Formats::TAR_BZIP,
'txz' => Formats::TAR_LZMA,
'arj' => Formats::ARJ,
'efi' => Formats::UEFI,
'gpt' => Formats::GPT,
'mbr' => Formats::MBR,
'msi' => Formats::MSI,
'dmg' => Formats::DMG,
'rpm' => Formats::RPM,
'deb' => Formats::DEB,
'udf' => Formats::UDF,
];
protected static $twoLevelExtensions = [
'tar.gz' => Formats::TAR_GZIP,
'tar.bz2' => Formats::TAR_BZIP,
'tar.xz' => Formats::TAR_LZMA,
'tar.z' => Formats::TAR_LZW,
];
protected static $mimeTypes = [
'application/zip' => Formats::ZIP,
'application/x-7z-compressed' => Formats::SEVEN_ZIP,
'application/x-rar' => Formats::RAR,
'application/zlib' => Formats::GZIP,
'application/gzip' => Formats::GZIP,
'application/x-gzip' => Formats::GZIP,
'application/x-bzip2' => Formats::BZIP,
'application/x-lzma' => Formats::LZMA,
'application/x-iso9660-image' => Formats::ISO,
'application/vnd.ms-cab-compressed' => Formats::CAB,
'application/x-tar' => Formats::TAR,
'application/x-gtar' => Formats::TAR_GZIP,
];
/**
* Detect archive type by its filename or content
*
* @param string $originalFileName Archive filename
* @param bool $contentCheck Whether archive type can be detected by content
* @return string|bool One of UnifiedArchive type constants OR false if type is not detected
*/
public static function detectArchiveFormat($originalFileName, $contentCheck = true)
{
$fileName = strtolower($originalFileName);
// by file name
$ld_offset = strrpos($fileName, '.');
if ($ld_offset !== false) {
$ext = substr($fileName, $ld_offset + 1);
$sld_offset = strrpos($fileName, '.', - (strlen($ext) + 2)); // 1 byte for ., 1 for another char
if ($sld_offset !== false) {
$complex_ext = substr($fileName, $sld_offset + 1);
if (isset(static::$twoLevelExtensions[$complex_ext])) {
return static::$twoLevelExtensions[$complex_ext];
}
}
if (isset(static::$oneLevelExtensions[$ext])) {
return static::$oneLevelExtensions[$ext];
}
}
// by file content
if ($contentCheck && function_exists('mime_content_type')) {
$mime_type = mime_content_type($originalFileName);
if (isset(static::$mimeTypes[$mime_type])) {
return static::$mimeTypes[$mime_type];
}
}
return false;
}
/**
* Checks whether specific archive type can be opened with current system configuration
*
* @param string $format One of predefined archive types (class constants)
* @return bool
*/
public static function canOpen($format)
{
return static::checkFormatSupportAbility($format, BasicDriver::OPEN);
}
/**
* Checks whether specified archive can be streamed
*
* @param string $format One of predefined archive types (class constants)
* @return bool
*/
public static function canStream($format)
{
return static::checkFormatSupportAbility($format, BasicDriver::STREAM_CONTENT);
}
/**
* Checks whether specified archive can be created
*
* @param string $format One of predefined archive types (class constants)
* @return bool
*/
public static function canCreate($format)
{
return static::checkFormatSupportAbility($format, BasicDriver::CREATE);
}
/**
* Checks whether specified archive can be created
*
* @param string $format One of predefined archive types (class constants)
* @return bool
*/
public static function canAppend($format)
{
return static::checkFormatSupportAbility($format, BasicDriver::APPEND);
}
/**
* Checks whether specified archive can be created
*
* @param string $format One of predefined archive types (class constants)
* @return bool
*/
public static function canUpdate($format)
{
return static::checkFormatSupportAbility($format, BasicDriver::DELETE);
}
/**
* Checks whether specified archive can be created
*
* @param string $format One of predefined archive types (class constants)
* @return bool
*/
public static function canEncrypt($format)
{
return static::checkFormatSupportAbility($format, BasicDriver::CREATE_ENCRYPTED);
}
/**
* @param $format
* @return void
*/
protected static function getFormatSupportStatus($format)
{
static::getAllPossibleFormatsAndDrivers();
if (!isset(static::$supportedDriversFormats[$format])) {
static::$supportedDriversFormats[$format] = [];
if (!isset(static::$declaredDriversFormats[$format])) {
return;
}
/** @var BasicDriver $format_driver */
foreach (static::$declaredDriversFormats[$format] as $format_driver) {
static::$supportedDriversFormats[$format][$format_driver] = $format_driver::checkFormatSupport($format);
}
}
}
/**
* @param string $format
* @param string $ability
* @return bool
*/
public static function checkFormatSupportAbility($format, $ability)
{
self::getFormatSupportStatus($format);
foreach (static::$supportedDriversFormats[$format] as $driver => $driver_abilities) {
if (in_array($ability, $driver_abilities, true)) {
return true;
}
}
return false;
}
/**
* @param string $format
* @param int[] $abilities
* @return int|string|null
*/
public static function getFormatDriver($format, array $abilities = [])
{
self::getFormatSupportStatus($format);
foreach (static::$supportedDriversFormats[$format] as $driver => $driver_abilities) {
if (count(array_intersect($driver_abilities, $abilities)) === count($abilities)) {
return $driver;
}
}
return null;
}
/**
* @param string $archiveFormat
* @return int|string|null
*/
public static function getFormatExtension($archiveFormat)
{
$complex_ext = array_search($archiveFormat, static::$twoLevelExtensions);
if ($complex_ext !== false) {
return $complex_ext;
}
$ext = array_search($archiveFormat, static::$oneLevelExtensions);
if ($ext !== false) {
return $ext;
}
return null;
}
/**
* @param $format
* @return false|int|string
*/
public static function getFormatMimeType($format)
{
return array_search($format, static::$mimeTypes, true);
}
public static function getDeclaredDriverFormats()
{
static::getAllPossibleFormatsAndDrivers();
return static::$declaredDriversFormats;
}
public static function getSupportedDriverFormats()
{
foreach (self::getDeclaredDriverFormats() as $format => $formatDrivers) {
self::getFormatSupportStatus($format);
}
return static::$supportedDriversFormats;
}
/**
* Tests system configuration
*/
protected static function getAllPossibleFormatsAndDrivers()
{
if (static::$declaredDriversFormats === null) {
static::$declaredDriversFormats = [];
foreach (static::$drivers as $handlerClass)
{
$handler_formats = $handlerClass::getSupportedFormats();
foreach ($handler_formats as $handler_format)
{
static::$declaredDriversFormats[$handler_format][] = $handlerClass;
}
}
}
}
}