protected function open($args)
{
$target = $args['target'];
$init = !empty($args['init']);
$tree = !empty($args['tree']);
$volume = $this->volume($target);
$cwd = $volume ? $volume->dir($target) : false;
$hash = $init ? 'default folder' : '#' . $target;
$sleep = 0;
$compare = '';
// on init request we can get invalid dir hash -
// dir which can not be opened now, but remembered by client,
// so open default dir
if ((!$cwd || !$cwd['read']) && $init) {
$volume = $this->default;
$cwd = $volume->dir($volume->defaultPath());
}
if (!$cwd) {
return array('error' => $this->error(self::ERROR_OPEN, $hash, self::ERROR_DIR_NOT_FOUND));
}
if (!$cwd['read']) {
return array('error' => $this->error(self::ERROR_OPEN, $hash, self::ERROR_PERM_DENIED));
}
$files = array();
// get other volume root
if ($tree) {
foreach ($this->volumes as $id => $v) {
$files[] = $v->file($v->root());
}
}
// get current working directory files list
if (($ls = $volume->scandir($cwd['hash'])) === false) {
return array('error' => $this->error(self::ERROR_OPEN, $cwd['name'], $volume->error()));
}
// long polling mode
if ($args['compare']) {
$sleep = max(1, (int) $volume->getOption('lsPlSleep'));
$standby = (int) $volume->getOption('plStandby');
if ($standby > 0 && $sleep > $standby) {
$standby = $sleep;
}
$limit = max(0, floor($standby / $sleep)) + 1;
do {
elFinder::extendTimeLimit(30 + $sleep);
$_mtime = 0;
foreach ($ls as $_f) {
$_mtime = max($_mtime, $_f['ts']);
}
$compare = strval(count($ls)) . ':' . strval($_mtime);
if ($compare !== $args['compare']) {
break;
}
if (--$limit) {
sleep($sleep);
$volume->clearstatcache();
if (($ls = $volume->scandir($cwd['hash'])) === false) {
break;
}
}
} while ($limit);
if ($ls === false) {
return array('error' => $this->error(self::ERROR_OPEN, $cwd['name'], $volume->error()));
}
}
if ($ls) {
if ($files) {
$files = array_merge($files, $ls);
} else {
$files = $ls;
}
}
$result = array('cwd' => $cwd, 'options' => $volume->options($cwd['hash']), 'files' => $files);
if ($compare) {
$result['cwd']['compare'] = $compare;
}
if (!empty($args['init'])) {
$result['api'] = $this->version;
$result['uplMaxSize'] = ini_get('upload_max_filesize');
$result['uplMaxFile'] = ini_get('max_file_uploads');
$result['netDrivers'] = array_keys(self::$netDrivers);
$result['maxTargets'] = $this->maxTargets;
if ($volume) {
$result['cwd']['root'] = $volume->root();
}
}
return $result;
}