void SyncFileStatusTracker::slotItemCompleted(const SyncFileItem &item) { // qDebug() << Q_FUNC_INFO << item.destination() << item._status; if (showErrorInSocketApi(item)) { _syncProblems[item._file] = SyncFileStatus::StatusError; invalidateParentPaths(item.destination()); } else if (showWarningInSocketApi(item)) { _syncProblems[item._file] = SyncFileStatus::StatusWarning; } else { _syncProblems.erase(item._file); } emit fileStatusChanged(getSystemDestination(item.destination()), syncFileItemStatus(item)); }
SyncFileStatus SyncFileStatusTracker::syncFileItemStatus(const SyncFileItem& item) { // Hack to know if the item was taken from the sync engine (Sync), or from the database (UpToDate) // Mark any directory in the SyncEngine's items as syncing, this is currently how we mark parent directories // of currently syncing items since the PropagateDirectory job will mark the directorie's SyncFileItem::_status as Success // once all child jobs have been completed. bool waitingForPropagation = (item._isDirectory || item._direction != SyncFileItem::None) && item._status == SyncFileItem::NoStatus; SyncFileStatus status(SyncFileStatus::StatusUpToDate); if (waitingForPropagation) { status.set(SyncFileStatus::StatusSync); } else if (showErrorInSocketApi(item)) { status.set(SyncFileStatus::StatusError); } else if (showWarningInSocketApi(item)) { status.set(SyncFileStatus::StatusWarning); } else { // After a sync finished, we need to show the users issues from that last sync like the activity list does. // Also used for parent directories showing a warning for an error child. SyncFileStatus::SyncFileStatusTag problemStatus = lookupProblem(item.destination(), _syncProblems); if (problemStatus != SyncFileStatus::StatusNone) status.set(problemStatus); } if (item._remotePerm.contains("S")) status.setSharedWithMe(true); return status; }
// a item is completed: count the errors and forward to the ProgressDispatcher void Folder::slotItemCompleted(const SyncFileItem &item, const PropagatorJob& job) { if (item.hasErrorStatus()) { _stateLastSyncItemsWithError.insert(item._file); } if (Progress::isWarningKind(item._status)) { // Count all error conditions. _syncResult.setWarnCount(_syncResult.warnCount()+1); } emit ProgressDispatcher::instance()->itemCompleted(alias(), item, job); }
void Folder::bubbleUpSyncResult() { // count new, removed and updated items int newItems = 0; int removedItems = 0; int updatedItems = 0; int ignoredItems = 0; int renamedItems = 0; SyncFileItem firstItemNew; SyncFileItem firstItemDeleted; SyncFileItem firstItemUpdated; SyncFileItem firstItemRenamed; Logger *logger = Logger::instance(); SyncRunFileLog syncFileLog; syncFileLog.start(path(), _engine ? _engine->stopWatch() : Utility::StopWatch() ); QElapsedTimer timer; timer.start(); foreach (const SyncFileItem &item, _syncResult.syncFileItemVector() ) { // Log the item syncFileLog.logItem( item ); // and process the item to the gui if( item._status == SyncFileItem::FatalError || item._status == SyncFileItem::NormalError ) { slotSyncError( tr("%1: %2").arg(item._file, item._errorString) ); logger->postOptionalGuiLog(item._file, item._errorString); } else { // add new directories or remove gone away dirs to the watcher if (item._isDirectory && item._instruction == CSYNC_INSTRUCTION_NEW ) { FolderMan::instance()->addMonitorPath( alias(), path()+item._file ); } if (item._isDirectory && item._instruction == CSYNC_INSTRUCTION_REMOVE ) { FolderMan::instance()->removeMonitorPath( alias(), path()+item._file ); } if (item._direction == SyncFileItem::Down) { switch (item._instruction) { case CSYNC_INSTRUCTION_NEW: newItems++; if (firstItemNew.isEmpty()) firstItemNew = item; break; case CSYNC_INSTRUCTION_REMOVE: removedItems++; if (firstItemDeleted.isEmpty()) firstItemDeleted = item; break; case CSYNC_INSTRUCTION_CONFLICT: case CSYNC_INSTRUCTION_SYNC: updatedItems++; if (firstItemUpdated.isEmpty()) firstItemUpdated = item; break; case CSYNC_INSTRUCTION_ERROR: qDebug() << "Got Instruction ERROR. " << _syncResult.errorString(); break; case CSYNC_INSTRUCTION_RENAME: if (firstItemRenamed.isEmpty()) { firstItemRenamed = item; } renamedItems++; break; default: // nothing. break; } } else if( item._direction == SyncFileItem::None ) { // ignored files counting. if( item._instruction == CSYNC_INSTRUCTION_IGNORE ) { ignoredItems++; } } } } syncFileLog.close(); qDebug() << "Processing result list and logging took " << timer.elapsed() << " Milliseconds."; _syncResult.setWarnCount(ignoredItems); createGuiLog( firstItemNew._file, SyncFileStatus(SyncFileStatus::STATUS_NEW), newItems ); createGuiLog( firstItemDeleted._file, SyncFileStatus(SyncFileStatus::STATUS_REMOVE), removedItems ); createGuiLog( firstItemUpdated._file, SyncFileStatus(SyncFileStatus::STATUS_UPDATED), updatedItems ); if( !firstItemRenamed.isEmpty() ) { SyncFileStatus status(SyncFileStatus::STATUS_RENAME); // if the path changes it's rather a move QDir renTarget = QFileInfo(firstItemRenamed._renameTarget).dir(); QDir renSource = QFileInfo(firstItemRenamed._file).dir(); if(renTarget != renSource) { status.set(SyncFileStatus::STATUS_MOVE); } createGuiLog( firstItemRenamed._file, status, renamedItems, firstItemRenamed._renameTarget ); } qDebug() << "OO folder slotSyncFinished: result: " << int(_syncResult.status()); }
void ServerActionNotifier::slotSyncFinished(const SyncResult &result) { SyncFileItemVector items = result.syncFileItemVector(); if (items.count() == 0) return; int newItems = 0; int removedItems = 0; int updatedItems = 0; SyncFileItem firstItemNew; SyncFileItem firstItemDeleted; SyncFileItem firstItemUpdated; foreach (const SyncFileItem &item, items) { if (item._dir == SyncFileItem::Down) { switch (item._instruction) { case CSYNC_INSTRUCTION_NEW: newItems++; if (firstItemNew.isEmpty()) firstItemNew = item; break; case CSYNC_INSTRUCTION_REMOVE: removedItems++; if (firstItemDeleted.isEmpty()) firstItemDeleted = item; break; case CSYNC_INSTRUCTION_UPDATED: updatedItems++; if (firstItemUpdated.isEmpty()) firstItemUpdated = item; break; default: // nothing. break; } } } if (newItems > 0) { QString file = QDir::toNativeSeparators(firstItemNew._file); if (newItems == 1) emit guiLog(tr("New file available"), tr("'%1' has been synced to this machine.").arg(file)); else emit guiLog(tr("New files available"), tr("'%1' and %n other file(s) have been synced to this machine.", "", newItems-1).arg(file)); } if (removedItems > 0) { QString file = QDir::toNativeSeparators(firstItemDeleted._file); if (removedItems == 1) emit guiLog(tr("File removed"), tr("'%1' has been removed.").arg(file)); else emit guiLog(tr("New files available"), tr("'%1' and %n other file(s) have been removed.", "", removedItems-1).arg(file)); } if (updatedItems > 0) { QString file = QDir::toNativeSeparators(firstItemUpdated._file); if (updatedItems == 1) emit guiLog(tr("File removed"), tr("'%1' has been updated.").arg(file)); else emit guiLog(tr("New files available"), tr("'%1' and %n other file(s) have been updated.", "", updatedItems-1).arg(file)); } }
void Folder::bubbleUpSyncResult() { // count new, removed and updated items int newItems = 0; int removedItems = 0; int updatedItems = 0; int ignoredItems = 0; SyncFileItem firstItemNew; SyncFileItem firstItemDeleted; SyncFileItem firstItemUpdated; Logger *logger = Logger::instance(); foreach (const SyncFileItem &item, _syncResult.syncFileItemVector() ) { if( item._instruction == CSYNC_INSTRUCTION_ERROR ) { slotCSyncError( tr("File %1: %2").arg(item._file).arg(item._errorString) ); logger->postGuiLog(tr("File %1").arg(item._file), item._errorString); } else { if (item._dir == SyncFileItem::Down) { switch (item._instruction) { case CSYNC_INSTRUCTION_NEW: newItems++; if (firstItemNew.isEmpty()) firstItemNew = item; break; case CSYNC_INSTRUCTION_REMOVE: removedItems++; if (firstItemDeleted.isEmpty()) firstItemDeleted = item; break; case CSYNC_INSTRUCTION_UPDATED: updatedItems++; if (firstItemUpdated.isEmpty()) firstItemUpdated = item; break; case CSYNC_INSTRUCTION_ERROR: qDebug() << "Got Instruction ERROR. " << _syncResult.errorString(); break; default: // nothing. break; } } else if( item._dir == SyncFileItem::None ) { // ignored files counting. if( item._instruction == CSYNC_INSTRUCTION_IGNORE ) { ignoredItems++; } } } } _syncResult.setWarnCount(ignoredItems); qDebug() << "OO folder slotSyncFinished: result: " << int(_syncResult.status()); if (newItems > 0) { QString file = QDir::toNativeSeparators(firstItemNew._file); if (newItems == 1) logger->postGuiLog(tr("New file available"), tr("'%1' has been synced to this machine.").arg(file)); else logger->postGuiLog(tr("New files available"), tr("'%1' and %n other file(s) have been synced to this machine.", "", newItems-1).arg(file)); } if (removedItems > 0) { QString file = QDir::toNativeSeparators(firstItemDeleted._file); if (removedItems == 1) logger->postGuiLog(tr("File removed"), tr("'%1' has been removed.").arg(file)); else logger->postGuiLog(tr("Files removed"), tr("'%1' and %n other file(s) have been removed.", "", removedItems-1).arg(file)); } if (updatedItems > 0) { QString file = QDir::toNativeSeparators(firstItemUpdated._file); if (updatedItems == 1) logger->postGuiLog(tr("File updated"), tr("'%1' has been updated.").arg(file)); else logger->postGuiLog(tr("Files updated"), tr("'%1' and %n other file(s) have been updated.", "", updatedItems-1).arg(file)); } }
void Folder::bubbleUpSyncResult() { // count new, removed and updated items int newItems = 0; int removedItems = 0; int updatedItems = 0; int ignoredItems = 0; int renamedItems = 0; SyncFileItem firstItemNew; SyncFileItem firstItemDeleted; SyncFileItem firstItemUpdated; SyncFileItem firstItemRenamed; Logger *logger = Logger::instance(); foreach (const SyncFileItem &item, _syncResult.syncFileItemVector() ) { if( item._status == SyncFileItem::FatalError || item._status == SyncFileItem::NormalError ) { slotCSyncError( tr("File %1: %2").arg(item._file).arg(item._errorString) ); logger->postOptionalGuiLog(tr("File %1").arg(item._file), item._errorString); } else { if (item._dir == SyncFileItem::Down) { switch (item._instruction) { case CSYNC_INSTRUCTION_NEW: newItems++; if (firstItemNew.isEmpty()) firstItemNew = item; if (item._type == SyncFileItem::Directory) { FolderMan::instance()->addMonitorPath( alias(), path()+item._file ); // _watcher->addPath(path() + item._file); } break; case CSYNC_INSTRUCTION_REMOVE: removedItems++; if (firstItemDeleted.isEmpty()) firstItemDeleted = item; if (item._type == SyncFileItem::Directory) { // _watcher->removePath(path() + item._file); FolderMan::instance()->addMonitorPath( alias(), path()+item._file ); } break; case CSYNC_INSTRUCTION_CONFLICT: case CSYNC_INSTRUCTION_SYNC: updatedItems++; if (firstItemUpdated.isEmpty()) firstItemUpdated = item; break; case CSYNC_INSTRUCTION_ERROR: qDebug() << "Got Instruction ERROR. " << _syncResult.errorString(); break; case CSYNC_INSTRUCTION_RENAME: if (firstItemRenamed.isEmpty()) { firstItemRenamed = item; } renamedItems++; break; default: // nothing. break; } } else if( item._dir == SyncFileItem::None ) { // ignored files counting. if( item._instruction == CSYNC_INSTRUCTION_IGNORE ) { ignoredItems++; } } } } _syncResult.setWarnCount(ignoredItems); createGuiLog( firstItemNew._file, tr("downloaded"), newItems ); createGuiLog( firstItemDeleted._file, tr("removed"), removedItems ); createGuiLog( firstItemUpdated._file, tr("updated"), updatedItems ); if( !firstItemRenamed.isEmpty() ) { QString renameVerb = tr("renamed"); // if the path changes it's rather a move QDir renTarget = QFileInfo(firstItemRenamed._renameTarget).dir(); QDir renSource = QFileInfo(firstItemRenamed._file).dir(); if(renTarget != renSource) { renameVerb = tr("moved"); } createGuiLog( firstItemRenamed._file, tr("%1 to %2").arg(renameVerb).arg(firstItemRenamed._renameTarget), renamedItems ); } qDebug() << "OO folder slotSyncFinished: result: " << int(_syncResult.status()); }