From cae8529359ee4b0733cfbc958ab1405b45f0f2d2 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 11 Mar 2015 16:43:00 +0100 Subject: [PATCH] Register preview providers on the preview manager instead of OC\Preview --- lib/private/preview.php | 64 +++++--------------------------- lib/private/preview/provider.php | 2 +- lib/private/previewmanager.php | 55 +++++++++++++++++++++++++-- lib/public/ipreview.php | 14 ++++++- 4 files changed, 74 insertions(+), 61 deletions(-) diff --git a/lib/private/preview.php b/lib/private/preview.php index 6af1586293..f55cf280b3 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -510,7 +510,7 @@ class Preview { if (is_null($this->preview)) { $preview = null; - foreach (self::$providers as $supportedMimeType => $provider) { + foreach (self::getProviders() as $supportedMimeType => $provider) { if (!preg_match($supportedMimeType, $this->mimeType)) { continue; } @@ -757,6 +757,14 @@ class Preview { array_multisort($keys, SORT_DESC, self::$providers); } + protected static function getProviders() { + if (empty(self::$providers)) { + self::initProviders(); + } + + return self::$providers; + } + protected static function registerCoreProviders() { self::registerProvider('OC\Preview\TXT'); self::registerProvider('OC\Preview\MarkDown'); @@ -914,60 +922,6 @@ class Preview { $preview->deleteAllPreviews(); } - /** - * Check if a preview can be generated for a file - * - * @param \OC\Files\FileInfo $file - * @return bool - */ - public static function isAvailable(\OC\Files\FileInfo $file) { - if (!\OC_Config::getValue('enable_previews', true)) { - return false; - } - - $mount = $file->getMountPoint(); - if ($mount and !$mount->getOption('previews', true)){ - return false; - } - - //check if there are preview backends - if (empty(self::$providers)) { - self::initProviders(); - } - - foreach (self::$providers as $supportedMimeType => $provider) { - /** - * @var \OC\Preview\Provider $provider - */ - if (preg_match($supportedMimeType, $file->getMimetype())) { - return $provider->isAvailable($file); - } - } - return false; - } - - /** - * @param string $mimeType - * @return bool - */ - public static function isMimeSupported($mimeType) { - if (!\OC_Config::getValue('enable_previews', true)) { - return false; - } - - //check if there are preview backends - if (empty(self::$providers)) { - self::initProviders(); - } - - foreach(self::$providers as $supportedMimetype => $provider) { - if(preg_match($supportedMimetype, $mimeType)) { - return true; - } - } - return false; - } - /** * @param int $fileId * @return string diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index ead67eaeef..34c6130723 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -16,7 +16,7 @@ abstract class Provider { /** * Check if a preview can be generated for $path * - * @param \OC\Files\FileInfo $file + * @param \OCP\Files\FileInfo $file * @return bool */ public function isAvailable($file) { diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 85bf609743..29c205e730 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -12,6 +12,26 @@ use OCP\image; use OCP\IPreview; class PreviewManager implements IPreview { + /** @var array */ + protected $providers = []; + + /** + * In order to improve lazy loading a closure can be registered which will be + * called in case preview providers are actually requested + * + * $callable has to return an instance of \OC\Preview\Provider + * + * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider + * @param \Closure $callable + * @return void + */ + public function registerProvider($mimeTypeRegex, \Closure $callable) { + if (!isset($this->providers[$mimeTypeRegex])) { + $this->providers[$mimeTypeRegex] = []; + } + $this->providers[$mimeTypeRegex][] = $callable; + } + /** * return a preview of a file * @@ -33,16 +53,45 @@ class PreviewManager implements IPreview { * @return boolean */ function isMimeSupported($mimeType = '*') { - return \OC\Preview::isMimeSupported($mimeType); + if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + return false; + } + + $providerMimeTypes = array_keys($this->providers); + foreach ($providerMimeTypes as $supportedMimeType) { + if (preg_match($supportedMimeType, $mimeType)) { + return true; + } + } + return false; } /** * Check if a preview can be generated for a file * - * @param \OC\Files\FileInfo $file + * @param \OCP\Files\FileInfo $file * @return bool */ function isAvailable($file) { - return \OC\Preview::isAvailable($file); + if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + return false; + } + + $mount = $file->getMountPoint(); + if ($mount and !$mount->getOption('previews', true)){ + return false; + } + + foreach ($this->providers as $supportedMimeType => $providers) { + if (preg_match($supportedMimeType, $file->getMimetype())) { + foreach ($providers as $provider) { + /** @var $provider \OC\Preview\Provider */ + if ($provider->isAvailable($file)) { + return true; + } + } + } + } + return false; } } diff --git a/lib/public/ipreview.php b/lib/public/ipreview.php index cc756ef80d..9ebe2e2d1c 100644 --- a/lib/public/ipreview.php +++ b/lib/public/ipreview.php @@ -36,8 +36,18 @@ namespace OCP; /** * This class provides functions to render and show thumbnails and previews of files */ -interface IPreview -{ +interface IPreview { + /** + * In order to improve lazy loading a closure can be registered which will be + * called in case preview providers are actually requested + * + * $callable has to return an instance of \OC\Preview\Provider + * + * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider + * @param \Closure $callable + * @return void + */ + public function registerProvider($mimeTypeRegex, \Closure $callable); /** * Return a preview of a file