@ -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' ], '/' ));
}
}
}
}
}