|
|
@@ -29,29 +29,11 @@ use OC\ForbiddenException; |
|
|
|
use OCP\Files\NotFoundException; |
|
|
|
use OCP\Files\StorageInvalidException; |
|
|
|
use OCP\Files\StorageNotAvailableException; |
|
|
|
use OCP\Http\Client\LocalServerException; |
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
|
|
|
|
class Scanner extends \OC\Files\Cache\Scanner { |
|
|
|
/** @var \OCA\Files_Sharing\External\Storage */ |
|
|
|
protected $storage; |
|
|
|
|
|
|
|
/** {@inheritDoc} */ |
|
|
|
public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $lock = true) { |
|
|
|
try { |
|
|
|
if (!$this->storage->remoteIsOwnCloud()) { |
|
|
|
return parent::scan($path, $recursive, $reuse, $lock); |
|
|
|
} |
|
|
|
} catch (LocalServerException $e) { |
|
|
|
// Scanner doesn't have dependency injection |
|
|
|
\OC::$server->get(LoggerInterface::class) |
|
|
|
->warning('Trying to scan files inside invalid external storage: ' . $this->storage->getRemote() . ' for mountpoint ' . $this->storage->getMountPoint() . ' and id ' . $this->storage->getId()); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
$this->scanAll(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Scan a single file and store it in the cache. |
|
|
|
* If an exception happened while accessing the external storage, |
|
|
@@ -81,56 +63,4 @@ class Scanner extends \OC\Files\Cache\Scanner { |
|
|
|
$this->storage->checkStorageAvailability(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Checks the remote share for changes. |
|
|
|
* If changes are available, scan them and update |
|
|
|
* the cache. |
|
|
|
* @throws NotFoundException |
|
|
|
* @throws StorageInvalidException |
|
|
|
* @throws \Exception |
|
|
|
*/ |
|
|
|
public function scanAll() { |
|
|
|
try { |
|
|
|
$data = $this->storage->getShareInfo(); |
|
|
|
} catch (\Exception $e) { |
|
|
|
$this->storage->checkStorageAvailability(); |
|
|
|
throw new \Exception( |
|
|
|
'Error while scanning remote share: "' . |
|
|
|
$this->storage->getRemote() . '" ' . |
|
|
|
$e->getMessage() |
|
|
|
); |
|
|
|
} |
|
|
|
if ($data['status'] === 'success') { |
|
|
|
$this->addResult($data['data'], ''); |
|
|
|
} else { |
|
|
|
throw new \Exception( |
|
|
|
'Error while scanning remote share: "' . |
|
|
|
$this->storage->getRemote() . '"' |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @param array $data |
|
|
|
* @param string $path |
|
|
|
*/ |
|
|
|
private function addResult($data, $path) { |
|
|
|
$id = $this->cache->put($path, $data); |
|
|
|
if (isset($data['children'])) { |
|
|
|
$children = []; |
|
|
|
foreach ($data['children'] as $child) { |
|
|
|
$children[$child['name']] = true; |
|
|
|
$this->addResult($child, ltrim($path . '/' . $child['name'], '/')); |
|
|
|
} |
|
|
|
|
|
|
|
$existingCache = $this->cache->getFolderContentsById($id); |
|
|
|
foreach ($existingCache as $existingChild) { |
|
|
|
// if an existing child is not in the new data, remove it |
|
|
|
if (!isset($children[$existingChild['name']])) { |
|
|
|
$this->cache->remove(ltrim($path . '/' . $existingChild['name'], '/')); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |