} else if (oldState == SignedOut && _state == Disconnected) {
checkConnectivity();
}
+ if (oldState == Connected || _state == Connected) {
+ emit isConnectedChanged();
+ }
}
// might not have changed but the underlying _connectionErrors might have
return isConnected() || _state == ServiceUnavailable;
}
-bool AccountState::canSync() const
-{
- return isConnected();
-}
-
void AccountState::tagLastSuccessfullETagRequest()
{
_timeSinceLastETagCheck.restart();
bool isConnected() const;
bool isConnectedOrTemporarilyUnavailable() const;
- /// Returns whether sync actions are allowed to run.
- bool canSync() const;
-
/// Triggers a ping to the server to update state and
/// connection status and errors.
void checkConnectivity();
signals:
void stateChanged(int state);
+ void isConnectedChanged();
protected Q_SLOTS:
void slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList& errors);
if (!setIgnoredFiles())
qWarning("Could not read system exclude file");
+ connect(_accountState.data(), SIGNAL(isConnectedChanged()), this, SIGNAL(canSyncChanged()));
connect(_engine.data(), SIGNAL(rootEtag(QString)), this, SLOT(etagRetreivedFromSyncEngine(QString)));
connect(_engine.data(), SIGNAL(treeWalkResult(const SyncFileItemVector&)),
this, SLOT(slotThreadTreeWalkResult(const SyncFileItemVector&)), Qt::QueuedConnection);
bool Folder::canSync() const
{
- return !syncPaused() && accountState()->canSync();
+ return !syncPaused() && accountState()->isConnected();
}
void Folder::setSyncPaused( bool paused )
}
emit syncPausedChanged(this, paused);
emit syncStateChange();
+ emit canSyncChanged();
}
void Folder::setSyncState(SyncResult::Status state)
QFile::remove( stateDbFile + "-wal" );
QFile::remove( stateDbFile + "-journal" );
- FolderMan::instance()->socketApi()->slotRegisterPath(alias());
+ if (canSync())
+ FolderMan::instance()->socketApi()->slotRegisterPath(alias());
}
bool Folder::setIgnoredFiles()
/**
* Returns true when the folder may sync.
- *
- * !syncPaused() && accountState->canSync().
*/
bool canSync() const;
void progressInfo(const ProgressInfo& progress);
void newBigFolderDiscovered(const QString &); // A new folder bigger than the threshold was discovered
void syncPausedChanged(Folder*, bool paused);
+ void canSyncChanged();
/**
* Fires for each change inside this folder that wasn't caused
}
// register the folder with the socket API
- _socketApi->slotRegisterPath(folder->alias());
+ if (folder->canSync())
+ _socketApi->slotRegisterPath(folder->alias());
}
void FolderMan::addMonitorPath( const QString& alias, const QString& path )
}
}
+void FolderMan::slotFolderCanSyncChanged()
+{
+ Folder *f = qobject_cast<Folder*>(sender());
+ Q_ASSERT(f);
+ if (f->canSync()) {
+ _socketApi->slotRegisterPath(f->alias());
+ } else {
+ _socketApi->slotUnregisterPath(f->alias());
+ }
+}
+
// this really terminates the current sync process
// ie. no questions, no prisoners
// csync still remains in a stable state, regardless of that.
}
QString accountName = accountState->account()->displayName();
- if (accountState->canSync()) {
+ if (accountState->isConnected()) {
qDebug() << "Account" << accountName << "connected, scheduling its folders";
foreach (Folder *f, _folderMap.values()) {
connect(folder, SIGNAL(syncFinished(SyncResult)), SLOT(slotFolderSyncFinished(SyncResult)));
connect(folder, SIGNAL(syncStateChange()), SLOT(slotForwardFolderSyncStateChange()));
connect(folder, SIGNAL(syncPausedChanged(Folder*,bool)), SLOT(slotFolderSyncPaused(Folder*,bool)));
+ connect(folder, SIGNAL(canSyncChanged()), SLOT(slotFolderCanSyncChanged()));
connect(&folder->syncEngine().syncFileStatusTracker(), SIGNAL(fileStatusChanged(const QString &, SyncFileStatus)),
_socketApi.data(), SLOT(slotFileStatusChanged(const QString &, SyncFileStatus)));
connect(folder, SIGNAL(watchedFileChangedExternally(QString)),
public slots:
void slotRemoveFolder( Folder* );
void slotFolderSyncPaused(Folder *, bool paused);
+ void slotFolderCanSyncChanged();
void slotFolderSyncStarted();
void slotFolderSyncFinished( const SyncResult& );
_listeners.append(socket);
foreach( Folder *f, FolderMan::instance()->map() ) {
- QString message = buildRegisterPathMessage(f->path());
- sendMessage(socket, message);
+ if (f->canSync()) {
+ QString message = buildRegisterPathMessage(f->path());
+ sendMessage(socket, message);
+ }
}
}
void SocketApi::slotRegisterPath( const QString& alias )
{
+ // Make sure not to register twice to each connected client
+ if (_registeredAliases.contains(alias))
+ return;
+
Folder *f = FolderMan::instance()->folder(alias);
if (f) {
QString message = buildRegisterPathMessage(f->path());
sendMessage(socket, message);
}
}
+
+ _registeredAliases.insert(alias);
}
void SocketApi::slotUnregisterPath( const QString& alias )
{
+ if (!_registeredAliases.contains(alias))
+ return;
+
Folder *f = FolderMan::instance()->folder(alias);
if (f)
broadcastMessage(QLatin1String("UNREGISTER_PATH"), f->path(), QString::null, true );
+
+ _registeredAliases.remove(alias);
}
void SocketApi::slotUpdateFolderView(Folder *f)
void SocketApi::command_RETRIEVE_FILE_STATUS(const QString& argument, QIODevice* socket)
{
- const QString nopString("NOP");
-
if( !socket ) {
qDebug() << "No valid socket object.";
return;
Folder* syncFolder = FolderMan::instance()->folderForPath( argument );
if (!syncFolder) {
// this can happen in offline mode e.g.: nothing to worry about
- statusString = nopString;
+ statusString = QLatin1String("NOP");
} else {
const QString file = QDir::cleanPath(argument).mid(syncFolder->cleanPath().length()+1);
+ SyncFileStatus fileStatus = syncFolder->syncEngine().syncFileStatusTracker().fileStatus(file);
- // future: Send more specific states for paused, disconnected etc.
- if( syncFolder->syncPaused() || !syncFolder->accountState()->isConnected() ) {
- statusString = nopString;
- } else {
- SyncFileStatus fileStatus = syncFolder->syncEngine().syncFileStatusTracker().fileStatus(file);
-
- statusString = fileStatus.toSocketAPIString();
- }
+ statusString = fileStatus.toSocketAPIString();
}
const QString message = QLatin1String("STATUS:") % statusString % QLatin1Char(':') % QDir::toNativeSeparators(argument);
Q_INVOKABLE void command_SHARE_MENU_TITLE(const QString& argument, QIODevice* socket);
QString buildRegisterPathMessage(const QString& path);
+ QSet<QString> _registeredAliases;
QList<QIODevice*> _listeners;
SocketApiServer _localServer;
};