diff --git a/src/mirall/csyncthread.cpp b/src/mirall/csyncthread.cpp index 52bcfde67..0e99126c8 100644 --- a/src/mirall/csyncthread.cpp +++ b/src/mirall/csyncthread.cpp @@ -226,7 +226,7 @@ bool CSyncThread::checkBlacklisting( SyncFileItem *item ) item->_blacklistedInDb = true; item->_instruction = CSYNC_INSTRUCTION_IGNORE; item->_errorString = tr("The item is not synced because it is on the blacklist."); - slotProgressProblem( Progress::SoftError, *item ); + slotProgress( Progress::SoftError, *item ); } } @@ -319,7 +319,7 @@ int CSyncThread::treewalkFile( TREE_WALK_FILE *file, bool remote ) case CSYNC_INSTRUCTION_IGNORE: case CSYNC_INSTRUCTION_ERROR: // - slotProgressProblem(Progress::SoftError, item ); + slotProgress(Progress::SoftError, item, 0, 0); dir = SyncFileItem::None; break; case CSYNC_INSTRUCTION_EVAL: @@ -593,7 +593,7 @@ void CSyncThread::slotFinished() thread()->quit(); } -void CSyncThread::slotProgressProblem(Progress::Kind kind, const SyncFileItem& item) +void CSyncThread::progressProblem(Progress::Kind kind, const SyncFileItem& item) { Progress::SyncProblem problem; @@ -609,6 +609,11 @@ void CSyncThread::slotProgressProblem(Progress::Kind kind, const SyncFileItem& i void CSyncThread::slotProgress(Progress::Kind kind, const SyncFileItem& item, quint64 curr, quint64 total) { + if( Progress::isErrorKind(kind) ) { + progressProblem(kind, item); + return; + } + if( kind == Progress::StartSync ) { QMutexLocker lock(&_mutex); _currentFileNo = 0; diff --git a/src/mirall/csyncthread.h b/src/mirall/csyncthread.h index b4ea714a6..0737b494b 100644 --- a/src/mirall/csyncthread.h +++ b/src/mirall/csyncthread.h @@ -81,11 +81,11 @@ signals: private slots: void transferCompleted(const SyncFileItem& item); void slotFinished(); - void slotProgress(Progress::Kind kind, const SyncFileItem &item, quint64, quint64); - void slotProgressProblem(Progress::Kind kind, const SyncFileItem& item); + void slotProgress(Progress::Kind kind, const SyncFileItem &item, quint64 curr = 0, quint64 total = 0); private: void handleSyncError(CSYNC *ctx, const char *state); + void progressProblem(Progress::Kind kind, const SyncFileItem& item); static int treewalkLocal( TREE_WALK_FILE*, void *); static int treewalkRemote( TREE_WALK_FILE*, void *); diff --git a/src/mirall/owncloudgui.cpp b/src/mirall/owncloudgui.cpp index b36dfeac7..1d0316834 100644 --- a/src/mirall/owncloudgui.cpp +++ b/src/mirall/owncloudgui.cpp @@ -314,8 +314,9 @@ void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg) void ownCloudGui::slotShowOptionalTrayMessage(const QString &title, const QString &msg) { MirallConfigFile cfg; - if (cfg.optionalDesktopNotifications()) + if (cfg.optionalDesktopNotifications()) { slotShowTrayMessage(title, msg); + } } diff --git a/src/mirall/owncloudpropagator.cpp b/src/mirall/owncloudpropagator.cpp index c46d9b458..05036e8fa 100644 --- a/src/mirall/owncloudpropagator.cpp +++ b/src/mirall/owncloudpropagator.cpp @@ -85,10 +85,14 @@ void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorStr switch( status ) { case SyncFileItem::SoftError: // do not blacklist in case of soft error. + emit progress( Progress::SoftError, _item, 0, 0 ); break; case SyncFileItem::FatalError: case SyncFileItem::NormalError: _propagator->_journal->updateBlacklistEntry( record ); + if( status == SyncFileItem::NormalError ) { + emit progress( Progress::NormalError, _item, 0, 0 ); + } break; case SyncFileItem::Success: if( _item._blacklistedInDb ) { @@ -378,19 +382,16 @@ void PropagateUploadFile::start() const QString errMsg = tr("Local file changed during sync, syncing once it arrived completely"); done( SyncFileItem::SoftError, errMsg ); _item._errorString = errMsg; - emit progressProblem( Progress::SoftError, _item ); return; } else if( state == HBF_USER_ABORTED ) { const QString errMsg = tr("Sync was aborted by user."); - done( SyncFileItem::SoftError, errMsg); _item._errorString = errMsg; - emit progressProblem( Progress::SoftError, _item ); + done( SyncFileItem::SoftError, errMsg ); } else { // Other HBF error conditions. // FIXME: find out the error class. _item._httpErrorCode = hbf_fail_http_code(trans.data()); done(SyncFileItem::NormalError, hbf_error_string(trans.data(), state)); - emit progressProblem(Progress::NormalError, _item); } return; } diff --git a/src/mirall/owncloudpropagator.h b/src/mirall/owncloudpropagator.h index fed659533..99eed0a5c 100644 --- a/src/mirall/owncloudpropagator.h +++ b/src/mirall/owncloudpropagator.h @@ -44,7 +44,6 @@ signals: void finished(SyncFileItem::Status); void completed(const SyncFileItem &); void progress(Progress::Kind, const SyncFileItem& item, quint64 bytes, quint64 total); - void progressProblem( Progress::Kind, const SyncFileItem& ); }; /* @@ -172,7 +171,6 @@ public: signals: void completed(const SyncFileItem &); void progress(Progress::Kind kind, const SyncFileItem&, quint64 bytes, quint64 total); - void progressProblem( Progress::Kind, const SyncFileItem& ); void finished(); }; diff --git a/src/mirall/protocolwidget.cpp b/src/mirall/protocolwidget.cpp index b09ee2049..2bb11157d 100644 --- a/src/mirall/protocolwidget.cpp +++ b/src/mirall/protocolwidget.cpp @@ -61,154 +61,34 @@ ProtocolWidget::ProtocolWidget(QWidget *parent) : QPushButton *copyBtn = _ui->_dialogButtonBox->addButton(tr("Copy"), QDialogButtonBox::ActionRole); connect(copyBtn, SIGNAL(clicked()), SLOT(copyToClipboard())); - - } - -#if 0 -void ProtocolWidget::setSyncResultStatus(const SyncResult& result ) -{ - if( result.errorStrings().count() ) { - _ui->_errorLabel->setVisible(true); - _ui->_errorLabel->setTextFormat(Qt::RichText); - - QString errStr; - QStringList errors = result.errorStrings(); - int cnt = errors.size(); - bool appendDots = false; - if( cnt > 3 ) { - cnt = 3; - appendDots = true; - } - - for( int i = 0; i < cnt; i++) { - errStr.append(QString("%1
").arg(errors.at(i))); - } - if( appendDots ) { - errStr.append(QString("...")); - } - _ui->_errorLabel->setText(errStr); - } else { - _ui->_errorLabel->setText(QString::null); - _ui->_errorLabel->setVisible(false); - } - } - -void ProtocolWidget::setSyncResult( const SyncResult& result ) -{ - setSyncResultStatus(result); - - const QString& folder = result.folder(); - qDebug() << "Setting sync result for folder " << folder; - - SyncFileItemVector::const_iterator i; - const SyncFileItemVector& items = result.syncFileItemVector(); - QDateTime dt = QDateTime::currentDateTime(); - - for (i = items.begin(); i != items.end(); ++i) { - const SyncFileItem& item = *i; - QString errMsg; - QString tooltip; - // handle ignored files here. - - if( item._status == SyncFileItem::FileIgnored - || item._status == SyncFileItem::Conflict - || item._status == SyncFileItem::SoftError ) { - QStringList columns; - QString timeStr = timeString(dt); - QString longTimeStr = timeString(dt, QLocale::LongFormat); - - columns << timeStr; - columns << item._file; - columns << folder; - if( item._status == SyncFileItem::FileIgnored ) { - if( item._blacklistedInDb ) { - errMsg = tr("Blacklisted"); - tooltip = tr("The file is blacklisted because of previous error conditions."); - }else if( item._type == SyncFileItem::SoftLink ) { - errMsg = tr("Soft Link ignored"); - tooltip = tr("Softlinks break the semantics of synchronization.\nPlease do not " - "use them in synced directories"); - } else { - QString obj = tr("file"); - if( item._type == SyncFileItem::Directory ) { - obj = tr("directory"); - } - tooltip = tr("The %1 was ignored because it is listed in the clients ignore list\n" - "or the %1 name contains characters that are not syncable\nin a cross platform " - "environment").arg(obj); - errMsg = tr("Item ignored"); - if( item._errorString == QLatin1String("File listed on ignore list.") ) { - errMsg = tr("%1 on ignore list").arg(obj); - tooltip = tr("The %1 was skipped because it is listed on the clients\n" - "list of names to ignore").arg(obj); - } else if( item._errorString == QLatin1String("File contains invalid characters.") ) { - errMsg = tr("Invalid characters"); - tooltip = tr("The %1 name contains one or more invalid characters which break\n" - "syncing in a cross platform environment").arg(obj); - } - } - } else if( item._status == SyncFileItem::Conflict ) { - errMsg = tr("Conflict file."); - tooltip = tr("The file was changed on server and local repository and as a result it\n" - "created a so called conflict. The local change is copied to the conflict\n" - "file while the file from the server side is available under the original\n" - "name"); - } else if( item._status == SyncFileItem::SoftError ) { - errMsg = item._errorString; - } else { - Q_ASSERT(!"unhandled instruction."); - } - columns << errMsg; - - QTreeWidgetItem *twitem = new QTreeWidgetItem(columns); - twitem->setData(0, ErrorIndicatorRole, QVariant(true) ); - twitem->setToolTip(0, longTimeStr); - twitem->setToolTip(3, tooltip); - twitem->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Problem, true)); - - _ui->_treeWidget->insertTopLevelItem(0, twitem); - - } - } -} -#endif void ProtocolWidget::setupList() { - // get the folders to set up the top level list. -// Folder::Map map = FolderMan::instance()->map(); -// SyncResult lastResult; -// QDateTime dt; - -// bool haveSyncResult = false; - -// foreach( Folder *f, map.values() ) { -// if( f->syncResult().syncTime() > dt ) { -// dt = f->syncResult().syncTime(); -// lastResult = f->syncResult(); -// haveSyncResult = true; -// } - -// if( haveSyncResult ) { -// setSyncResult(lastResult); -// } -// } - QList progressList = ProgressDispatcher::instance()->recentChangedItems(0); // All. + QList items; + QTreeWidgetItem *item; - QHash folderHash; - - foreach( Progress::Info info, progressList ) { - slotProgressInfo( info.folder, info ); - folderHash[info.folder] = 1; - } + _ui->_treeWidget->clear(); QList problemList = ProgressDispatcher::instance()->recentProblems(0); + items.clear(); foreach( Progress::SyncProblem prob, problemList ) { - slotProgressProblem(prob.folder, prob); - folderHash[prob.folder] = 1; + item = createProblemTreewidgetItem(prob); + if (item) { + items.append(item); + } } + _ui->_treeWidget->addTopLevelItems(items); + + foreach( Progress::Info info, progressList ) { + item = createProgressTreewidgetItem(info); + if(item) { + items.append(item); + } + } + _ui->_treeWidget->addTopLevelItems(items); + } ProtocolWidget::~ProtocolWidget() @@ -284,34 +164,43 @@ QString ProtocolWidget::timeString(QDateTime dt, QLocale::FormatType format) con return timeStr; } -void ProtocolWidget::slotProgressProblem( const QString& folder, const Progress::SyncProblem& problem ) +QTreeWidgetItem *ProtocolWidget::createProblemTreewidgetItem( const Progress::SyncProblem& problem) { - QStringList columns; - QString timeStr = timeString(problem.timestamp); - QString longTimeStr = timeString(problem.timestamp, QLocale::LongFormat); + QStringList columns; + QString timeStr = timeString(problem.timestamp); + QString longTimeStr = timeString(problem.timestamp, QLocale::LongFormat); - columns << timeStr; - columns << problem.current_file; - columns << folder; - QString errMsg = problem.error_message; -#if 0 - if( problem.error_code == 507 ) { - errMsg = tr("No more storage space available on server."); - } -#endif - columns << errMsg; + columns << timeStr; + columns << problem.current_file; + columns << problem.folder; + QString errMsg = problem.error_message; + #if 0 + if( problem.error_code == 507 ) { + errMsg = tr("No more storage space available on server."); + } + #endif + columns << errMsg; - QTreeWidgetItem *item = new QTreeWidgetItem(columns); - item->setData(0, ErrorIndicatorRole, QVariant(true) ); - // Maybe we should not set the error icon for all problems but distinguish - // by error_code. A quota problem is considered an error, others might not?? - if( problem.kind == Progress::SoftError ) { - item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Problem, true)); - } else { - item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Error, true)); - } - item->setToolTip(0, longTimeStr); - _ui->_treeWidget->insertTopLevelItem(0, item); + QTreeWidgetItem *item = new QTreeWidgetItem(columns); + item->setData(0, ErrorIndicatorRole, QVariant(true) ); + // Maybe we should not set the error icon for all problems but distinguish + // by error_code. A quota problem is considered an error, others might not?? + if( problem.kind == Progress::SoftError ) { + item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Problem, true)); + } else { + item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Error, true)); + } + item->setToolTip(0, longTimeStr); + item->setToolTip(3, errMsg ); + + return item; +} + +void ProtocolWidget::slotProgressProblem( const QString& folder, const Progress::SyncProblem& problem) +{ + Q_UNUSED(folder); + QTreeWidgetItem *item = createProblemTreewidgetItem(problem); + _ui->_treeWidget->insertTopLevelItem(0, item); } void ProtocolWidget::slotOpenFile( QTreeWidgetItem *item, int ) @@ -328,6 +217,25 @@ void ProtocolWidget::slotOpenFile( QTreeWidgetItem *item, int ) } } +QTreeWidgetItem* ProtocolWidget::createProgressTreewidgetItem( const Progress::Info& progress ) +{ + QStringList columns; + QString timeStr = timeString(progress.timestamp); + QString longTimeStr = timeString(progress.timestamp, QLocale::LongFormat); + + columns << timeStr; + columns << progress.current_file; + columns << progress.folder; + columns << Progress::asResultString(progress.kind); + columns << Utility::octetsToString( progress.file_size ); + + QTreeWidgetItem *item = new QTreeWidgetItem(columns); + item->setToolTip(0, longTimeStr); + + return item; + +} + void ProtocolWidget::slotProgressInfo( const QString& folder, const Progress::Info& progress ) { if( progress.kind == Progress::StartSync ) { @@ -343,20 +251,10 @@ void ProtocolWidget::slotProgressInfo( const QString& folder, const Progress::In return; } - QStringList columns; - QString timeStr = timeString(progress.timestamp); - QString longTimeStr = timeString(progress.timestamp, QLocale::LongFormat); - - columns << timeStr; - columns << progress.current_file; - columns << progress.folder; - columns << Progress::asResultString(progress.kind); - columns << Utility::octetsToString( progress.file_size ); - - QTreeWidgetItem *item = new QTreeWidgetItem(columns); - item->setToolTip(0, longTimeStr); - _ui->_treeWidget->insertTopLevelItem(0, item); - Q_UNUSED(item); + QTreeWidgetItem *item = createProgressTreewidgetItem(progress); + if(item) { + _ui->_treeWidget->insertTopLevelItem(0, item); + } } diff --git a/src/mirall/protocolwidget.h b/src/mirall/protocolwidget.h index 9a931cd0a..39a65448e 100644 --- a/src/mirall/protocolwidget.h +++ b/src/mirall/protocolwidget.h @@ -38,13 +38,12 @@ public: ~ProtocolWidget(); void setupList(); - // void setSyncResult( const SyncResult& result ); signals: public slots: void slotProgressInfo( const QString& folder, const Progress::Info& progress ); - void slotProgressProblem( const QString& folder, const Progress::SyncProblem& problem ); + void slotProgressProblem(const QString& folder, const Progress::SyncProblem& problem ); void slotOpenFile( QTreeWidgetItem* item, int ); protected slots: @@ -56,6 +55,9 @@ signals: private: void setSyncResultStatus(const SyncResult& result ); void cleanErrors( const QString& folder ); + QTreeWidgetItem* createProgressTreewidgetItem(const Progress::Info& progress ); + QTreeWidgetItem* createProblemTreewidgetItem( const Progress::SyncProblem& problem); + QString timeString(QDateTime dt, QLocale::FormatType format = QLocale::NarrowFormat) const; const int ErrorIndicatorRole;