summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qfilesystemwatcher.cpp
diff options
context:
space:
mode:
authorRobin Burchell <robin.burchell@collabora.com>2012-01-04 21:44:35 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-04 22:21:19 +0100
commit4b31b4e9e7c92665e035ed5042a786a61a3bfc9c (patch)
treed987ea7df121088a255ceb2943b93ea6bdb17f29 /src/corelib/io/qfilesystemwatcher.cpp
parent73187281c3f88b7a709713a2b09fb43871ea6b6d (diff)
Split polling watcher out to its own seperate files.
Just helps maintain sanity and clarity a bit. Change-Id: Iaf00f9ecf2d959afcd8fe18bbca71a403cf9818d Reviewed-by: Denis Dzyubenko <denis.dzyubenko@nokia.com> Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Diffstat (limited to 'src/corelib/io/qfilesystemwatcher.cpp')
-rw-r--r--src/corelib/io/qfilesystemwatcher.cpp180
1 files changed, 2 insertions, 178 deletions
diff --git a/src/corelib/io/qfilesystemwatcher.cpp b/src/corelib/io/qfilesystemwatcher.cpp
index 29abf96af1..c5d49a8caa 100644
--- a/src/corelib/io/qfilesystemwatcher.cpp
+++ b/src/corelib/io/qfilesystemwatcher.cpp
@@ -52,6 +52,8 @@
#include <qset.h>
#include <qtimer.h>
+
+#include "qfilesystemwatcher_polling_p.h"
#if defined(Q_OS_WIN)
# include "qfilesystemwatcher_win_p.h"
#elif defined(Q_OS_LINUX)
@@ -65,182 +67,6 @@
QT_BEGIN_NAMESPACE
-enum { PollingInterval = 1000 };
-
-class QPollingFileSystemWatcherEngine : public QFileSystemWatcherEngine
-{
- Q_OBJECT
-
- class FileInfo
- {
- uint ownerId;
- uint groupId;
- QFile::Permissions permissions;
- QDateTime lastModified;
- QStringList entries;
-
- public:
- FileInfo(const QFileInfo &fileInfo)
- : ownerId(fileInfo.ownerId()),
- groupId(fileInfo.groupId()),
- permissions(fileInfo.permissions()),
- lastModified(fileInfo.lastModified())
- {
- if (fileInfo.isDir()) {
- entries = fileInfo.absoluteDir().entryList(QDir::AllEntries);
- }
- }
- FileInfo &operator=(const QFileInfo &fileInfo)
- {
- *this = FileInfo(fileInfo);
- return *this;
- }
-
- bool operator!=(const QFileInfo &fileInfo) const
- {
- if (fileInfo.isDir() && entries != fileInfo.absoluteDir().entryList(QDir::AllEntries))
- return true;
- return (ownerId != fileInfo.ownerId()
- || groupId != fileInfo.groupId()
- || permissions != fileInfo.permissions()
- || lastModified != fileInfo.lastModified());
- }
- };
-
- mutable QMutex mutex;
- QHash<QString, FileInfo> files, directories;
-
-public:
- QPollingFileSystemWatcherEngine();
-
- void run();
-
- QStringList addPaths(const QStringList &paths, QStringList *files, QStringList *directories);
- QStringList removePaths(const QStringList &paths, QStringList *files, QStringList *directories);
-
- void stop();
-
-private Q_SLOTS:
- void timeout();
-};
-
-QPollingFileSystemWatcherEngine::QPollingFileSystemWatcherEngine()
-{
-#ifndef QT_NO_THREAD
- moveToThread(this);
-#endif
-}
-
-void QPollingFileSystemWatcherEngine::run()
-{
- QTimer timer;
- connect(&timer, SIGNAL(timeout()), SLOT(timeout()));
- timer.start(PollingInterval);
- (void) exec();
-}
-
-QStringList QPollingFileSystemWatcherEngine::addPaths(const QStringList &paths,
- QStringList *files,
- QStringList *directories)
-{
- QMutexLocker locker(&mutex);
- QStringList p = paths;
- QMutableListIterator<QString> it(p);
- while (it.hasNext()) {
- QString path = it.next();
- QFileInfo fi(path);
- if (!fi.exists())
- continue;
- if (fi.isDir()) {
- if (!directories->contains(path))
- directories->append(path);
- if (!path.endsWith(QLatin1Char('/')))
- fi = QFileInfo(path + QLatin1Char('/'));
- this->directories.insert(path, fi);
- } else {
- if (!files->contains(path))
- files->append(path);
- this->files.insert(path, fi);
- }
- it.remove();
- }
- start();
- return p;
-}
-
-QStringList QPollingFileSystemWatcherEngine::removePaths(const QStringList &paths,
- QStringList *files,
- QStringList *directories)
-{
- QMutexLocker locker(&mutex);
- QStringList p = paths;
- QMutableListIterator<QString> it(p);
- while (it.hasNext()) {
- QString path = it.next();
- if (this->directories.remove(path)) {
- directories->removeAll(path);
- it.remove();
- } else if (this->files.remove(path)) {
- files->removeAll(path);
- it.remove();
- }
- }
- if (this->files.isEmpty() && this->directories.isEmpty()) {
- locker.unlock();
- stop();
- wait();
- }
- return p;
-}
-
-void QPollingFileSystemWatcherEngine::stop()
-{
- quit();
-}
-
-void QPollingFileSystemWatcherEngine::timeout()
-{
- QMutexLocker locker(&mutex);
- QMutableHashIterator<QString, FileInfo> fit(files);
- while (fit.hasNext()) {
- QHash<QString, FileInfo>::iterator x = fit.next();
- QString path = x.key();
- QFileInfo fi(path);
- if (!fi.exists()) {
- fit.remove();
- emit fileChanged(path, true);
- } else if (x.value() != fi) {
- x.value() = fi;
- emit fileChanged(path, false);
- }
- }
- QMutableHashIterator<QString, FileInfo> dit(directories);
- while (dit.hasNext()) {
- QHash<QString, FileInfo>::iterator x = dit.next();
- QString path = x.key();
- QFileInfo fi(path);
- if (!path.endsWith(QLatin1Char('/')))
- fi = QFileInfo(path + QLatin1Char('/'));
- if (!fi.exists()) {
- dit.remove();
- emit directoryChanged(path, true);
- } else if (x.value() != fi) {
- fi.refresh();
- if (!fi.exists()) {
- dit.remove();
- emit directoryChanged(path, true);
- } else {
- x.value() = fi;
- emit directoryChanged(path, false);
- }
- }
-
- }
-}
-
-
-
-
QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine()
{
#if defined(Q_OS_WIN)
@@ -632,7 +458,5 @@ QT_END_NAMESPACE
#include "moc_qfilesystemwatcher.cpp"
-#include "qfilesystemwatcher.moc"
-
#endif // QT_NO_FILESYSTEMWATCHER