<?php
|
|
namespace PhpZip\Model\Data;
|
|
use PhpZip\Exception\Crc32Exception;
|
use PhpZip\Exception\ZipException;
|
use PhpZip\IO\ZipReader;
|
use PhpZip\Model\ZipData;
|
use PhpZip\Model\ZipEntry;
|
|
/**
|
* Class ZipFileData.
|
*/
|
class ZipSourceFileData implements ZipData
|
{
|
/** @var ZipReader */
|
private $zipReader;
|
|
/** @var resource|null */
|
private $stream;
|
|
/** @var ZipEntry */
|
private $sourceEntry;
|
|
/** @var int */
|
private $offset;
|
|
/** @var int */
|
private $uncompressedSize;
|
|
/** @var int */
|
private $compressedSize;
|
|
/**
|
* ZipFileData constructor.
|
*
|
* @param ZipReader $zipReader
|
* @param ZipEntry $zipEntry
|
* @param int $offsetData
|
*/
|
public function __construct(ZipReader $zipReader, ZipEntry $zipEntry, $offsetData)
|
{
|
$this->zipReader = $zipReader;
|
$this->offset = $offsetData;
|
$this->sourceEntry = $zipEntry;
|
$this->compressedSize = $zipEntry->getCompressedSize();
|
$this->uncompressedSize = $zipEntry->getUncompressedSize();
|
}
|
|
/**
|
* @param ZipEntry $entry
|
*
|
* @return bool
|
*/
|
public function hasRecompressData(ZipEntry $entry)
|
{
|
return $this->sourceEntry->getCompressionLevel() !== $entry->getCompressionLevel() ||
|
$this->sourceEntry->getCompressionMethod() !== $entry->getCompressionMethod() ||
|
$this->sourceEntry->isEncrypted() !== $entry->isEncrypted() ||
|
$this->sourceEntry->getEncryptionMethod() !== $entry->getEncryptionMethod() ||
|
$this->sourceEntry->getPassword() !== $entry->getPassword() ||
|
$this->sourceEntry->getCompressedSize() !== $entry->getCompressedSize() ||
|
$this->sourceEntry->getUncompressedSize() !== $entry->getUncompressedSize() ||
|
$this->sourceEntry->getCrc() !== $entry->getCrc();
|
}
|
|
/**
|
* @throws ZipException
|
*
|
* @return resource returns stream data
|
*/
|
public function getDataAsStream()
|
{
|
if (!\is_resource($this->stream)) {
|
$this->stream = $this->zipReader->getEntryStream($this);
|
}
|
|
return $this->stream;
|
}
|
|
/**
|
* @throws ZipException
|
*
|
* @return string returns data as string
|
*/
|
public function getDataAsString()
|
{
|
$autoClosable = $this->stream === null;
|
|
$stream = $this->getDataAsStream();
|
$pos = ftell($stream);
|
|
try {
|
rewind($stream);
|
|
return stream_get_contents($stream);
|
} finally {
|
if ($autoClosable) {
|
fclose($stream);
|
$this->stream = null;
|
} else {
|
fseek($stream, $pos);
|
}
|
}
|
}
|
|
/**
|
* @param resource $outputStream Output stream
|
*
|
* @throws ZipException
|
* @throws Crc32Exception
|
*/
|
public function copyDataToStream($outputStream)
|
{
|
if (\is_resource($this->stream)) {
|
rewind($this->stream);
|
stream_copy_to_stream($this->stream, $outputStream);
|
} else {
|
$this->zipReader->copyUncompressedDataToStream($this, $outputStream);
|
}
|
}
|
|
/**
|
* @param resource $outputStream Output stream
|
*/
|
public function copyCompressedDataToStream($outputStream)
|
{
|
$this->zipReader->copyCompressedDataToStream($this, $outputStream);
|
}
|
|
/**
|
* @return ZipEntry
|
*/
|
public function getSourceEntry()
|
{
|
return $this->sourceEntry;
|
}
|
|
/**
|
* @return int
|
*/
|
public function getCompressedSize()
|
{
|
return $this->compressedSize;
|
}
|
|
/**
|
* @return int
|
*/
|
public function getUncompressedSize()
|
{
|
return $this->uncompressedSize;
|
}
|
|
/**
|
* @return int
|
*/
|
public function getOffset()
|
{
|
return $this->offset;
|
}
|
|
/**
|
* {@inheritdoc}
|
*/
|
public function __destruct()
|
{
|
if (\is_resource($this->stream)) {
|
fclose($this->stream);
|
}
|
}
|
}
|