- Модуль: webdav
- Путь к файлу: ~/bitrix/modules/webdav/classes/diskdispatcher.php
- Класс: CWebDavDiskDispatcher
- Вызов: CWebDavDiskDispatcher::processActionUpdate
public function processActionUpdate(array $params)
{
$this->checkRequiredParams($params, array('storageExtra', 'storageId', 'name'));
$tmpFile = $parentFolderId = $targetSectionId = $elementId = null;
$storage = $this->getStorageObject($params['storageExtra'], $params['storageId']);
$filename = $params['name'];
$token = empty($params['token'])? null : $params['token'];
$inRoot = (bool)$params['inRoot'];
$isUpdate = (bool)$params['update'];
if($token && !($tmpFile = CWebDavTmpFile::buildByName($token)))
{
throw new Exception('Not found file by token');
}
if(!$storage->isCorrectName($filename, $msg))
{
$tmpFile && ($tmpFile->delete());
return $this->sendResponse(array(
'status' => static::STATUS_DENIED,
'message' => $msg,
));
}
if($inRoot)
{
$storageExtra = $storage->getStorageExtra();
$targetSectionId = $storageExtra['sectionId'];
$parentFolderId = $storageExtra['sectionId'];
}
else
{
$this->checkRequiredParams($params, array('parentExtra'));
$parentFolderExtra = $storage->parseElementExtra($params['parentExtra']);
$targetSectionId = $parentFolderExtra['id'];
$parentFolderId = $parentFolderExtra['id'];
}
if($isUpdate)
{
$this->checkRequiredParams($params, array('id', 'version'));
$version = $params['version'];
$fileExtra = $storage->parseElementExtra($params['extra']);
$elementId = $fileExtra['id'];
$file = $storage->getFile($params['id'], $fileExtra);
if(empty($file))
{
return $this->sendResponse(array(
'status' => static::STATUS_NOT_FOUND,
));
}
if($storage::compareVersion($file['version'], $version) > 0)
{
$file['status'] = static::STATUS_OLD_VERSION;
return $this->sendResponse($file);
}
//todo simple check for move/rename
if($filename != $file['extra']['name'] || $parentFolderId != $file['extra']['sectionId'])
{
if(!$storage->isUnique($filename, $parentFolderId))
{
$file['status'] = static::STATUS_OLD_VERSION;
return $this->sendResponse($file);
}
if($filename != $file['extra']['name'])
{
$file = $storage->renameFile($filename, $elementId, $parentFolderId);
if(!$file)
{
return $this->sendError('Error in rename (update) file');
}
}
if($parentFolderId != $file['extra']['sectionId'])
{
$file = $storage->moveFile($filename, $elementId, $parentFolderId);
}
if(!$file)
{
return $this->sendError('Error in move/rename (update) file');
}
if(!$tmpFile)
{
return $this->sendSuccess($file);
}
}
unset($file);
if($tmpFile) //update content
{
$file = $storage->updateFile($filename, $elementId, $tmpFile);
if($file)
{
CWebDavTools::runEvent(static::ON_AFTER_DISK_FILE_UPDATE, array($file['extra']['id'], $file));
return $this->sendSuccess($file);
}
return $this->sendResponse(array(
'status' => static::STATUS_DENIED,
'message'=> 'Error in updateFile',
));
}
}
else
{
if(!$storage->isUnique($filename, $targetSectionId, $opponentId))
{
$opponentFile = array();
if($opponentId)
{
$opponentFile = $storage->getFile(null, array('id' => $opponentId), true);
}
$opponentFile['status'] = static::STATUS_OLD_VERSION;
return $this->sendResponse($opponentFile);
}
$newFile = $storage->addFile($filename, $targetSectionId, $tmpFile);
if($newFile)
{
CWebDavTools::runEvent(static::ON_AFTER_DISK_FILE_ADD, array($newFile['extra']['id'], $newFile));
return $this->sendSuccess($newFile);
}
//else denied
}
return $this->sendResponse(array(
'status' => static::STATUS_DENIED,
'message'=> 'Error in add/update file',
));
}