Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
8 / 8 |
CRAP | |
100.00% |
39 / 39 |
Preview | |
100.00% |
1 / 1 |
|
100.00% |
8 / 8 |
17 | |
100.00% |
39 / 39 |
exitController | |
100.00% |
1 / 1 |
2 | |
100.00% |
2 / 2 |
|||
getThumbnail | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
getData | |
100.00% |
1 / 1 |
3 | |
100.00% |
8 / 8 |
|||
getFile | |
100.00% |
1 / 1 |
2 | |
100.00% |
7 / 7 |
|||
getPreviewData | |
100.00% |
1 / 1 |
3 | |
100.00% |
7 / 7 |
|||
getErrorData | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getExceptionData | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
prepareEmptyThumbnail | |
100.00% |
1 / 1 |
3 | |
100.00% |
7 / 7 |
<?php | |
/** | |
* Gallery | |
* | |
* This file is licensed under the Affero General Public License version 3 or | |
* later. See the COPYING file. | |
* | |
* @author Olivier Paroz <galleryapps@oparoz.com> | |
* @author Robin Appelman <robin@icewind.nl> | |
* | |
* @copyright Olivier Paroz 2014-2016 | |
* @copyright Robin Appelman 2012-2014 | |
*/ | |
namespace OCA\Gallery\Controller; | |
use OCP\IURLGenerator; | |
use OCP\ILogger; | |
use OCP\Files\File; | |
use OCP\AppFramework\Http; | |
use OCA\Gallery\Service\ServiceException; | |
use OCA\Gallery\Service\NotFoundServiceException; | |
use OCA\Gallery\Service\ConfigService; | |
use OCA\Gallery\Service\ThumbnailService; | |
use OCA\Gallery\Service\PreviewService; | |
use OCA\Gallery\Service\DownloadService; | |
/** | |
* Class Preview | |
* | |
* @package OCA\Gallery\Controller | |
*/ | |
trait Preview { | |
use HttpError; | |
/** @var IURLGenerator */ | |
private $urlGenerator; | |
/** @var ConfigService */ | |
private $configService; | |
/** @var ThumbnailService */ | |
private $thumbnailService; | |
/** @var PreviewService */ | |
private $previewService; | |
/** @var DownloadService */ | |
private $downloadService; | |
/** @var ILogger */ | |
private $logger; | |
/** @type bool */ | |
private $download = false; | |
/** | |
* Exits the controller in a live environment and throws an exception when testing | |
*/ | |
protected function exitController() { | |
if (defined('PHPUNIT_RUN')) { | |
throw new \Exception(); | |
// @codeCoverageIgnoreStart | |
} else { | |
exit(); | |
} | |
// @codeCoverageIgnoreEnd | |
} | |
/** | |
* Retrieves the thumbnail to send back to the browser | |
* | |
* The thumbnail is either a resized preview of the file or the original file | |
* Thumbnails are base64encoded before getting sent back | |
* | |
* | |
* @param int $fileId the ID of the file of which we need a thumbnail preview of | |
* @param bool $square whether the thumbnail should be square | |
* @param double $scale whether we're allowed to scale the preview up | |
* | |
* @return array<string,array|string> | |
*/ | |
private function getThumbnail($fileId, $square, $scale) { | |
list($width, $height, $aspect, $animatedPreview, $base64Encode) = | |
$this->thumbnailService->getThumbnailSpecs($square, $scale); | |
/** @type File $file */ | |
list($file, $preview, $status) = | |
$this->getData( | |
$fileId, $width, $height, $aspect, $animatedPreview, $base64Encode | |
); | |
if ($preview === null) { | |
$preview = $this->prepareEmptyThumbnail($file, $status); | |
} | |
return [$preview, $status]; | |
} | |
/** | |
* Returns either a generated preview, the file as-is or an empty object | |
* | |
* @param int $fileId | |
* @param int $width | |
* @param int $height | |
* @param bool $keepAspect | |
* @param bool $animatedPreview | |
* @param bool $base64Encode | |
* | |
* @return array<string,\OC_Image|string> | |
* | |
* @throws NotFoundServiceException | |
*/ | |
private function getData( | |
$fileId, $width, $height, $keepAspect = true, $animatedPreview = true, $base64Encode = false | |
) { | |
/** @type File $file */ | |
list($file, $status) = $this->getFile($fileId); | |
try { | |
if (!is_null($file)) { | |
$data = $this->getPreviewData( | |
$file, $animatedPreview, $width, $height, $keepAspect, $base64Encode | |
); | |
} else { | |
$data = $this->getErrorData($status); | |
} | |
} catch (ServiceException $exception) { | |
$data = $this->getExceptionData($exception); | |
} | |
array_unshift($data, $file); | |
return $data; | |
} | |
/** | |
* Returns the file of which a preview will be generated | |
* | |
* @param int $fileId | |
* | |
* @return array<File|int|null> | |
*/ | |
private function getFile($fileId) { | |
$status = Http::STATUS_OK; | |
try { | |
/** @type File $file */ | |
$file = $this->previewService->getFile($fileId); | |
$this->configService->validateMimeType($file->getMimeType()); | |
} catch (ServiceException $exception) { | |
$file = null; | |
$status = $this->getHttpStatusCode($exception); | |
} | |
return [$file, $status]; | |
} | |
/** | |
* @param File $file | |
* @param bool $animatedPreview | |
* @param int $width | |
* @param int $height | |
* @param bool $keepAspect | |
* @param bool $base64Encode | |
* | |
* @return array | |
*/ | |
private function getPreviewData( | |
$file, $animatedPreview, $width, $height, $keepAspect, $base64Encode | |
) { | |
$status = Http::STATUS_OK; | |
if ($this->previewService->isPreviewRequired($file, $animatedPreview)) { | |
$preview = $this->previewService->createPreview( | |
$file, $width, $height, $keepAspect, $base64Encode | |
); | |
} else { | |
$preview = $this->downloadService->downloadFile($file, $base64Encode); | |
} | |
if (!$preview) { | |
list($preview, $status) = $this->getErrorData(); | |
} | |
return [$preview, $status]; | |
} | |
/** | |
* Returns an error array | |
* | |
* @param $status | |
* | |
* @return array<null|int> | |
*/ | |
private function getErrorData($status = Http::STATUS_INTERNAL_SERVER_ERROR) { | |
return [null, $status]; | |
} | |
/** | |
* Returns an error array | |
* | |
* @param ServiceException $exception | |
* | |
* @return array<null|int|string> | |
*/ | |
private function getExceptionData($exception) { | |
$code = $this->getHttpStatusCode($exception); | |
return $this->getErrorData($code); | |
} | |
/** | |
* Prepares an empty Thumbnail array to send back | |
* | |
* When we can't even get the file information, we send an empty mimeType | |
* | |
* @param File $file | |
* @param int $status | |
* | |
* @return array<string,null|string> | |
*/ | |
private function prepareEmptyThumbnail($file, $status) { | |
$thumbnail = []; | |
if ($status !== Http::STATUS_NOT_FOUND) { | |
$mimeType = ''; | |
if ($file) { | |
$mimeType = $file->getMimeType(); | |
} | |
$thumbnail = ['preview' => null, 'mimetype' => $mimeType]; | |
} | |
return $thumbnail; | |
} | |
} |