From: Robin Appelman Date: Thu, 5 Mar 2015 10:49:15 +0000 (+0100) Subject: Detect storage full when doing cross storage copy/move X-Git-Tag: v8.1.0alpha1~15^2~4 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=404773940daf9c5a686b92d65dd39fb44d766050;p=nextcloud-server.git Detect storage full when doing cross storage copy/move --- diff --git a/lib/private/files/storage/wrapper/quota.php b/lib/private/files/storage/wrapper/quota.php index 3c0fda98dad..92d749a814f 100644 --- a/lib/private/files/storage/wrapper/quota.php +++ b/lib/private/files/storage/wrapper/quota.php @@ -55,9 +55,14 @@ class Quota extends Wrapper { /** * @param string $path + * @param \OC\Files\Storage\Storage $storage */ - protected function getSize($path) { - $cache = $this->getCache(); + protected function getSize($path, $storage = null) { + if (is_null($storage)) { + $cache = $this->getCache(); + } else { + $cache = $storage->getCache(); + } $data = $cache->get($path); if (is_array($data) and isset($data['size'])) { return $data['size']; @@ -141,4 +146,34 @@ class Quota extends Wrapper { return $source; } } + + /** + * @param \OCP\Files\Storage $sourceStorage + * @param string $sourceInternalPath + * @param string $targetInternalPath + * @return bool + */ + public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) { + $free = $this->free_space(''); + if ($free < 0 or $this->getSize($sourceInternalPath, $sourceStorage) < $free) { + return $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath); + } else { + return false; + } + } + + /** + * @param \OCP\Files\Storage $sourceStorage + * @param string $sourceInternalPath + * @param string $targetInternalPath + * @return bool + */ + public function moveFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) { + $free = $this->free_space(''); + if ($free < 0 or $this->getSize($sourceInternalPath, $sourceStorage) < $free) { + return $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath); + } else { + return false; + } + } }