diff --git a/lib/private/Preview/Generator.php b/lib/private/Preview/Generator.php index 3d4e9bf367..32a732d858 100644 --- a/lib/private/Preview/Generator.php +++ b/lib/private/Preview/Generator.php @@ -32,6 +32,8 @@ use OCP\IConfig; use OCP\IImage; use OCP\IPreview; use OCP\Preview\IProvider; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\GenericEvent; class Generator { @@ -43,23 +45,28 @@ class Generator { private $appData; /** @var GeneratorHelper */ private $helper; + /** @var EventDispatcherInterface */ + private $eventDispatcher; /** * @param IConfig $config * @param IPreview $previewManager * @param IAppData $appData * @param GeneratorHelper $helper + * @param EventDispatcherInterface $eventDispatcher */ public function __construct( IConfig $config, IPreview $previewManager, IAppData $appData, - GeneratorHelper $helper + GeneratorHelper $helper, + EventDispatcherInterface $eventDispatcher ) { $this->config = $config; $this->previewManager = $previewManager; $this->appData = $appData; $this->helper = $helper; + $this->eventDispatcher = $eventDispatcher; } /** @@ -78,6 +85,16 @@ class Generator { * @throws NotFoundException */ public function getPreview(File $file, $width = -1, $height = -1, $crop = false, $mode = IPreview::MODE_FILL, $mimeType = null) { + $this->eventDispatcher->dispatch( + IPreview::EVENT, + new GenericEvent($file,[ + 'width' => $width, + 'height' => $height, + 'crop' => $crop, + 'mode' => $mode + ]) + ); + if ($mimeType === null) { $mimeType = $file->getMimeType(); } diff --git a/lib/private/PreviewManager.php b/lib/private/PreviewManager.php index 600557da5a..36b3730a72 100644 --- a/lib/private/PreviewManager.php +++ b/lib/private/PreviewManager.php @@ -35,6 +35,7 @@ use OCP\Files\SimpleFS\ISimpleFile; use OCP\IConfig; use OCP\IPreview; use OCP\Preview\IProvider; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; class PreviewManager implements IPreview { /** @var IConfig */ @@ -46,6 +47,9 @@ class PreviewManager implements IPreview { /** @var IAppData */ protected $appData; + /** @var EventDispatcherInterface */ + protected $eventDispatcher; + /** @var Generator */ private $generator; @@ -65,16 +69,21 @@ class PreviewManager implements IPreview { protected $defaultProviders; /** - * Constructor + * PreviewManager constructor. * - * @param \OCP\IConfig $config + * @param IConfig $config + * @param IRootFolder $rootFolder + * @param IAppData $appData + * @param EventDispatcherInterface $eventDispatcher */ public function __construct(IConfig $config, IRootFolder $rootFolder, - IAppData $appData) { + IAppData $appData, + EventDispatcherInterface $eventDispatcher) { $this->config = $config; $this->rootFolder = $rootFolder; $this->appData = $appData; + $this->eventDispatcher = $eventDispatcher; } /** @@ -165,7 +174,8 @@ class PreviewManager implements IPreview { $this->appData, new GeneratorHelper( $this->rootFolder - ) + ), + $this->eventDispatcher ); } diff --git a/lib/private/Server.php b/lib/private/Server.php index c6cfa018be..1d3d588e9f 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -123,7 +123,8 @@ class Server extends ServerContainer implements IServerContainer { return new PreviewManager( $c->getConfig(), $c->getRootFolder(), - $c->getAppDataDir('preview') + $c->getAppDataDir('preview'), + $c->getEventDispatcher() ); }); diff --git a/lib/public/IPreview.php b/lib/public/IPreview.php index cddf7fc6a6..a1a03fee3e 100644 --- a/lib/public/IPreview.php +++ b/lib/public/IPreview.php @@ -43,6 +43,11 @@ use OCP\Files\NotFoundException; */ interface IPreview { + /** + * @since 9.2.0 + */ + const EVENT = self::class . ':' . 'PreviewRequested'; + const MODE_FILL = 'fill'; const MODE_COVER = 'cover'; diff --git a/tests/lib/Preview/GeneratorTest.php b/tests/lib/Preview/GeneratorTest.php index d64a0b912e..ddb24cdb3e 100644 --- a/tests/lib/Preview/GeneratorTest.php +++ b/tests/lib/Preview/GeneratorTest.php @@ -33,6 +33,8 @@ use OCP\IConfig; use OCP\IImage; use OCP\IPreview; use OCP\Preview\IProvider; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\GenericEvent; class GeneratorTest extends \Test\TestCase { @@ -48,6 +50,9 @@ class GeneratorTest extends \Test\TestCase { /** @var GeneratorHelper|\PHPUnit_Framework_MockObject_MockObject */ private $helper; + /** @var EventDispatcherInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $eventDispatcher; + /** @var Generator */ private $generator; @@ -58,12 +63,14 @@ class GeneratorTest extends \Test\TestCase { $this->previewManager = $this->createMock(IPreview::class); $this->appData = $this->createMock(IAppData::class); $this->helper = $this->createMock(GeneratorHelper::class); + $this->eventDispatcher = $this->createMock(EventDispatcherInterface::class); $this->generator = new Generator( $this->config, $this->previewManager, $this->appData, - $this->helper + $this->helper, + $this->eventDispatcher ); } @@ -96,6 +103,17 @@ class GeneratorTest extends \Test\TestCase { ->with($this->equalTo('128-128.png')) ->willReturn($previewFile); + $this->eventDispatcher->expects($this->once()) + ->method('dispatch') + ->with( + $this->equalTo(IPreview::EVENT), + $this->callback(function(GenericEvent $event) use ($file) { + return $event->getSubject() === $file && + $event->getArgument('width') === 100 && + $event->getArgument('height') === 100; + }) + ); + $result = $this->generator->getPreview($file, 100, 100); $this->assertSame($previewFile, $result); } @@ -204,6 +222,17 @@ class GeneratorTest extends \Test\TestCase { ->method('putContent') ->with('my resized data'); + $this->eventDispatcher->expects($this->once()) + ->method('dispatch') + ->with( + $this->equalTo(IPreview::EVENT), + $this->callback(function(GenericEvent $event) use ($file) { + return $event->getSubject() === $file && + $event->getArgument('width') === 100 && + $event->getArgument('height') === 100; + }) + ); + $result = $this->generator->getPreview($file, 100, 100); $this->assertSame($previewFile, $result); } @@ -217,6 +246,19 @@ class GeneratorTest extends \Test\TestCase { ->with('invalidType') ->willReturn(false); + $this->eventDispatcher->expects($this->once()) + ->method('dispatch') + ->with( + $this->equalTo(IPreview::EVENT), + $this->callback(function(GenericEvent $event) use ($file) { + return $event->getSubject() === $file && + $event->getArgument('width') === 0 && + $event->getArgument('height') === 0 && + $event->getArgument('crop') === true && + $event->getArgument('mode') === IPreview::MODE_COVER; + }) + ); + $this->generator->getPreview($file, 0, 0, true, IPreview::MODE_COVER, 'invalidType'); } @@ -242,6 +284,17 @@ class GeneratorTest extends \Test\TestCase { $this->previewManager->method('getProviders') ->willReturn([]); + $this->eventDispatcher->expects($this->once()) + ->method('dispatch') + ->with( + $this->equalTo(IPreview::EVENT), + $this->callback(function(GenericEvent $event) use ($file) { + return $event->getSubject() === $file && + $event->getArgument('width') === 100 && + $event->getArgument('height') === 100; + }) + ); + $this->expectException(NotFoundException::class); $this->generator->getPreview($file, 100, 100); } @@ -332,6 +385,19 @@ class GeneratorTest extends \Test\TestCase { ->with($this->equalTo($filename)) ->willReturn($preview); + $this->eventDispatcher->expects($this->once()) + ->method('dispatch') + ->with( + $this->equalTo(IPreview::EVENT), + $this->callback(function(GenericEvent $event) use ($file, $reqX, $reqY, $crop, $mode) { + return $event->getSubject() === $file && + $event->getArgument('width') === $reqX && + $event->getArgument('height') === $reqY && + $event->getArgument('crop') === $crop && + $event->getArgument('mode') === $mode; + }) + ); + $result = $this->generator->getPreview($file, $reqX, $reqY, $crop, $mode); $this->assertSame($preview, $result); }