@ -50,6 +50,22 @@ class Dropbox extends \OC\Files\Storage\Common {
}
}
private function deleteMetaData($path) {
$path = $this->root.$path;
if (isset($this->metaData[$path])) {
unset($this->metaData[$path]);
return true;
}
return false;
}
/**
* @brief Returns the path's metadata
* @param $path path for which to return the metadata
* @param $list if true, also return the directory's contents
* @return directory contents if $list is true, file metadata if $list is
* false, null if the file doesn't exist or "false" if the operation failed
*/
private function getMetaData($path, $list = false) {
$path = $this->root.$path;
if ( ! $list & & isset($this->metaData[$path])) {
@ -62,24 +78,35 @@ class Dropbox extends \OC\Files\Storage\Common {
\OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
return false;
}
$contents = array();
if ($response & & isset($response['contents'])) {
$contents = $response['contents'];
// Cache folder's contents
foreach ($contents as $file) {
$this->metaData[$path.'/'.basename($file['path'])] = $file;
foreach ($response['contents'] as $file) {
if (!isset($file['is_deleted']) || !$file['is_deleted']) {
$this->metaData[$path.'/'.basename($file['path'])] = $file;
$contents[] = $file;
}
}
unset($response['contents']);
}
if (!isset($response['is_deleted']) || !$response['is_deleted']) {
$this->metaData[$path] = $response;
}
$this->metaData[$path] = $response;
// Return contents of folder only
return $contents;
} else {
try {
$response = $this->dropbox->getMetaData($path, 'false');
$this->metaData[$path] = $response;
return $response;
if (!isset($response['is_deleted']) || !$response['is_deleted']) {
$this->metaData[$path] = $response;
return $response;
}
return null;
} catch (\Exception $exception) {
if ($exception instanceof \Dropbox_Exception_NotFound) {
// don't log, might be a file_exist check
return false;
}
\OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
return false;
}
@ -108,7 +135,7 @@ class Dropbox extends \OC\Files\Storage\Common {
public function opendir($path) {
$contents = $this->getMetaData($path, true);
if ($contents) {
if ($contents !== false ) {
$files = array();
foreach ($contents as $file) {
$files[] = basename($file['path']);
@ -157,9 +184,9 @@ class Dropbox extends \OC\Files\Storage\Common {
}
public function unlink($path) {
$path = $this->root.$path;
try {
$this->dropbox->delete($path);
$this->dropbox->delete($this->root.$path);
$this->deleteMetaData($path);
return true;
} catch (\Exception $exception) {
\OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
@ -168,10 +195,14 @@ class Dropbox extends \OC\Files\Storage\Common {
}
public function rename($path1, $path2) {
$path1 = $this->root.$path1;
$path2 = $this->root.$path2;
try {
$this->dropbox->move($path1, $path2);
// overwrite if target file exists and is not a directory
$destMetaData = $this->getMetaData($path2);
if (isset($destMetaData) & & $destMetaData !== false & & !$destMetaData['is_dir']) {
$this->unlink($path2);
}
$this->dropbox->move($this->root.$path1, $this->root.$path2);
$this->deleteMetaData($path1);
return true;
} catch (\Exception $exception) {
\OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
@ -274,6 +305,7 @@ class Dropbox extends \OC\Files\Storage\Common {
} else {
$this->file_put_contents($path, '');
}
return true;
}
}