nextcloud-desktop/src/mirall/folder.h

217 lines
4.8 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
2013-07-22 22:27:42 +04:00
#include "mirall/syncresult.h"
#include "mirall/progressdispatcher.h"
#include "mirall/csyncthread.h"
2013-07-22 22:27:42 +04:00
#include <QDir>
#include <QHash>
#include <QNetworkAccessManager>
#include <QNetworkProxy>
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 QFileSystemWatcher;
class QThread;
2011-02-17 02:21:45 +03:00
namespace Mirall {
class FolderWatcher;
2013-07-22 22:27:42 +04:00
typedef enum SyncFileStatus_s {
STATUS_NONE,
STATUS_EVAL,
STATUS_REMOVE,
STATUS_RENAME,
STATUS_NEW,
STATUS_CONFLICT,
STATUS_IGNORE,
STATUS_SYNC,
STATUS_STAT_ERROR,
STATUS_ERROR,
STATUS_UPDATED
} SyncFileStatus;
2011-02-17 02:21:45 +03:00
class Folder : public QObject
{
Q_OBJECT
2013-07-22 22:27:42 +04:00
protected:
friend class FolderMan;
Folder(const QString&, const QString&, const QString& , QObject*parent = 0L);
2013-07-22 22:27:42 +04:00
public:
~Folder();
2011-02-17 02:21:45 +03:00
typedef QHash<QString, Folder*> Map;
typedef QHashIterator<QString, Folder*> MapIterator;
2013-07-22 22:27:42 +04:00
/**
* Get status about a single file.
*/
SyncFileStatus fileStatus( const QString& );
2011-04-06 11:52:02 +04:00
/**
* alias or nickname
*/
QString alias() const;
/**
* local folder path
*/
QString path() const;
2013-07-22 22:27:42 +04:00
/**
* remote folder path
*/
QString secondPath() const;
/**
* local folder path with native separators
*/
QString nativePath() const;
2013-07-22 22:27:42 +04:00
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 setSyncEnabled( bool );
bool syncEnabled() const;
/**
* 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();
signals:
void syncStateChange();
void syncStarted();
void syncFinished(const SyncResult &result);
void scheduleToSync( const QString& );
2011-11-04 14:41:49 +04:00
public slots:
/**
*
*/
void slotChanged(const QStringList &pathList = QStringList() );
2011-11-04 14:41:49 +04:00
/**
* terminate the current sync run
*/
2013-07-22 22:27:42 +04:00
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());
private slots:
void slotCSyncStarted();
void slotCSyncError(const QString& );
void slotCsyncUnavailable();
void slotCSyncFinished();
void slotTransmissionProgress(const Progress::Info& progress);
void slotPollTimerTimeout();
void etagRetreived(const QString &);
void slotNetworkUnavailable();
/**
* Triggered by a file system watcher on the local sync dir
*/
2013-07-22 22:27:42 +04:00
void slotLocalPathChanged( const QString& );
void slotThreadTreeWalkResult(const SyncFileItemVector& );
void slotCatchWatcherError( const QString& );
2013-07-22 22:27:42 +04:00
protected:
bool init();
void setSyncState(SyncResult::Status state);
void setIgnoredFiles();
void setProxy();
const char* proxyTypeToCStr(QNetworkProxy::ProxyType type);
void bubbleUpSyncResult();
2011-04-06 17:57:18 +04:00
/**
* Starts a sync (calling startSync)
* if the policies allow for it
*/
void evaluateSync(const QStringList &pathList);
2013-07-22 22:27:42 +04:00
void checkLocalPath();
2011-11-04 14:41:49 +04:00
QString _path;
QString _secondPath;
2011-11-04 14:41:49 +04:00
QString _alias;
QString _configFile;
QFileSystemWatcher *_pathWatcher;
bool _enabled;
2013-07-22 22:27:42 +04:00
FolderWatcher *_watcher;
SyncResult _syncResult;
QThread *_thread;
CSyncThread *_csync;
QStringList _errors;
bool _csyncError;
bool _csyncUnavail;
bool _wipeDb;
Progress::Kind _progressKind;
QTimer _pollTimer;
QString _lastEtag;
2013-08-08 16:30:45 +04:00
QElapsedTimer _timeSinceLastSync;
2013-07-22 22:27:42 +04:00
CSYNC *_csync_ctx;
2011-02-17 02:21:45 +03:00
};
}
#endif