Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKlaas Freitag <freitag@owncloud.com>2013-11-25 19:16:33 +0400
committerKlaas Freitag <freitag@owncloud.com>2013-11-25 19:18:07 +0400
commitdc29046d618dece67c90f5a0b7a993689d95d60c (patch)
tree1d233667499284196a611fe7ee3a56e58c2633e1 /src
parent0c6dca25c4b6e424dc542b58bc2ba44b81169272 (diff)
Add new progressProblem signal and slots.
Now the sync problems are handled differently than the sync progress to ease error message handling and stuff.
Diffstat (limited to 'src')
-rw-r--r--src/mirall/csyncthread.cpp34
-rw-r--r--src/mirall/csyncthread.h5
-rw-r--r--src/mirall/folder.cpp30
-rw-r--r--src/mirall/folder.h1
-rw-r--r--src/mirall/owncloudpropagator.cpp75
-rw-r--r--src/mirall/owncloudpropagator.h8
-rw-r--r--src/mirall/progressdispatcher.cpp90
-rw-r--r--src/mirall/progressdispatcher.h9
8 files changed, 153 insertions, 99 deletions
diff --git a/src/mirall/csyncthread.cpp b/src/mirall/csyncthread.cpp
index f1c974924..d894a837d 100644
--- a/src/mirall/csyncthread.cpp
+++ b/src/mirall/csyncthread.cpp
@@ -225,6 +225,8 @@ bool CSyncThread::checkBlacklisting( SyncFileItem *item )
qDebug() << "Item is on blacklist: " << entry._file << "retries:" << entry._retryCount;
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 );
}
}
@@ -316,6 +318,8 @@ int CSyncThread::treewalkFile( TREE_WALK_FILE *file, bool remote )
case CSYNC_INSTRUCTION_CONFLICT:
case CSYNC_INSTRUCTION_IGNORE:
case CSYNC_INSTRUCTION_ERROR:
+ //
+ slotProgressProblem(Progress::SoftError, item );
dir = SyncFileItem::None;
break;
case CSYNC_INSTRUCTION_EVAL:
@@ -474,6 +478,8 @@ void CSyncThread::startSync()
return;
}
+ slotProgress(Progress::StartSync, SyncFileItem(), 0, 0);
+
_progressInfo = Progress::Info();
_hasFiles = false;
@@ -518,8 +524,8 @@ void CSyncThread::startSync()
_journal, &_abortRequested));
connect(_propagator.data(), SIGNAL(completed(SyncFileItem)),
this, SLOT(transferCompleted(SyncFileItem)), Qt::QueuedConnection);
- connect(_propagator.data(), SIGNAL(progress(Progress::Kind,QString,quint64,quint64)),
- this, SLOT(slotProgress(Progress::Kind,QString,quint64,quint64)));
+ connect(_propagator.data(), SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)),
+ this, SLOT(slotProgress(Progress::Kind,SyncFileItem,quint64,quint64)));
connect(_propagator.data(), SIGNAL(finished()), this, SLOT(slotFinished()));
int downloadLimit = 0;
@@ -537,7 +543,6 @@ void CSyncThread::startSync()
}
_propagator->_uploadLimit = uploadLimit;
- slotProgress(Progress::StartSync, QString(), 0, 0);
_propagator->start(_syncedItems);
}
@@ -573,18 +578,29 @@ void CSyncThread::slotFinished()
csync_commit(_csync_ctx);
qDebug() << "CSync run took " << _syncTime.elapsed() << " Milliseconds";
- slotProgress(Progress::EndSync,QString(), 0 , 0);
+ slotProgress(Progress::EndSync,SyncFileItem(), 0 , 0);
emit finished();
_propagator.reset(0);
_syncMutex.unlock();
thread()->quit();
}
-
-void CSyncThread::slotProgress(Progress::Kind kind, const QString &file, quint64 curr, quint64 total)
+void CSyncThread::slotProgressProblem(Progress::Kind kind, const SyncFileItem& item)
{
- Progress::Info pInfo = _progressInfo;
+ Progress::SyncProblem problem;
+ problem.kind = kind;
+ problem.current_file = item._file;
+ problem.error_message = item._errorString;
+ problem.error_code = item._httpErrorCode;
+ problem.timestamp = QDateTime::currentDateTime();
+
+ // connected to something in folder.
+ emit transmissionProblem( problem );
+}
+
+void CSyncThread::slotProgress(Progress::Kind kind, const SyncFileItem& item, quint64 curr, quint64 total)
+{
if( kind == Progress::StartSync ) {
QMutexLocker lock(&_mutex);
_currentFileNo = 0;
@@ -597,8 +613,10 @@ void CSyncThread::slotProgress(Progress::Kind kind, const QString &file, quint64
_currentFileNo += 1;
}
+ Progress::Info pInfo = _progressInfo;
+
pInfo.kind = kind;
- pInfo.current_file = file;
+ pInfo.current_file = item._file;
pInfo.file_size = total;
pInfo.current_file_bytes = curr;
pInfo.current_file_no = _currentFileNo;
diff --git a/src/mirall/csyncthread.h b/src/mirall/csyncthread.h
index 8d76b18c2..b4ea714a6 100644
--- a/src/mirall/csyncthread.h
+++ b/src/mirall/csyncthread.h
@@ -68,6 +68,8 @@ signals:
void treeWalkResult(const SyncFileItemVector&);
void transmissionProgress( const Progress::Info& progress );
+ void transmissionProblem( const Progress::SyncProblem& problem );
+
void csyncStateDbFile( const QString& );
void wipeDb();
@@ -79,7 +81,8 @@ signals:
private slots:
void transferCompleted(const SyncFileItem& item);
void slotFinished();
- void slotProgress(Progress::Kind kind, const QString& file, quint64, quint64);
+ void slotProgress(Progress::Kind kind, const SyncFileItem &item, quint64, quint64);
+ void slotProgressProblem(Progress::Kind kind, const SyncFileItem& item);
private:
void handleSyncError(CSYNC *ctx, const char *state);
diff --git a/src/mirall/folder.cpp b/src/mirall/folder.cpp
index 9922b0ab2..a769bfa28 100644
--- a/src/mirall/folder.cpp
+++ b/src/mirall/folder.cpp
@@ -627,6 +627,7 @@ void Folder::startSync(const QStringList &pathList)
connect(_csync, SIGNAL(aboutToRemoveAllFiles(SyncFileItem::Direction,bool*)),
SLOT(slotAboutToRemoveAllFiles(SyncFileItem::Direction,bool*)), Qt::BlockingQueuedConnection);
connect(_csync, SIGNAL(transmissionProgress(Progress::Info)), this, SLOT(slotTransmissionProgress(Progress::Info)));
+ connect(_csync, SIGNAL(transmissionProblem(Progress::SyncProblem)), this, SLOT(slotTransmissionProblem(Progress::SyncProblem)));
_thread->start();
_thread->setPriority(QThread::LowPriority);
@@ -687,6 +688,32 @@ void Folder::slotCSyncFinished()
emit syncFinished( _syncResult );
}
+// the problem comes without a folder and the valid path set. Add that here
+// and hand the result over to the progress dispatcher.
+void Folder::slotTransmissionProblem( const Progress::SyncProblem& problem )
+{
+ Progress::SyncProblem newProb = problem;
+ newProb.folder = alias();
+
+ if(newProb.current_file.startsWith(QLatin1String("ownclouds://")) ||
+ newProb.current_file.startsWith(QLatin1String("owncloud://")) ) {
+ // rip off the whole ownCloud URL.
+ newProb.current_file.remove(Utility::toCSyncScheme(remoteUrl().toString()));
+ }
+ QString localPath = path();
+ if( newProb.current_file.startsWith(localPath) ) {
+ // remove the local dir.
+ newProb.current_file = newProb.current_file.right( newProb.current_file.length() - localPath.length());
+ }
+
+ // Count all error conditions.
+ _syncResult.setWarnCount( _syncResult.warnCount()+1 );
+
+ ProgressDispatcher::instance()->setProgressProblem(alias(), newProb);
+}
+
+// the progress comes without a folder and the valid path set. Add that here
+// and hand the result over to the progress dispatcher.
void Folder::slotTransmissionProgress(const Progress::Info& progress)
{
Progress::Info newInfo = progress;
@@ -707,9 +734,6 @@ void Folder::slotTransmissionProgress(const Progress::Info& progress)
if( newInfo.kind == Progress::StartSync ) {
_syncResult.setWarnCount(0);
}
- if( newInfo.kind == Progress::Error ) {
- _syncResult.setWarnCount( _syncResult.warnCount()+1 );
- }
ProgressDispatcher::instance()->setProgressInfo(alias(), newInfo);
}
diff --git a/src/mirall/folder.h b/src/mirall/folder.h
index 37a2d46a4..6d30051af 100644
--- a/src/mirall/folder.h
+++ b/src/mirall/folder.h
@@ -174,6 +174,7 @@ private slots:
void slotCSyncFinished();
void slotTransmissionProgress(const Progress::Info& progress);
+ void slotTransmissionProblem( const Progress::SyncProblem& problem );
void slotPollTimerTimeout();
void etagRetreived(const QString &);
diff --git a/src/mirall/owncloudpropagator.cpp b/src/mirall/owncloudpropagator.cpp
index 44d109589..c9152f582 100644
--- a/src/mirall/owncloudpropagator.cpp
+++ b/src/mirall/owncloudpropagator.cpp
@@ -267,7 +267,7 @@ private:
PropagateUploadFile* that = reinterpret_cast<PropagateUploadFile*>(userdata);
if (status == ne_status_sending && info->sr.total > 0) {
- emit that->progress(Progress::Context, that->_item._file ,
+ emit that->progress(Progress::Context, that->_item,
that->_chunked_done + info->sr.progress,
that->_chunked_total_size ? that->_chunked_total_size : info->sr.total );
@@ -281,7 +281,7 @@ private:
void PropagateUploadFile::start()
{
- emit progress(Progress::StartUpload, _item._file, 0, _item._size);
+ emit progress(Progress::StartUpload, _item, 0, _item._size);
QFile file(_propagator->_localDir + _item._file);
if (!file.open(QIODevice::ReadOnly)) {
@@ -352,39 +352,39 @@ void PropagateUploadFile::start()
/* If the source file changed during submission, lets try again */
if( state == HBF_SOURCE_FILE_CHANGE ) {
- if( attempts++ < 20 ) { /* FIXME: How often do we want to try? */
- qDebug("SOURCE file has changed during upload, retry #%d in two seconds!", attempts);
- sleep(2);
- continue;
- }
- // Still the file change error, but we tried a couple of times.
- // Ignore this file for now.
- // Lets remove the file from the server (at least if it is new) as it is different
- // from our file here.
- if( _item._instruction == CSYNC_INSTRUCTION_NEW ) {
- QScopedPointer<char, QScopedPointerPodDeleter> uri(
- ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
-
- int rc = ne_delete(_propagator->_session, uri.data());
- qDebug() << "Remove the invalid file from server:" << rc;
- }
-
- const QString errMsg = tr("Local file changed during sync, syncing once it arrived completely");
- done( SyncFileItem::SoftError, errMsg );
- emit progress(Progress::Error, _item._file, 0,
- (quint64) "Local file changed during sync, syncing once it arrived completely"); // FIXME: Use errMsg
-
- return;
+ if( attempts++ < 20 ) { /* FIXME: How often do we want to try? */
+ qDebug("SOURCE file has changed during upload, retry #%d in two seconds!", attempts);
+ sleep(2);
+ continue;
+ }
+ // Still the file change error, but we tried a couple of times.
+ // Ignore this file for now.
+ // Lets remove the file from the server (at least if it is new) as it is different
+ // from our file here.
+ if( _item._instruction == CSYNC_INSTRUCTION_NEW ) {
+ QScopedPointer<char, QScopedPointerPodDeleter> uri(
+ ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
+
+ int rc = ne_delete(_propagator->_session, uri.data());
+ qDebug() << "Remove the invalid file from server:" << rc;
+ }
+
+ 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);
- emit progress(Progress::Error, _item._file, 0,
- (quint64) "User terminated sync process!" ); // FIXME: Use errMsg
+ _item._errorString = errMsg;
+ emit progressProblem( Progress::SoftError, _item );
} 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 progress(Progress::EndUpload, _item._file, 0, _item._size);
+ emit progressProblem(Progress::NormalError, _item);
}
return;
}
@@ -401,7 +401,7 @@ void PropagateUploadFile::start()
// Remove from the progress database:
_propagator->_journal->setUploadInfo(_item._file, SyncJournalDb::UploadInfo());
_propagator->_journal->commit("upload file start");
- emit progress(Progress::EndUpload, _item._file, 0, _item._size);
+ emit progress(Progress::EndUpload, _item, 0, _item._size);
done(SyncFileItem::Success);
return;
@@ -595,7 +595,7 @@ private:
{
PropagateDownloadFile* that = reinterpret_cast<PropagateDownloadFile*>(userdata);
if (status == ne_status_recving && info->sr.total > 0) {
- emit that->progress(Progress::Context, that->_item._file, info->sr.progress, info->sr.total );
+ emit that->progress(Progress::Context, that->_item, info->sr.progress, info->sr.total );
that->limitBandwidth(info->sr.progress, that->_propagator->_downloadLimit);
}
}
@@ -603,7 +603,7 @@ private:
void PropagateDownloadFile::start()
{
- emit progress(Progress::StartDownload, _item._file, 0, _item._size);
+ emit progress(Progress::StartDownload, _item, 0, _item._size);
QString tmpFileName;
const SyncJournalDb::DownloadInfo progressInfo = _propagator->_journal->getDownloadInfo(_item._file);
@@ -777,7 +777,7 @@ void PropagateDownloadFile::start()
_propagator->_journal->setFileRecord(SyncJournalFileRecord(_item, fn));
_propagator->_journal->setDownloadInfo(_item._file, SyncJournalDb::DownloadInfo());
_propagator->_journal->commit("download file start2");
- emit progress(Progress::EndDownload, _item._file, 0, _item._size);
+ emit progress(Progress::EndDownload, _item, 0, _item._size);
done(isConflict ? SyncFileItem::Conflict : SyncFileItem::Success);
}
@@ -785,7 +785,7 @@ DECLARE_JOB(PropagateLocalRename)
void PropagateLocalRename::start()
{
- emit progress(Progress::StartRename, _item._file, 0, _item._size);
+ emit progress(Progress::StartRename, _item, 0, _item._size);
if (_item._file != _item._renameTarget) {
qDebug() << "MOVE " << _propagator->_localDir + _item._file << " => " << _propagator->_localDir + _item._renameTarget;
QFile::rename(_propagator->_localDir + _item._file, _propagator->_localDir + _item._renameTarget);
@@ -803,7 +803,7 @@ void PropagateLocalRename::start()
_propagator->_journal->setFileRecord(record);
_propagator->_journal->commit("localRename");
- emit progress(Progress::EndRename, _item._file, 0, _item._size);
+ emit progress(Progress::EndRename, _item, 0, _item._size);
done(SyncFileItem::Success);
}
@@ -831,7 +831,7 @@ void PropagateRemoteRename::start()
}
return;
} else {
- emit progress(Progress::StartRename, _item._file, 0, _item._size);
+ emit progress(Progress::StartRename, _item, 0, _item._size);
QScopedPointer<char, QScopedPointerPodDeleter> uri1(ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
QScopedPointer<char, QScopedPointerPodDeleter> uri2(ne_path_escape((_propagator->_remoteDir + _item._renameTarget).toUtf8()));
@@ -843,7 +843,7 @@ void PropagateRemoteRename::start()
}
updateMTimeAndETag(uri2.data(), _item._modtime);
- emit progress(Progress::EndRename, _item._file, 0, _item._size);
+ emit progress(Progress::EndRename, _item, 0, _item._size);
}
@@ -996,7 +996,8 @@ void OwncloudPropagator::start(const SyncFileItemVector& _syncedItems)
}
connect(_rootJob.data(), SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem)));
- connect(_rootJob.data(), SIGNAL(progress(Progress::Kind,QString,quint64,quint64)), this, SIGNAL(progress(Progress::Kind,QString,quint64,quint64)));
+ connect(_rootJob.data(), SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)), this,
+ SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)));
connect(_rootJob.data(), SIGNAL(finished(SyncFileItem::Status)), this, SIGNAL(finished()));
_rootJob->start();
diff --git a/src/mirall/owncloudpropagator.h b/src/mirall/owncloudpropagator.h
index 11c31aece..fed659533 100644
--- a/src/mirall/owncloudpropagator.h
+++ b/src/mirall/owncloudpropagator.h
@@ -43,7 +43,8 @@ public slots:
signals:
void finished(SyncFileItem::Status);
void completed(const SyncFileItem &);
- void progress(Progress::Kind, const QString &filename, quint64 bytes, quint64 total);
+ void progress(Progress::Kind, const SyncFileItem& item, quint64 bytes, quint64 total);
+ void progressProblem( Progress::Kind, const SyncFileItem& );
};
/*
@@ -84,7 +85,7 @@ private slots:
void startJob(PropagatorJob *next) {
connect(next, SIGNAL(finished(SyncFileItem::Status)), this, SLOT(proceedNext(SyncFileItem::Status)), Qt::QueuedConnection);
connect(next, SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem)));
- connect(next, SIGNAL(progress(Progress::Kind,QString,quint64,quint64)), this, SIGNAL(progress(Progress::Kind,QString,quint64,quint64)));
+ connect(next, SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)), this, SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)));
next->start();
}
@@ -170,7 +171,8 @@ public:
signals:
void completed(const SyncFileItem &);
- void progress(Progress::Kind, const QString &filename, quint64 bytes, quint64 total);
+ void progress(Progress::Kind kind, const SyncFileItem&, quint64 bytes, quint64 total);
+ void progressProblem( Progress::Kind, const SyncFileItem& );
void finished();
};
diff --git a/src/mirall/progressdispatcher.cpp b/src/mirall/progressdispatcher.cpp
index f5a23f6b8..f7aea4349 100644
--- a/src/mirall/progressdispatcher.cpp
+++ b/src/mirall/progressdispatcher.cpp
@@ -168,59 +168,57 @@ QList<Progress::SyncProblem> ProgressDispatcher::recentProblems(int count)
return _recentProblems;
}
+void ProgressDispatcher::setProgressProblem(const QString& folder, const Progress::SyncProblem &problem)
+{
+ Q_ASSERT( Progress::isErrorKind(problem.kind));
+
+ _recentProblems.prepend( problem );
+ if( _recentProblems.size() > _QueueSize ) {
+ _recentProblems.removeLast();
+ }
+ emit progressSyncProblem( folder, problem );
+}
+
void ProgressDispatcher::setProgressInfo(const QString& folder, const Progress::Info& progress)
{
if( folder.isEmpty() ) {
return;
}
- Progress::Info newProgress = progress;
-
- if( newProgress.kind == Progress::Error ) {
- Progress::SyncProblem err;
- err.folder = folder;
- err.current_file = newProgress.current_file;
- // its really
- err.error_message = QString::fromLocal8Bit( (const char*)newProgress.file_size );
- err.error_code = newProgress.current_file_bytes;
- err.timestamp = QDateTime::currentDateTime();
-
- _recentProblems.prepend( err );
- if( _recentProblems.size() > _QueueSize ) {
- _recentProblems.removeLast();
- }
- emit progressSyncProblem( folder, err );
- } else {
- if( newProgress.kind == Progress::StartSync ) {
- _recentProblems.clear();
- _timer.start();
- }
- if( newProgress.kind == Progress::EndSync ) {
- newProgress.overall_current_bytes = newProgress.overall_transmission_size;
- newProgress.current_file_no = newProgress.overall_file_count;
- _currentAction.remove(newProgress.folder);
- qint64 msecs = _timer.elapsed();
-
- qDebug()<< "[PROGRESS] progressed " << newProgress.overall_transmission_size
- << " bytes in " << newProgress.overall_file_count << " files"
- << " in msec " << msecs;
- }
- if( newProgress.kind == Progress::EndDownload ||
- newProgress.kind == Progress::EndUpload ||
- newProgress.kind == Progress::EndDelete ||
- newProgress.kind == Progress::EndRename ) {
- _recentChanges.prepend(newProgress);
- if( _recentChanges.size() > _QueueSize ) {
- _recentChanges.removeLast();
- }
- }
- // store the last real action to help clients that start during
- // the Context-phase of an upload or download.
- if( newProgress.kind != Progress::Context ) {
- _currentAction[folder] = newProgress.kind;
- }
+ Progress::Info newProgress(progress);
+
+ Q_ASSERT( !Progress::isErrorKind(progress.kind));
- emit progressInfo( folder, newProgress );
+ if( newProgress.kind == Progress::StartSync ) {
+ _recentProblems.clear();
+ _timer.start();
+ }
+ if( newProgress.kind == Progress::EndSync ) {
+ newProgress.overall_current_bytes = newProgress.overall_transmission_size;
+ newProgress.current_file_no = newProgress.overall_file_count;
+ _currentAction.remove(newProgress.folder);
+ qint64 msecs = _timer.elapsed();
+
+ qDebug()<< "[PROGRESS] progressed " << newProgress.overall_transmission_size
+ << " bytes in " << newProgress.overall_file_count << " files"
+ << " in msec " << msecs;
+ }
+ if( newProgress.kind == Progress::EndDownload ||
+ newProgress.kind == Progress::EndUpload ||
+ newProgress.kind == Progress::EndDelete ||
+ newProgress.kind == Progress::EndRename ) {
+ _recentChanges.prepend(newProgress);
+ if( _recentChanges.size() > _QueueSize ) {
+ _recentChanges.removeLast();
+ }
+ }
+ // store the last real action to help clients that start during
+ // the Context-phase of an upload or download.
+ if( newProgress.kind != Progress::Context ) {
+ _currentAction[folder] = newProgress.kind;
}
+
+ emit progressInfo( folder, newProgress );
+
}
Progress::Kind ProgressDispatcher::currentFolderContext( const QString& folder )
diff --git a/src/mirall/progressdispatcher.h b/src/mirall/progressdispatcher.h
index dbeab03f2..12a2dc123 100644
--- a/src/mirall/progressdispatcher.h
+++ b/src/mirall/progressdispatcher.h
@@ -69,15 +69,20 @@ namespace Progress
};
struct SyncProblem {
+ Kind kind;
QString folder;
QString current_file;
QString error_message;
int error_code;
QDateTime timestamp;
+
+ SyncProblem() : kind(Invalid), error_code(0) {}
};
QString asActionString( Kind );
QString asResultString( Kind );
+
+ bool isErrorKind( Kind );
}
/**
@@ -102,6 +107,7 @@ public:
QList<Progress::SyncProblem> recentProblems(int count);
Progress::Kind currentFolderContext( const QString& folder );
+
signals:
/**
@brief Signals the progress of data transmission.
@@ -115,7 +121,8 @@ signals:
void progressSyncProblem( const QString& folder, const Progress::SyncProblem& problem );
protected:
- void setProgressInfo(const QString &folder, const Progress::Info& progress);
+ void setProgressInfo(const QString& folder, const Progress::Info& progress);
+ void setProgressProblem( const QString& folder, const Progress::SyncProblem& problem);
private:
ProgressDispatcher(QObject* parent = 0);