ZipExtraDriver.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of the nelexa/zip package.
  5. * (c) Ne-Lexa <https://github.com/Ne-Lexa/php-zip>
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. namespace PhpZip\Model\Extra;
  10. use PhpZip\Exception\InvalidArgumentException;
  11. use PhpZip\Model\Extra\Fields\ApkAlignmentExtraField;
  12. use PhpZip\Model\Extra\Fields\AsiExtraField;
  13. use PhpZip\Model\Extra\Fields\ExtendedTimestampExtraField;
  14. use PhpZip\Model\Extra\Fields\JarMarkerExtraField;
  15. use PhpZip\Model\Extra\Fields\NewUnixExtraField;
  16. use PhpZip\Model\Extra\Fields\NtfsExtraField;
  17. use PhpZip\Model\Extra\Fields\OldUnixExtraField;
  18. use PhpZip\Model\Extra\Fields\UnicodeCommentExtraField;
  19. use PhpZip\Model\Extra\Fields\UnicodePathExtraField;
  20. use PhpZip\Model\Extra\Fields\WinZipAesExtraField;
  21. use PhpZip\Model\Extra\Fields\Zip64ExtraField;
  22. /**
  23. * Class ZipExtraManager.
  24. */
  25. final class ZipExtraDriver
  26. {
  27. /**
  28. * @var array<int, string>
  29. * @psalm-var array<int, class-string<ZipExtraField>>
  30. */
  31. private static array $implementations = [
  32. ApkAlignmentExtraField::HEADER_ID => ApkAlignmentExtraField::class,
  33. AsiExtraField::HEADER_ID => AsiExtraField::class,
  34. ExtendedTimestampExtraField::HEADER_ID => ExtendedTimestampExtraField::class,
  35. JarMarkerExtraField::HEADER_ID => JarMarkerExtraField::class,
  36. NewUnixExtraField::HEADER_ID => NewUnixExtraField::class,
  37. NtfsExtraField::HEADER_ID => NtfsExtraField::class,
  38. OldUnixExtraField::HEADER_ID => OldUnixExtraField::class,
  39. UnicodeCommentExtraField::HEADER_ID => UnicodeCommentExtraField::class,
  40. UnicodePathExtraField::HEADER_ID => UnicodePathExtraField::class,
  41. WinZipAesExtraField::HEADER_ID => WinZipAesExtraField::class,
  42. Zip64ExtraField::HEADER_ID => Zip64ExtraField::class,
  43. ];
  44. private function __construct()
  45. {
  46. }
  47. /**
  48. * @param string|ZipExtraField $extraField ZipExtraField object or class name
  49. */
  50. public static function register($extraField): void
  51. {
  52. if (!is_a($extraField, ZipExtraField::class, true)) {
  53. throw new InvalidArgumentException(
  54. sprintf(
  55. '$extraField "%s" is not implements interface %s',
  56. (string) $extraField,
  57. ZipExtraField::class
  58. )
  59. );
  60. }
  61. self::$implementations[\call_user_func([$extraField, 'getHeaderId'])] = $extraField;
  62. }
  63. /**
  64. * @param int|string|ZipExtraField $extraType ZipExtraField object or class name or extra header id
  65. */
  66. public static function unregister($extraType): bool
  67. {
  68. $headerId = null;
  69. if (\is_int($extraType)) {
  70. $headerId = $extraType;
  71. } elseif (is_a($extraType, ZipExtraField::class, true)) {
  72. $headerId = \call_user_func([$extraType, 'getHeaderId']);
  73. } else {
  74. return false;
  75. }
  76. if (isset(self::$implementations[$headerId])) {
  77. unset(self::$implementations[$headerId]);
  78. return true;
  79. }
  80. return false;
  81. }
  82. public static function getClassNameOrNull(int $headerId): ?string
  83. {
  84. if ($headerId < 0 || $headerId > 0xffff) {
  85. throw new \InvalidArgumentException('$headerId out of range: ' . $headerId);
  86. }
  87. return self::$implementations[$headerId] ?? null;
  88. }
  89. }