nextcloud-desktop/src/gui/folder.h

315 lines
8.1 KiB
C
Raw Normal View History

2011-04-06 13:48:02 +04:00
/*
* Copyright (C) by Duncan Mac-Vicar P. <duncan@kde.org>
2013-07-22 22:27:42 +04:00
* Copyright (C) by Daniel Molkentin <danimo@owncloud.com>
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
2011-04-06 13:48:02 +04:00
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
2011-02-17 02:21:45 +03:00
#ifndef MIRALL_FOLDER_H
#define MIRALL_FOLDER_H
#include "syncresult.h"
#include "progressdispatcher.h"
#include "syncjournaldb.h"
#include "clientproxy.h"
#include "syncfilestatus.h"
#include "networkjobs.h"
#include <csync.h>
2013-07-22 22:27:42 +04:00
#include <QDir>
#include <QHash>
#include <QSet>
2011-02-17 02:21:45 +03:00
#include <QObject>
#include <QStringList>
2011-02-17 02:21:45 +03:00
2013-07-22 22:27:42 +04:00
#include <QDebug>
#include <QTimer>
2013-08-08 16:30:45 +04:00
#include <qelapsedtimer.h>
2011-04-08 13:36:53 +04:00
class QThread;
2015-04-24 11:18:33 +03:00
class QSettings;
2011-02-17 02:21:45 +03:00
2014-11-10 00:34:07 +03:00
namespace OCC {
2011-02-17 02:21:45 +03:00
class SyncEngine;
class AccountState;
2015-06-29 19:56:09 +03:00
/**
* @brief The FolderDefinition class
* @ingroup gui
*/
2015-04-24 11:18:33 +03:00
class FolderDefinition
{
public:
FolderDefinition()
: paused(false)
, ignoreHiddenFiles(true)
2015-04-24 11:18:33 +03:00
{}
/// The name of the folder in the ui and internally
QString alias;
/// path on local machine
QString localPath;
/// path on remote
QString targetPath;
/// whether the folder is paused
bool paused;
/// whether the folder syncs hidden files
bool ignoreHiddenFiles;
2015-04-24 11:18:33 +03:00
/// Saves the folder definition, creating a new settings group.
static void save(QSettings& settings, const FolderDefinition& folder);
/// Reads a folder definition from a settings group with the name 'alias'.
static bool load(QSettings& settings, const QString& alias,
FolderDefinition* folder);
/// Ensure / as separator and trailing /.
static QString prepareLocalPath(const QString& path);
2015-04-24 11:18:33 +03:00
};
2015-06-29 19:56:09 +03:00
/**
* @brief The Folder class
* @ingroup gui
*/
2014-07-11 00:58:58 +04:00
class Folder : public QObject
2011-02-17 02:21:45 +03:00
{
Q_OBJECT
public:
Folder(const FolderDefinition& definition, QObject* parent = 0L);
2013-07-22 22:27:42 +04:00
~Folder();
2011-02-17 02:21:45 +03:00
typedef QMap<QString, Folder*> Map;
typedef QMapIterator<QString, Folder*> MapIterator;
/**
* The account the folder is configured on.
*/
void setAccountState( AccountState *account );
AccountState* accountState() const;
2011-04-06 11:52:02 +04:00
/**
* alias or nickname
*/
QString alias() const;
QString aliasGui() const; // since 2.0 we don't want to show aliases anymore, show the path instead
2011-04-06 11:52:02 +04:00
/**
* short path to display on the GUI (native separators)
*/
QString shortGuiPath() const;
/**
* local folder path
*/
QString path() const;
2013-10-21 23:42:52 +04:00
/**
* wrapper for QDir::cleanPath("Z:\\"), which returns "Z:\\", but we need "Z:" instead
*/
QString cleanPath();
2013-07-22 22:27:42 +04:00
/**
* remote folder path
*/
2013-10-21 23:42:52 +04:00
QString remotePath() const;
/**
* remote folder path with server url
*/
QUrl remoteUrl() const;
2011-10-13 18:41:24 +04:00
/**
* switch sync on or off
* If the sync is switched off, the startSync method is not going to
* be called.
*/
void setSyncPaused( bool );
2011-10-13 18:41:24 +04:00
bool syncPaused() const;
2011-10-13 18:41:24 +04:00
/**
* Returns true when the folder may sync.
*
* !syncPaused() && accountState->isConnected().
*/
bool canSync() const;
void prepareToSync();
/**
* True if the folder is busy and can't initiate
* a synchronization
*/
2013-07-22 22:27:42 +04:00
virtual bool isBusy() const;
2011-09-27 10:15:30 +04:00
2011-10-13 18:41:24 +04:00
/**
* return the last sync result with error message and status
*/
SyncResult syncResult() const;
/**
* set the config file name.
*/
void setConfigFile( const QString& );
QString configFile();
/**
* This is called if the sync folder definition is removed. Do cleanups here.
*/
virtual void wipe();
void setSyncState(SyncResult::Status state);
void setDirtyNetworkLimits();
/**
* Ignore syncing of hidden files or not. This is defined in the
* folder definition
*/
bool ignoreHiddenFiles();
void setIgnoreHiddenFiles(bool ignore);
// Used by the Socket API
SyncJournalDb *journalDb() { return &_journal; }
bool estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s);
RequestEtagJob *etagJob() { return _requestEtagJob; }
2015-01-16 12:52:26 +03:00
qint64 msecSinceLastSync() const { return _timeSinceLastSyncDone.elapsed(); }
qint64 msecLastSyncDuration() const { return _lastSyncDuration; }
int consecutiveFollowUpSyncs() const { return _consecutiveFollowUpSyncs; }
2015-04-24 11:18:33 +03:00
/// Saves the folder data in the account's settings.
void saveToSettings() const;
/// Removes the folder from the account's settings.
void removeFromSettings() const;
signals:
void syncStateChange();
void syncStarted();
void syncFinished(const SyncResult &result);
void scheduleToSync(Folder*);
void progressInfo(const ProgressInfo& progress);
void newBigFolderDiscovered(const QString &); // A new folder bigger than the threshold was discovered
2011-11-04 14:41:49 +04:00
public slots:
/**
* terminate the current sync run
*/
void slotTerminateSync();
2013-07-22 22:27:42 +04:00
void slotAboutToRemoveAllFiles(SyncFileItem::Direction, bool*);
2011-02-17 02:21:45 +03:00
2013-07-22 22:27:42 +04:00
/**
* Starts a sync operation
*
* If the list of changed files is known, it is passed.
*/
void startSync(const QStringList &pathList = QStringList());
void setProxyDirty(bool value);
bool proxyDirty();
int slotDiscardDownloadProgress();
int downloadInfoCount();
int slotWipeErrorBlacklist();
int errorBlackListEntryCount();
/**
* Triggered by the folder watcher when a file/dir in this folder
* changes. Needs to check whether this change should trigger a new
* sync run to be scheduled.
*/
void slotWatchedPathChanged(const QString& path);
2013-07-22 22:27:42 +04:00
private slots:
void slotSyncStarted();
void slotSyncError(const QString& );
2013-07-22 22:27:42 +04:00
void slotCsyncUnavailable();
void slotSyncFinished();
2013-07-22 22:27:42 +04:00
void slotFolderDiscovered(bool local, QString folderName);
void slotTransmissionProgress(const ProgressInfo& pi);
void slotItemCompleted(const SyncFileItem&, const PropagatorJob&);
void slotSyncItemDiscovered(const SyncFileItem & item);
void slotRunEtagJob();
void etagRetreived(const QString &);
void etagRetreivedFromSyncEngine(const QString &);
void slotAboutToPropagate(SyncFileItemVector& );
void slotThreadTreeWalkResult(const SyncFileItemVector& ); // after sync is done
void slotEmitFinishedDelayed();
void watcherSlot(QString);
void slotNewBigFolderDiscovered(const QString &);
private:
2013-07-22 22:27:42 +04:00
bool init();
bool setIgnoredFiles();
void bubbleUpSyncResult();
2013-07-22 22:27:42 +04:00
void checkLocalPath();
void createGuiLog(const QString& filename, SyncFileStatus status, int count,
const QString& renameTarget = QString::null );
AccountState* _accountState;
2015-04-24 11:18:33 +03:00
FolderDefinition _definition;
2013-07-22 22:27:42 +04:00
SyncResult _syncResult;
QScopedPointer<SyncEngine> _engine;
2013-07-22 22:27:42 +04:00
QStringList _errors;
bool _csyncError;
bool _csyncUnavail;
bool _wipeDb;
bool _proxyDirty;
QPointer<RequestEtagJob> _requestEtagJob;
QString _lastEtag;
2015-01-16 12:52:26 +03:00
QElapsedTimer _timeSinceLastSyncDone;
QElapsedTimer _timeSinceLastSyncStart;
qint64 _lastSyncDuration;
bool _forceSyncOnPollTimeout;
2013-07-22 22:27:42 +04:00
/// The number of syncs that failed in a row.
/// Reset when a sync is successful.
int _consecutiveFailingSyncs;
2013-07-22 22:27:42 +04:00
/// The number of requested follow-up syncs.
/// Reset when no follow-up is requested.
int _consecutiveFollowUpSyncs;
// For the SocketAPI folder states
QSet<QString> _stateLastSyncItemsWithErrorNew; // gets moved to _stateLastSyncItemsWithError at end of sync
QSet<QString> _stateLastSyncItemsWithError;
QSet<QString> _stateTaintedFolders;
2013-07-22 22:27:42 +04:00
SyncJournalDb _journal;
ClientProxy _clientProxy;
2013-07-22 22:27:42 +04:00
CSYNC *_csync_ctx;
2011-02-17 02:21:45 +03:00
};
}
#endif