diff options
Diffstat (limited to 'src/mirall/folderwatcher.cpp')
-rw-r--r-- | src/mirall/folderwatcher.cpp | 91 |
1 files changed, 74 insertions, 17 deletions
diff --git a/src/mirall/folderwatcher.cpp b/src/mirall/folderwatcher.cpp index b682f9f87..483348e48 100644 --- a/src/mirall/folderwatcher.cpp +++ b/src/mirall/folderwatcher.cpp @@ -20,25 +20,38 @@ static const uint32_t standard_event_mask = /* minimum amount of seconds between two events to consider it a new event */ #define DEFAULT_EVENT_INTERVAL_SEC 5 +#define DEFAULT_POLL_INTERVAL_SEC 30 namespace Mirall { - FolderWatcher::FolderWatcher(const QString &root, QObject *parent) : QObject(parent), _eventsEnabled(true), _eventInterval(DEFAULT_EVENT_INTERVAL_SEC), + _pollInterval(DEFAULT_POLL_INTERVAL_SEC), _root(root), _processTimer(new QTimer(this)), + _pollTimer(new QTimer(this)), _lastMask(0) { + // this is not the best place for this + addIgnore("/**/.unison*"); + _processTimer->setSingleShot(true); QObject::connect(_processTimer, SIGNAL(timeout()), this, SLOT(slotProcessTimerTimeout())); + _pollTimer->setSingleShot(false); + _pollTimer->setInterval(pollInterval() * 1000); + QObject::connect(_pollTimer, SIGNAL(timeout()), this, SLOT(slotPollTimerTimeout())); + _pollTimer->start(); + _inotify = new INotify(standard_event_mask); slotAddFolderRecursive(root); QObject::connect(_inotify, SIGNAL(notifyEvent(int, int, const QString &)), SLOT(slotINotifyEvent(int, int, const QString &))); + // do a first synchronization to get changes while + // the application was not running + setProcessTimer(); } FolderWatcher::~FolderWatcher() @@ -51,6 +64,11 @@ QString FolderWatcher::root() const return _root; } +void FolderWatcher::addIgnore(const QString &pattern) +{ + _ignores.append(pattern); +} + bool FolderWatcher::eventsEnabled() const { return _eventsEnabled; @@ -84,6 +102,16 @@ void FolderWatcher::setEventInterval(int seconds) _eventInterval = seconds; } +int FolderWatcher::pollInterval() const +{ + return _pollInterval; +} + +void FolderWatcher::setPollInterval(int seconds) +{ + _pollInterval = seconds; +} + QStringList FolderWatcher::folders() const { return _inotify->directories(); @@ -102,6 +130,16 @@ void FolderWatcher::slotAddFolderRecursive(const QString &path) if (folder.exists() && !watchedFolders.contains(folder.path())) { subdirs++; //qDebug() << "(+) Watcher:" << folder.path(); + // check that it does not match the ignore list + foreach (QString pattern, _ignores) { + QRegExp regexp(pattern); + regexp.setPatternSyntax(QRegExp::Wildcard); + if (regexp.exactMatch(folder.path())) { + qDebug() << "* Not adding" << folder.path(); + continue; + } + + } _inotify->addPath(folder.path()); } else @@ -137,14 +175,17 @@ void FolderWatcher::slotINotifyEvent(int mask, int cookie, const QString &path) if (mask & IN_CREATE) { //qDebug() << cookie << " CREATE: " << path; if (QFileInfo(path).isDir()) { + //setEventsEnabled(false); slotAddFolderRecursive(path); + //setEventsEnabled(true); } } else if (mask & IN_DELETE) { //qDebug() << cookie << " DELETE: " << path; - if (_inotify->directories().contains(path)); + if (_inotify->directories().contains(path) && + QFileInfo(path).isDir()); qDebug() << "(-) Watcher:" << path; - _inotify->removePath(path); + _inotify->removePath(path); } else if (mask & IN_CLOSE_WRITE) { //qDebug() << cookie << " WRITABLE CLOSED: " << path; @@ -156,6 +197,15 @@ void FolderWatcher::slotINotifyEvent(int mask, int cookie, const QString &path) //qDebug() << cookie << " OTHER " << mask << " :" << path; } + foreach (QString pattern, _ignores) { + QRegExp regexp(pattern); + regexp.setPatternSyntax(QRegExp::Wildcard); + if (regexp.exactMatch(path)) { + qDebug() << "* Discarded" << path; + return; + } + } + _pendingPaths.append(path); slotProcessPaths(); } @@ -166,38 +216,45 @@ void FolderWatcher::slotProcessTimerTimeout() slotProcessPaths(); } +void FolderWatcher::slotPollTimerTimeout() +{ + qDebug() << "* Polling remote for changes"; + emit folderChanged(QStringList()); +} + void FolderWatcher::setProcessTimer() { if (!_processTimer->isActive()) { - qDebug() << "* Pending events will be processed in" << eventInterval() << "seconds. (" << _pendingPaths.size() << "events until now )"; - _processTimer->start(eventInterval() * 1000); + qDebug() << "* Pending events will be processed in" << eventInterval() << "seconds (" << QTime::currentTime().addSecs(eventInterval()).toString("HH:mm:ss") << ")." << _pendingPaths.size() << "events until now )"; } + _processTimer->start(eventInterval() * 1000); } void FolderWatcher::slotProcessPaths() { QTime eventTime = QTime::currentTime(); + QTime lastEventTime = _lastEventTime; + _lastEventTime = eventTime; - if (!eventsEnabled()) - return; - - if (!_lastEventTime.isNull() && (_lastEventTime.secsTo(eventTime) < eventInterval())) { - //qDebug() << "`-> Last event happened less than " << eventInterval() << " seconds ago..."; - // schedule a forced queue cleanup later + // if the events are disabled or the last event happened + // recently eg: copying lot of ifles + if (!eventsEnabled() || + ( !lastEventTime.isNull() && + (lastEventTime.secsTo(eventTime) < eventInterval()) )) + { + // in case this is the last file from a bulk copy + // set the process timer again so that we process the + // queue we are not processing now setProcessTimer(); return; } - // if the events will be processed because changed files and not - // because a forced update, stop any timer. - if (_processTimer->isActive()) - _processTimer->stop(); - - _lastEventTime = eventTime; QStringList notifyPaths(_pendingPaths); _pendingPaths.clear(); + //qDebug() << lastEventTime << eventTime; qDebug() << " * Notify " << notifyPaths.size() << " changed items"; + emit folderChanged(notifyPaths); } |