/** * 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 ) { SyncFileItemPtr downloadItem(new SyncFileItem(*_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; #ifdef USE_NEON newJob = new PropagateDownloadFileLegacy(_propagator, downloadItem); #else newJob = new PropagateDownloadFileQNAM(_propagator, downloadItem); #endif } else { // Directories are harder to recover. // But just re-create the directory, next sync will be able to recover the files SyncFileItemPtr mkdirItem(new SyncFileItem(*_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); _propagator->_anotherSyncNeeded = true; } if( newJob ) { newJob->setRestoreJobMsg(msg); _restoreJob.reset(newJob); connect(_restoreJob.data(), SIGNAL(itemCompleted(const SyncFileItemPtr &, const PropagatorJob &)), this, SLOT(slotRestoreJobCompleted(const SyncFileItemPtr &))); 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; }
void OpenCachingComModel::fetchData(const QString& url, const QString &type, OpenCachingComItem *item) { downloadItem(url, type, item); }