summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2023-09-18 15:00:38 +0200
committerRobin Appelman <robin@icewind.nl>2023-09-19 11:43:29 +0200
commit5e347553bc4de6f7adb682173775fac3cda00114 (patch)
tree7482ddae490c036b0954658f50a70b067cc75fb7 /lib
parente0c778f769a10a1f3edc365cc7aa115f119937aa (diff)
downloadnextcloud-server-5e347553bc4de6f7adb682173775fac3cda00114.tar.gz
nextcloud-server-5e347553bc4de6f7adb682173775fac3cda00114.zip
add method to create a node from cache entry + mountpoint
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Files/Node/LazyRoot.php7
-rw-r--r--lib/private/Files/Node/Node.php2
-rw-r--r--lib/private/Files/Node/Root.php26
-rw-r--r--lib/public/Files/IRootFolder.php12
4 files changed, 46 insertions, 1 deletions
diff --git a/lib/private/Files/Node/LazyRoot.php b/lib/private/Files/Node/LazyRoot.php
index ce140124f55..680e80cb45e 100644
--- a/lib/private/Files/Node/LazyRoot.php
+++ b/lib/private/Files/Node/LazyRoot.php
@@ -22,7 +22,10 @@
*/
namespace OC\Files\Node;
+use OCP\Files\Cache\ICacheEntry;
use OCP\Files\IRootFolder;
+use OCP\Files\Mount\IMountPoint;
+use OCP\Files\Node as INode;
/**
* Class LazyRoot
@@ -52,4 +55,8 @@ class LazyRoot extends LazyFolder implements IRootFolder {
public function getByIdInPath(int $id, string $path) {
return $this->__call(__FUNCTION__, func_get_args());
}
+
+ public function getNodeFromCacheEntryAndMount(ICacheEntry $cacheEntry, IMountPoint $mountPoint): INode {
+ return $this->getRootFolder()->getNodeFromCacheEntryAndMount($cacheEntry, $mountPoint);
+ }
}
diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php
index 9729f79aae3..385d45f1e3e 100644
--- a/lib/private/Files/Node/Node.php
+++ b/lib/private/Files/Node/Node.php
@@ -69,7 +69,7 @@ class Node implements INode {
* @param string $path
* @param FileInfo $fileInfo
*/
- public function __construct(IRootFolder $root, $view, $path, $fileInfo = null, ?Node $parent = null, bool $infoHasSubMountsIncluded = true) {
+ public function __construct(IRootFolder $root, $view, $path, $fileInfo = null, ?INode $parent = null, bool $infoHasSubMountsIncluded = true) {
if (Filesystem::normalizePath($view->getRoot()) !== '/') {
throw new PreConditionNotMetException('The view passed to the node should not have any fake root set');
}
diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php
index 7bd88981ff2..1195b644083 100644
--- a/lib/private/Files/Node/Root.php
+++ b/lib/private/Files/Node/Root.php
@@ -41,6 +41,7 @@ use OC\Files\View;
use OC\Hooks\PublicEmitter;
use OC\User\NoUserException;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Config\IUserMountCache;
use OCP\Files\Events\Node\FilesystemTornDownEvent;
use OCP\Files\IRootFolder;
@@ -487,4 +488,29 @@ class Root extends Folder implements IRootFolder {
});
return $folders;
}
+
+ public function getNodeFromCacheEntryAndMount(ICacheEntry $cacheEntry, IMountPoint $mountPoint): INode {
+ $path = $cacheEntry->getPath();
+ $fullPath = $mountPoint->getMountPoint() . $path;
+ // todo: LazyNode?
+ $info = new FileInfo($fullPath, $mountPoint->getStorage(), $path, $cacheEntry, $mountPoint);
+ $parentPath = dirname($fullPath);
+ $parent = new LazyFolder($this, function () use ($parentPath) {
+ $parent = $this->get($parentPath);
+ if ($parent instanceof \OCP\Files\Folder) {
+ return $parent;
+ } else {
+ throw new \Exception("parent $parentPath is not a folder");
+ }
+ }, [
+ 'path' => $parentPath,
+ ]);
+ $isDir = $info->getType() === FileInfo::TYPE_FOLDER;
+ $view = new View('');
+ if ($isDir) {
+ return new Folder($this, $view, $path, $info, $parent);
+ } else {
+ return new File($this, $view, $path, $info, $parent);
+ }
+ }
}
diff --git a/lib/public/Files/IRootFolder.php b/lib/public/Files/IRootFolder.php
index 1fee0b3595e..44f0ba5f2e1 100644
--- a/lib/public/Files/IRootFolder.php
+++ b/lib/public/Files/IRootFolder.php
@@ -26,7 +26,9 @@ namespace OCP\Files;
use OC\Hooks\Emitter;
use OC\User\NoUserException;
+use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Mount\IMountPoint;
+use OCP\Files\Node as INode;
/**
* Interface IRootFolder
@@ -65,6 +67,16 @@ interface IRootFolder extends Folder, Emitter {
public function getMountsIn(string $mountPoint): array;
/**
+ * Create a `Node` for a file or folder from the cache entry and mountpoint
+ *
+ * @param ICacheEntry $cacheEntry
+ * @param IMountPoint $mountPoint
+ * @return Node
+ * @since 28.0.0
+ */
+ public function getNodeFromCacheEntryAndMount(ICacheEntry $cacheEntry, IMountPoint $mountPoint): INode;
+
+ /**
* @since 28.0.0
*/
public function getMount(string $mountPoint): IMountPoint;