aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur Schiwon <blizzz@arthur-schiwon.de>2019-09-03 12:30:10 +0200
committerArthur Schiwon <blizzz@arthur-schiwon.de>2019-09-09 22:56:04 +0200
commit20901c59d47e74179a04ca7938afe1ff131f6576 (patch)
tree3309daca1bd4708d005a610f57e571db6996f4c5
parent0d7f7e5495a56f776e8593e1b6ba80da9e8c0dbd (diff)
downloadnextcloud-server-20901c59d47e74179a04ca7938afe1ff131f6576.tar.gz
nextcloud-server-20901c59d47e74179a04ca7938afe1ff131f6576.zip
emit file events via Dispatcher, too
another step to get rid of hooks and emitters Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
-rw-r--r--lib/private/Files/Node/File.php2
-rw-r--r--lib/private/Files/Node/Folder.php14
-rw-r--r--lib/private/Files/Node/HookConnector.php20
-rw-r--r--lib/private/Files/Node/Node.php24
-rw-r--r--lib/private/Server.php2
5 files changed, 40 insertions, 22 deletions
diff --git a/lib/private/Files/Node/File.php b/lib/private/Files/Node/File.php
index a3eabbcc446..b504c7a29da 100644
--- a/lib/private/Files/Node/File.php
+++ b/lib/private/Files/Node/File.php
@@ -119,7 +119,7 @@ class File extends Node implements \OCP\Files\File {
$fileInfo = $this->getFileInfo();
$this->view->unlink($this->path);
$nonExisting = new NonExistingFile($this->root, $this->view, $this->path, $fileInfo);
- $this->root->emit('\OC\Files', 'postDelete', array($nonExisting));
+ $this->sendHooks(['postDelete'], [$nonExisting]);
$this->exists = false;
$this->fileInfo = null;
} else {
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index 19f04048779..8b2a93ffdc2 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -156,14 +156,12 @@ class Folder extends Node implements \OCP\Files\Folder {
if ($this->checkPermissions(\OCP\Constants::PERMISSION_CREATE)) {
$fullPath = $this->getFullPath($path);
$nonExisting = new NonExistingFolder($this->root, $this->view, $fullPath);
- $this->root->emit('\OC\Files', 'preWrite', array($nonExisting));
- $this->root->emit('\OC\Files', 'preCreate', array($nonExisting));
+ $this->sendHooks(['preWrite', 'preCreate'], [$nonExisting]);
if(!$this->view->mkdir($fullPath)) {
throw new NotPermittedException('Could not create folder');
}
$node = new Folder($this->root, $this->view, $fullPath);
- $this->root->emit('\OC\Files', 'postWrite', array($node));
- $this->root->emit('\OC\Files', 'postCreate', array($node));
+ $this->sendHooks(['postWrite', 'postCreate'], [$node]);
return $node;
} else {
throw new NotPermittedException('No create permission for folder');
@@ -179,14 +177,12 @@ class Folder extends Node implements \OCP\Files\Folder {
if ($this->checkPermissions(\OCP\Constants::PERMISSION_CREATE)) {
$fullPath = $this->getFullPath($path);
$nonExisting = new NonExistingFile($this->root, $this->view, $fullPath);
- $this->root->emit('\OC\Files', 'preWrite', array($nonExisting));
- $this->root->emit('\OC\Files', 'preCreate', array($nonExisting));
+ $this->sendHooks(['preWrite', 'preCreate'], [$nonExisting]);
if (!$this->view->touch($fullPath)) {
throw new NotPermittedException('Could not create path');
}
$node = new File($this->root, $this->view, $fullPath);
- $this->root->emit('\OC\Files', 'postWrite', array($node));
- $this->root->emit('\OC\Files', 'postCreate', array($node));
+ $this->sendHooks(['postWrite', 'postCreate'], [$node]);
return $node;
}
throw new NotPermittedException('No create permission for path');
@@ -341,7 +337,7 @@ class Folder extends Node implements \OCP\Files\Folder {
$fileInfo = $this->getFileInfo();
$this->view->rmdir($this->path);
$nonExisting = new NonExistingFolder($this->root, $this->view, $this->path, $fileInfo);
- $this->root->emit('\OC\Files', 'postDelete', array($nonExisting));
+ $this->sendHooks(['postDelete'], [$nonExisting]);
$this->exists = false;
} else {
throw new NotPermittedException('No delete permission for path');
diff --git a/lib/private/Files/Node/HookConnector.php b/lib/private/Files/Node/HookConnector.php
index f5adcde4a00..4783a71b07b 100644
--- a/lib/private/Files/Node/HookConnector.php
+++ b/lib/private/Files/Node/HookConnector.php
@@ -26,6 +26,8 @@ use OCP\Files\FileInfo;
use OC\Files\Filesystem;
use OC\Files\View;
use OCP\Util;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\EventDispatcher\GenericEvent;
class HookConnector {
/**
@@ -42,6 +44,8 @@ class HookConnector {
* @var FileInfo[]
*/
private $deleteMetaCache = [];
+ /** @var EventDispatcherInterface */
+ private $dispatcher;
/**
* HookConnector constructor.
@@ -49,9 +53,10 @@ class HookConnector {
* @param Root $root
* @param View $view
*/
- public function __construct(Root $root, View $view) {
+ public function __construct(Root $root, View $view, EventDispatcherInterface $dispatcher) {
$this->root = $root;
$this->view = $view;
+ $this->dispatcher = $dispatcher;
}
public function viewToNode() {
@@ -79,72 +84,85 @@ class HookConnector {
public function write($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->root->emit('\OC\Files', 'preWrite', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::preWrite', new GenericEvent($node));
}
public function postWrite($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->root->emit('\OC\Files', 'postWrite', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::postWrite', new GenericEvent($node));
}
public function create($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->root->emit('\OC\Files', 'preCreate', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::preCreate', new GenericEvent($node));
}
public function postCreate($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->root->emit('\OC\Files', 'postCreate', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::postCreate', new GenericEvent($node));
}
public function delete($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->deleteMetaCache[$node->getPath()] = $node->getFileInfo();
$this->root->emit('\OC\Files', 'preDelete', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::preDelete', new GenericEvent($node));
}
public function postDelete($arguments) {
$node = $this->getNodeForPath($arguments['path']);
unset($this->deleteMetaCache[$node->getPath()]);
$this->root->emit('\OC\Files', 'postDelete', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::postDelete', new GenericEvent($node));
}
public function touch($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->root->emit('\OC\Files', 'preTouch', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::preTouch', new GenericEvent($node));
}
public function postTouch($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->root->emit('\OC\Files', 'postTouch', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::postTouch', new GenericEvent($node));
}
public function rename($arguments) {
$source = $this->getNodeForPath($arguments['oldpath']);
$target = $this->getNodeForPath($arguments['newpath']);
$this->root->emit('\OC\Files', 'preRename', [$source, $target]);
+ $this->dispatcher->dispatch('\OCP\Files::preRename', new GenericEvent([$source, $target]));
}
public function postRename($arguments) {
$source = $this->getNodeForPath($arguments['oldpath']);
$target = $this->getNodeForPath($arguments['newpath']);
$this->root->emit('\OC\Files', 'postRename', [$source, $target]);
+ $this->dispatcher->dispatch('\OCP\Files::postRename', new GenericEvent([$source, $target]));
}
public function copy($arguments) {
$source = $this->getNodeForPath($arguments['oldpath']);
$target = $this->getNodeForPath($arguments['newpath']);
$this->root->emit('\OC\Files', 'preCopy', [$source, $target]);
+ $this->dispatcher->dispatch('\OCP\Files::preCopy', new GenericEvent([$source, $target]));
}
public function postCopy($arguments) {
$source = $this->getNodeForPath($arguments['oldpath']);
$target = $this->getNodeForPath($arguments['newpath']);
$this->root->emit('\OC\Files', 'postCopy', [$source, $target]);
+ $this->dispatcher->dispatch('\OCP\Files::postCopy', new GenericEvent([$source, $target]));
}
public function read($arguments) {
$node = $this->getNodeForPath($arguments['path']);
$this->root->emit('\OC\Files', 'read', [$node]);
+ $this->dispatcher->dispatch('\OCP\Files::read', new GenericEvent([$node]));
}
private function getNodeForPath($path) {
diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php
index dc025b79575..c440dd4a8f1 100644
--- a/lib/private/Files/Node/Node.php
+++ b/lib/private/Files/Node/Node.php
@@ -33,6 +33,7 @@ use OCP\Files\FileInfo;
use OCP\Files\InvalidPathException;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
+use Symfony\Component\EventDispatcher\GenericEvent;
// FIXME: this class really should be abstract
class Node implements \OCP\Files\Node {
@@ -104,9 +105,12 @@ class Node implements \OCP\Files\Node {
/**
* @param string[] $hooks
*/
- protected function sendHooks($hooks) {
+ protected function sendHooks($hooks, array $args = null) {
+ $args = !empty($args) ? $args : [$this];
+ $dispatcher = \OC::$server->getEventDispatcher();
foreach ($hooks as $hook) {
- $this->root->emit('\OC\Files', $hook, array($this));
+ $this->root->emit('\OC\Files', $hook, $args);
+ $dispatcher->dispatch('\OCP\Files::' . $hook, new GenericEvent($args));
}
}
@@ -394,14 +398,14 @@ class Node implements \OCP\Files\Node {
$parent = $this->root->get(dirname($targetPath));
if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) {
$nonExisting = $this->createNonExistingNode($targetPath);
- $this->root->emit('\OC\Files', 'preCopy', [$this, $nonExisting]);
- $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]);
+ $this->sendHooks(['preCopy'], [$this, $nonExisting]);
+ $this->sendHooks(['preWrite'], [$nonExisting]);
if (!$this->view->copy($this->path, $targetPath)) {
throw new NotPermittedException('Could not copy ' . $this->path . ' to ' . $targetPath);
}
$targetNode = $this->root->get($targetPath);
- $this->root->emit('\OC\Files', 'postCopy', [$this, $targetNode]);
- $this->root->emit('\OC\Files', 'postWrite', [$targetNode]);
+ $this->sendHooks(['postCopy'], [$this, $targetNode]);
+ $this->sendHooks(['postWrite'], [$targetNode]);
return $targetNode;
} else {
throw new NotPermittedException('No permission to copy to path ' . $targetPath);
@@ -425,14 +429,14 @@ class Node implements \OCP\Files\Node {
)
) {
$nonExisting = $this->createNonExistingNode($targetPath);
- $this->root->emit('\OC\Files', 'preRename', [$this, $nonExisting]);
- $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]);
+ $this->sendHooks(['preRename'], [$this, $nonExisting]);
+ $this->sendHooks(['preWrite'], [$nonExisting]);
if (!$this->view->rename($this->path, $targetPath)) {
throw new NotPermittedException('Could not move ' . $this->path . ' to ' . $targetPath);
}
$targetNode = $this->root->get($targetPath);
- $this->root->emit('\OC\Files', 'postRename', [$this, $targetNode]);
- $this->root->emit('\OC\Files', 'postWrite', [$targetNode]);
+ $this->sendHooks(['postRename'], [$this, $targetNode]);
+ $this->sendHooks(['postWrite'], [$targetNode]);
$this->path = $targetPath;
return $targetNode;
} else {
diff --git a/lib/private/Server.php b/lib/private/Server.php
index bce4f0feaef..433ee044fa4 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -298,7 +298,7 @@ class Server extends ServerContainer implements IServerContainer {
$this->getLogger(),
$this->getUserManager()
);
- $connector = new HookConnector($root, $view);
+ $connector = new HookConnector($root, $view, $c->getEventDispatcher());
$connector->viewToNode();
$previewConnector = new \OC\Preview\WatcherConnector($root, $c->getSystemConfig());