You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.2 KiB
146 lines
3.2 KiB
<?php |
|
/** |
|
* @copyright Copyright (c) 2016, ownCloud, Inc. |
|
* |
|
* @author Joas Schilling <coding@schilljs.com> |
|
* |
|
* @license AGPL-3.0 |
|
* |
|
* This code is free software: you can redistribute it and/or modify |
|
* it under the terms of the GNU Affero General Public License, version 3, |
|
* as published by the Free Software Foundation. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU Affero General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Affero General Public License, version 3, |
|
* along with this program. If not, see <http://www.gnu.org/licenses/> |
|
* |
|
*/ |
|
|
|
namespace OCA\Activity; |
|
|
|
|
|
use OC\Files\View; |
|
use OCP\Files\NotFoundException; |
|
|
|
class ViewInfoCache { |
|
|
|
/** @var array */ |
|
protected $cachePath; |
|
/** @var array */ |
|
protected $cacheId; |
|
|
|
/** @var \OC\Files\View */ |
|
protected $view; |
|
|
|
/** |
|
* @param View $view |
|
*/ |
|
public function __construct(View $view) { |
|
$this->view = $view; |
|
} |
|
|
|
/** |
|
* @param string $user |
|
* @param string $path |
|
* @return array |
|
*/ |
|
public function getInfoByPath($user, $path) { |
|
if (isset($this->cachePath[$user][$path])) { |
|
return $this->cachePath[$user][$path]; |
|
} |
|
|
|
return $this->findInfoByPath($user, $path); |
|
} |
|
|
|
/** |
|
* @param string $user |
|
* @param int $fileId |
|
* @param string $path |
|
* @return array |
|
*/ |
|
public function getInfoById($user, $fileId, $path) { |
|
if (isset($this->cacheId[$user][$fileId])) { |
|
$cache = $this->cacheId[$user][$fileId]; |
|
if ($cache['path'] === null) { |
|
$cache['path'] = $path; |
|
} |
|
return $cache; |
|
} |
|
|
|
return $this->findInfoById($user, $fileId, $path); |
|
} |
|
|
|
/** |
|
* @param string $user |
|
* @param string $path |
|
* @return array |
|
*/ |
|
protected function findInfoByPath($user, $path) { |
|
$this->view->chroot('/' . $user . '/files'); |
|
|
|
$exists = $this->view->file_exists($path); |
|
|
|
$this->cachePath[$user][$path] = [ |
|
'path' => $path, |
|
'exists' => $exists, |
|
'is_dir' => $exists ? (bool)$this->view->is_dir($path) : false, |
|
'view' => '', |
|
]; |
|
|
|
return $this->cachePath[$user][$path]; |
|
} |
|
|
|
/** |
|
* @param string $user |
|
* @param int $fileId |
|
* @param string $filePath |
|
* @return array |
|
*/ |
|
protected function findInfoById($user, $fileId, $filePath) { |
|
$this->view->chroot('/' . $user . '/files'); |
|
|
|
$cache = [ |
|
'path' => $filePath, |
|
'exists' => false, |
|
'is_dir' => false, |
|
'view' => '', |
|
]; |
|
|
|
$notFound = false; |
|
try { |
|
$path = $this->view->getPath($fileId); |
|
|
|
$cache['path'] = $path; |
|
$cache['is_dir'] = $this->view->is_dir($path); |
|
$cache['exists'] = true; |
|
} catch (NotFoundException $e) { |
|
// The file was not found in the normal view, maybe it is in |
|
// the trashbin? |
|
$this->view->chroot('/' . $user . '/files_trashbin'); |
|
|
|
try { |
|
$path = $this->view->getPath($fileId); |
|
|
|
$cache = [ |
|
'path' => substr($path, strlen('/files')), |
|
'exists' => true, |
|
'is_dir' => (bool)$this->view->is_dir($path), |
|
'view' => 'trashbin', |
|
]; |
|
} catch (NotFoundException $e) { |
|
$notFound = true; |
|
} |
|
} |
|
|
|
$this->cacheId[$user][$fileId] = $cache; |
|
if ($notFound) { |
|
$this->cacheId[$user][$fileId]['path'] = null; |
|
} |
|
|
|
return $cache; |
|
} |
|
}
|
|
|