Simplify progress and error signals again.

Now handle everything through the progress signal and let the errors
be progressed in the done slot.

Remove unused code, fix sorting of the list, more efficiency.

This fixes #916
This commit is contained in:
Klaas Freitag 2013-11-26 12:22:28 +01:00
parent a88d45bff4
commit 232cbc45b5
7 changed files with 96 additions and 191 deletions

View file

@ -226,7 +226,7 @@ bool CSyncThread::checkBlacklisting( SyncFileItem *item )
item->_blacklistedInDb = true; item->_blacklistedInDb = true;
item->_instruction = CSYNC_INSTRUCTION_IGNORE; item->_instruction = CSYNC_INSTRUCTION_IGNORE;
item->_errorString = tr("The item is not synced because it is on the blacklist."); 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_IGNORE:
case CSYNC_INSTRUCTION_ERROR: case CSYNC_INSTRUCTION_ERROR:
// //
slotProgressProblem(Progress::SoftError, item ); slotProgress(Progress::SoftError, item, 0, 0);
dir = SyncFileItem::None; dir = SyncFileItem::None;
break; break;
case CSYNC_INSTRUCTION_EVAL: case CSYNC_INSTRUCTION_EVAL:
@ -593,7 +593,7 @@ void CSyncThread::slotFinished()
thread()->quit(); thread()->quit();
} }
void CSyncThread::slotProgressProblem(Progress::Kind kind, const SyncFileItem& item) void CSyncThread::progressProblem(Progress::Kind kind, const SyncFileItem& item)
{ {
Progress::SyncProblem problem; 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) 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 ) { if( kind == Progress::StartSync ) {
QMutexLocker lock(&_mutex); QMutexLocker lock(&_mutex);
_currentFileNo = 0; _currentFileNo = 0;

View file

@ -81,11 +81,11 @@ signals:
private slots: private slots:
void transferCompleted(const SyncFileItem& item); void transferCompleted(const SyncFileItem& item);
void slotFinished(); void slotFinished();
void slotProgress(Progress::Kind kind, const SyncFileItem &item, quint64, quint64); void slotProgress(Progress::Kind kind, const SyncFileItem &item, quint64 curr = 0, quint64 total = 0);
void slotProgressProblem(Progress::Kind kind, const SyncFileItem& item);
private: private:
void handleSyncError(CSYNC *ctx, const char *state); void handleSyncError(CSYNC *ctx, const char *state);
void progressProblem(Progress::Kind kind, const SyncFileItem& item);
static int treewalkLocal( TREE_WALK_FILE*, void *); static int treewalkLocal( TREE_WALK_FILE*, void *);
static int treewalkRemote( TREE_WALK_FILE*, void *); static int treewalkRemote( TREE_WALK_FILE*, void *);

View file

@ -314,8 +314,9 @@ void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg)
void ownCloudGui::slotShowOptionalTrayMessage(const QString &title, const QString &msg) void ownCloudGui::slotShowOptionalTrayMessage(const QString &title, const QString &msg)
{ {
MirallConfigFile cfg; MirallConfigFile cfg;
if (cfg.optionalDesktopNotifications()) if (cfg.optionalDesktopNotifications()) {
slotShowTrayMessage(title, msg); slotShowTrayMessage(title, msg);
}
} }

View file

@ -85,10 +85,14 @@ void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorStr
switch( status ) { switch( status ) {
case SyncFileItem::SoftError: case SyncFileItem::SoftError:
// do not blacklist in case of soft error. // do not blacklist in case of soft error.
emit progress( Progress::SoftError, _item, 0, 0 );
break; break;
case SyncFileItem::FatalError: case SyncFileItem::FatalError:
case SyncFileItem::NormalError: case SyncFileItem::NormalError:
_propagator->_journal->updateBlacklistEntry( record ); _propagator->_journal->updateBlacklistEntry( record );
if( status == SyncFileItem::NormalError ) {
emit progress( Progress::NormalError, _item, 0, 0 );
}
break; break;
case SyncFileItem::Success: case SyncFileItem::Success:
if( _item._blacklistedInDb ) { if( _item._blacklistedInDb ) {
@ -378,19 +382,16 @@ void PropagateUploadFile::start()
const QString errMsg = tr("Local file changed during sync, syncing once it arrived completely"); const QString errMsg = tr("Local file changed during sync, syncing once it arrived completely");
done( SyncFileItem::SoftError, errMsg ); done( SyncFileItem::SoftError, errMsg );
_item._errorString = errMsg; _item._errorString = errMsg;
emit progressProblem( Progress::SoftError, _item );
return; return;
} else if( state == HBF_USER_ABORTED ) { } else if( state == HBF_USER_ABORTED ) {
const QString errMsg = tr("Sync was aborted by user."); const QString errMsg = tr("Sync was aborted by user.");
done( SyncFileItem::SoftError, errMsg);
_item._errorString = errMsg; _item._errorString = errMsg;
emit progressProblem( Progress::SoftError, _item ); done( SyncFileItem::SoftError, errMsg );
} else { } else {
// Other HBF error conditions. // Other HBF error conditions.
// FIXME: find out the error class. // FIXME: find out the error class.
_item._httpErrorCode = hbf_fail_http_code(trans.data()); _item._httpErrorCode = hbf_fail_http_code(trans.data());
done(SyncFileItem::NormalError, hbf_error_string(trans.data(), state)); done(SyncFileItem::NormalError, hbf_error_string(trans.data(), state));
emit progressProblem(Progress::NormalError, _item);
} }
return; return;
} }

View file

@ -44,7 +44,6 @@ signals:
void finished(SyncFileItem::Status); void finished(SyncFileItem::Status);
void completed(const SyncFileItem &); void completed(const SyncFileItem &);
void progress(Progress::Kind, const SyncFileItem& item, quint64 bytes, quint64 total); void progress(Progress::Kind, const SyncFileItem& item, quint64 bytes, quint64 total);
void progressProblem( Progress::Kind, const SyncFileItem& );
}; };
/* /*
@ -172,7 +171,6 @@ public:
signals: signals:
void completed(const SyncFileItem &); void completed(const SyncFileItem &);
void progress(Progress::Kind kind, const SyncFileItem&, quint64 bytes, quint64 total); void progress(Progress::Kind kind, const SyncFileItem&, quint64 bytes, quint64 total);
void progressProblem( Progress::Kind, const SyncFileItem& );
void finished(); void finished();
}; };

View file

@ -61,154 +61,34 @@ ProtocolWidget::ProtocolWidget(QWidget *parent) :
QPushButton *copyBtn = _ui->_dialogButtonBox->addButton(tr("Copy"), QDialogButtonBox::ActionRole); QPushButton *copyBtn = _ui->_dialogButtonBox->addButton(tr("Copy"), QDialogButtonBox::ActionRole);
connect(copyBtn, SIGNAL(clicked()), SLOT(copyToClipboard())); 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<br/>").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() 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<Progress::Info> progressList = ProgressDispatcher::instance()->recentChangedItems(0); // All. QList<Progress::Info> progressList = ProgressDispatcher::instance()->recentChangedItems(0); // All.
QList<QTreeWidgetItem*> items;
QTreeWidgetItem *item;
QHash <QString, int> folderHash; _ui->_treeWidget->clear();
foreach( Progress::Info info, progressList ) {
slotProgressInfo( info.folder, info );
folderHash[info.folder] = 1;
}
QList<Progress::SyncProblem> problemList = ProgressDispatcher::instance()->recentProblems(0); QList<Progress::SyncProblem> problemList = ProgressDispatcher::instance()->recentProblems(0);
items.clear();
foreach( Progress::SyncProblem prob, problemList ) { foreach( Progress::SyncProblem prob, problemList ) {
slotProgressProblem(prob.folder, prob); item = createProblemTreewidgetItem(prob);
folderHash[prob.folder] = 1; 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() ProtocolWidget::~ProtocolWidget()
@ -284,7 +164,7 @@ QString ProtocolWidget::timeString(QDateTime dt, QLocale::FormatType format) con
return timeStr; return timeStr;
} }
void ProtocolWidget::slotProgressProblem( const QString& folder, const Progress::SyncProblem& problem ) QTreeWidgetItem *ProtocolWidget::createProblemTreewidgetItem( const Progress::SyncProblem& problem)
{ {
QStringList columns; QStringList columns;
QString timeStr = timeString(problem.timestamp); QString timeStr = timeString(problem.timestamp);
@ -292,13 +172,13 @@ void ProtocolWidget::slotProgressProblem( const QString& folder, const Progress:
columns << timeStr; columns << timeStr;
columns << problem.current_file; columns << problem.current_file;
columns << folder; columns << problem.folder;
QString errMsg = problem.error_message; QString errMsg = problem.error_message;
#if 0 #if 0
if( problem.error_code == 507 ) { if( problem.error_code == 507 ) {
errMsg = tr("No more storage space available on server."); errMsg = tr("No more storage space available on server.");
} }
#endif #endif
columns << errMsg; columns << errMsg;
QTreeWidgetItem *item = new QTreeWidgetItem(columns); QTreeWidgetItem *item = new QTreeWidgetItem(columns);
@ -311,6 +191,15 @@ void ProtocolWidget::slotProgressProblem( const QString& folder, const Progress:
item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Error, true)); item->setIcon(0, Theme::instance()->syncStateIcon(SyncResult::Error, true));
} }
item->setToolTip(0, longTimeStr); 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); _ui->_treeWidget->insertTopLevelItem(0, item);
} }
@ -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 ) void ProtocolWidget::slotProgressInfo( const QString& folder, const Progress::Info& progress )
{ {
if( progress.kind == Progress::StartSync ) { if( progress.kind == Progress::StartSync ) {
@ -343,20 +251,10 @@ void ProtocolWidget::slotProgressInfo( const QString& folder, const Progress::In
return; return;
} }
QStringList columns; QTreeWidgetItem *item = createProgressTreewidgetItem(progress);
QString timeStr = timeString(progress.timestamp); if(item) {
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); _ui->_treeWidget->insertTopLevelItem(0, item);
Q_UNUSED(item); }
} }

View file

@ -38,13 +38,12 @@ public:
~ProtocolWidget(); ~ProtocolWidget();
void setupList(); void setupList();
// void setSyncResult( const SyncResult& result );
signals: signals:
public slots: public slots:
void slotProgressInfo( const QString& folder, const Progress::Info& progress ); 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 ); void slotOpenFile( QTreeWidgetItem* item, int );
protected slots: protected slots:
@ -56,6 +55,9 @@ signals:
private: private:
void setSyncResultStatus(const SyncResult& result ); void setSyncResultStatus(const SyncResult& result );
void cleanErrors( const QString& folder ); 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; QString timeString(QDateTime dt, QLocale::FormatType format = QLocale::NarrowFormat) const;
const int ErrorIndicatorRole; const int ErrorIndicatorRole;