/** * For delete or remove, check that we are not removing from a shared directory. * If we are, try to restore the file * * Return true if the problem is handled. */ bool PropagateItemJob::checkForProblemsWithShared(int httpStatusCode, const QString& msg) { PropagateItemJob *newJob = NULL; if( httpStatusCode == 403 && _propagator->isInSharedDirectory(_item._file )) { if( !_item._isDirectory ) { SyncFileItem downloadItem(_item); if (downloadItem._instruction == CSYNC_INSTRUCTION_NEW) { // don't try to recover pushing new files return false; } else if (downloadItem._instruction == CSYNC_INSTRUCTION_SYNC) { // we modified the file locally, jsut create a conflict then downloadItem._instruction = CSYNC_INSTRUCTION_CONFLICT; // HACK to avoid continuation: See task #1448: We do not know the _modtime from the // server, at this point, so just set the current one. (rather than the one locally) downloadItem._modtime = Utility::qDateTimeToTime_t(QDateTime::currentDateTime()); } else { // the file was removed or renamed, just recover the old one downloadItem._instruction = CSYNC_INSTRUCTION_SYNC; } downloadItem._direction = SyncFileItem::Down; newJob = new PropagateDownloadFileLegacy(_propagator, downloadItem); } else { // Directories are harder to recover. // But just re-create the directory, next sync will be able to recover the files SyncFileItem mkdirItem(_item); mkdirItem._instruction = CSYNC_INSTRUCTION_SYNC; mkdirItem._direction = SyncFileItem::Down; newJob = new PropagateLocalMkdir(_propagator, mkdirItem); // Also remove the inodes and fileid from the db so no further renames are tried for // this item. _propagator->_journal->avoidRenamesOnNextSync(_item._file); } if( newJob ) { newJob->setRestoreJobMsg(msg); _restoreJob.reset(newJob); connect(_restoreJob.data(), SIGNAL(completed(SyncFileItem)), this, SLOT(slotRestoreJobCompleted(SyncFileItem))); QMetaObject::invokeMethod(newJob, "start"); } return true; } return false; }
/** * For delete or remove, check that we are not removing from a shared directory. * If we are, try to restore the file * * Return true if the problem is handled. */ bool PropagateItemJob::checkForProblemsWithShared(int httpStatusCode, const QString& msg) { PropagateItemJob *newJob = NULL; if( httpStatusCode == 403 && _propagator->isInSharedDirectory(_item._file )) { if( _item._type != SyncFileItem::Directory ) { SyncFileItem downloadItem(_item); if (downloadItem._instruction == CSYNC_INSTRUCTION_NEW) { // don't try to recover pushing new files return false; } else if (downloadItem._instruction == CSYNC_INSTRUCTION_SYNC) { // we modified the file locally, jsut create a conflict then downloadItem._instruction = CSYNC_INSTRUCTION_CONFLICT; } else { // the file was removed or renamed, just recover the old one downloadItem._instruction = CSYNC_INSTRUCTION_SYNC; } downloadItem._dir = SyncFileItem::Down; newJob = new PropagateDownloadFileLegacy(_propagator, downloadItem); } else { // Directories are harder to recover. // But just re-create the directory, next sync will be able to recover the files SyncFileItem mkdirItem(_item); mkdirItem._instruction = CSYNC_INSTRUCTION_SYNC; mkdirItem._dir = SyncFileItem::Down; newJob = new PropagateLocalMkdir(_propagator, mkdirItem); // Also remove the inodes and fileid from the db so no further renames are tried for // this item. _propagator->_journal->avoidRenamesOnNextSync(_item._file); } if( newJob ) { newJob->setRestoreJobMsg(msg); _restoreJob.reset(newJob); connect(_restoreJob.data(), SIGNAL(completed(SyncFileItem)), this, SLOT(slotRestoreJobCompleted(SyncFileItem))); _restoreJob->start(); } return true; } return false; }