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->_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;

View file

@ -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 *);

View file

@ -314,9 +314,10 @@ 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);
}
}
/*

View file

@ -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;
}

View file

@ -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();
};

View file

@ -61,155 +61,35 @@ 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<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()
{
// 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<QTreeWidgetItem*> items;
QTreeWidgetItem *item;
QHash <QString, int> folderHash;
foreach( Progress::Info info, progressList ) {
slotProgressInfo( info.folder, info );
folderHash[info.folder] = 1;
}
_ui->_treeWidget->clear();
QList<Progress::SyncProblem> 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,7 +164,7 @@ 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);
@ -292,7 +172,7 @@ void ProtocolWidget::slotProgressProblem( const QString& folder, const Progress:
columns << timeStr;
columns << problem.current_file;
columns << folder;
columns << problem.folder;
QString errMsg = problem.error_message;
#if 0
if( problem.error_code == 507 ) {
@ -311,6 +191,15 @@ void ProtocolWidget::slotProgressProblem( const QString& folder, const Progress:
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);
}
@ -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);
QTreeWidgetItem *item = createProgressTreewidgetItem(progress);
if(item) {
_ui->_treeWidget->insertTopLevelItem(0, item);
Q_UNUSED(item);
}
}

View file

@ -38,7 +38,6 @@ public:
~ProtocolWidget();
void setupList();
// void setSyncResult( const SyncResult& result );
signals:
@ -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;