protected function cacheDir($path)
{
$this->dirsCache[$path] = array();
$hasDir = false;
$list = array();
$encPath = $this->convEncIn($path);
foreach (ftp_rawlist($this->connect, $encPath) as $raw) {
if ($stat = $this->parseRaw($raw, $encPath)) {
$list[] = $stat;
}
}
$list = $this->convEncOut($list);
$prefix = $path === $this->separator ? $this->separator : $path . $this->separator;
$targets = array();
foreach ($list as $stat) {
$p = $prefix . $stat['name'];
if (isset($stat['target'])) {
// stat later
$targets[$stat['name']] = $stat['target'];
} else {
$stat = $this->updateCache($p, $stat);
if (empty($stat['hidden'])) {
if (!$hasDir && $stat['mime'] === 'directory') {
$hasDir = true;
}
$this->dirsCache[$path][] = $p;
}
}
}
// stat link targets
foreach ($targets as $name => $target) {
$stat = array();
$stat['name'] = $name;
$p = $prefix . $name;
$cacheDirTarget = $this->cacheDirTarget;
$this->cacheDirTarget = $this->convEncIn($target, true);
if ($tstat = $this->stat($target)) {
$stat['size'] = $tstat['size'];
$stat['alias'] = $target;
$stat['thash'] = $tstat['hash'];
$stat['mime'] = $tstat['mime'];
$stat['read'] = $tstat['read'];
$stat['write'] = $tstat['write'];
if (isset($tstat['ts'])) {
$stat['ts'] = $tstat['ts'];
}
if (isset($tstat['owner'])) {
$stat['owner'] = $tstat['owner'];
}
if (isset($tstat['group'])) {
$stat['group'] = $tstat['group'];
}
if (isset($tstat['perm'])) {
$stat['perm'] = $tstat['perm'];
}
if (isset($tstat['isowner'])) {
$stat['isowner'] = $tstat['isowner'];
}
} else {
$stat['mime'] = 'symlink-broken';
$stat['read'] = false;
$stat['write'] = false;
$stat['size'] = 0;
}
$this->cacheDirTarget = $cacheDirTarget;
$stat = $this->updateCache($p, $stat);
if (empty($stat['hidden'])) {
if (!$hasDir && $stat['mime'] === 'directory') {
$hasDir = true;
}
$this->dirsCache[$path][] = $p;
}
}
if (isset($this->sessionCache['subdirs'])) {
$this->sessionCache['subdirs'][$path] = $hasDir;
}
}