tao-test/app/taoQtiTest/models/classes/files/QtiFlysystemFile.php

124 lines
3.3 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2016 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
*
*/
namespace oat\taoQtiTest\models\files;
use oat\oatbox\filesystem\File;
use qtism\common\datatypes\QtiFile;
use qtism\common\enums\BaseType;
use qtism\common\enums\Cardinality;
class QtiFlysystemFile extends File implements QtiFile
{
const FILENAME_MD_PREFIX = '.fmd';
const CHUNK_SIZE = 2048;
public function __construct($fileSystemId, $path)
{
parent::__construct($fileSystemId, $path);
}
public function getData()
{
return $this->read();
}
public function getMimeType()
{
return parent::getMimeType();
}
public function hasFilename()
{
return $this->getFileSystem()->has($this->getPrefix() . self::FILENAME_MD_PREFIX);
}
public function getFilename()
{
$filename = '';
if ($this->hasFilename() === true) {
$filename = $this->getFileSystem()->read($this->getPrefix() . self::FILENAME_MD_PREFIX);
}
return $filename;
}
public function getStream()
{
return $this->readStream();
}
public function getIdentifier()
{
return $this->getPrefix();
}
public function equals($obj)
{
if ($obj instanceof QtiFile) {
if ($this->getFilename() !== $obj->getFilename()) {
return false;
} elseif ($this->getMimeType() !== $obj->getMimeType()) {
return false;
} else {
// We have to check the content of the file.
$myStream = $this->getStream();
$objStream = $obj->getStream();
while (feof($myStream) === false && feof($objStream) === false) {
$myChunk = fread($myStream, self::CHUNK_SIZE);
$objChjunk = fread($objStream, self::CHUNK_SIZE);
if ($myChunk !== $objChjunk) {
@fclose($myStream);
@fclose($objStream);
return false;
}
}
@fclose($myStream);
@fclose($objStream);
return true;
}
}
return false;
}
public function getCardinality()
{
return Cardinality::SINGLE;
}
public function getBaseType()
{
return BaseType::FILE;
}
public function __toString()
{
return $this->getFileName();
}
}