From: APTX Date: Tue, 19 Jun 2012 20:58:33 +0000 (+0200) Subject: Add DirectoryWatcher X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=5a08e58f4b3adb2a7d8f543c3c1c0bbc3ee51385;p=localmylist.git Add DirectoryWatcher --- diff --git a/localmylist/addfiletask.h b/localmylist/addfiletask.h index 95e8eb7..0af9ce4 100644 --- a/localmylist/addfiletask.h +++ b/localmylist/addfiletask.h @@ -39,11 +39,6 @@ public slots: private slots: void hashingFinished(); - - // File data is handled via requests - // not just any task -// void fileDataRecieved(bool success); - private: QFileInfo m_file; diff --git a/localmylist/database.cpp b/localmylist/database.cpp index 277af1d..c6daa68 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -685,7 +685,7 @@ UnknownFile Database::getUnknownFile(const QByteArray &ed2k, qint64 size) return f; } -UnknownFile Database::getUnknownFilebyPath(const QString &path) +UnknownFile Database::getUnknownFileByPath(const QString &path) { d->getUnknownFileByPathQuery.bindValue(":path", path); @@ -859,6 +859,24 @@ bool Database::clearPendingMyListUpdate(const PendingMyListUpdate &request) return exec(d->clearPendingMyListUpdateQuery); } +QStringList Database::getWatchedDirectories(int hostId) +{ + QSqlQuery q(d->db); + q.prepare("SELECT directory FROM watched_directory WHERE host_id = :hostId"); + q.bindValue(":hostId", hostId); + + if (!exec(q)) + return QStringList(); + + QStringList ret; + + while (q.next()) + { + ret << q.value(0).toString(); + } + return ret; +} + bool Database::clearStartedPendingRequests() { return exec( @@ -1100,6 +1118,8 @@ void Database::prepareQueries() d->getUnknownFileQuery = QSqlQuery(d->db); d->getUnknownFileQuery.prepare("SELECT ed2k, size, host_id, path FROM unknown_file WHERE ed2k = :ed2k AND size = :size"); + + d->getUnknownFileByPathQuery = QSqlQuery(d->db); d->getUnknownFileByPathQuery.prepare("SELECT ed2k, size, host_id, path FROM unknown_file WHERE path = :path"); d->removeUnknownFileQuery = QSqlQuery(d->db); diff --git a/localmylist/database.h b/localmylist/database.h index c791b8f..f86c4f2 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -246,7 +246,7 @@ public: bool addUnknownFile(const UnknownFile &file); UnknownFile getUnknownFile(const QByteArray &ed2k, qint64 size); - UnknownFile getUnknownFilebyPath(const QString &path); + UnknownFile getUnknownFileByPath(const QString &path); bool removeUnknownFile(const QByteArray &ed2k, qint64 size); bool addRequest(const PendingRequest &request); @@ -258,6 +258,8 @@ public: QList getPendingMyListUpdateBatch(int limit = 10); bool clearPendingMyListUpdate(const PendingMyListUpdate &request); + QStringList getWatchedDirectories(int hostId); + bool clearStartedPendingRequests(); bool clearStartedMyListUpdateRequests(); bool clearFileRenames(); diff --git a/localmylist/directoryscantask.cpp b/localmylist/directoryscantask.cpp index 6f59515..db05bed 100644 --- a/localmylist/directoryscantask.cpp +++ b/localmylist/directoryscantask.cpp @@ -93,7 +93,7 @@ void DirectoryScanTask::workUnit() if (f.fid) continue; - UnknownFile uf = db->getUnknownFilebyPath(entry.canonicalFilePath()); + UnknownFile uf = db->getUnknownFileByPath(entry.canonicalFilePath()); if (!uf.ed2k.isEmpty() && uf.size) continue; } diff --git a/localmylist/directorywatcher.cpp b/localmylist/directorywatcher.cpp new file mode 100644 index 0000000..3216cd8 --- /dev/null +++ b/localmylist/directorywatcher.cpp @@ -0,0 +1,90 @@ +#include "directorywatcher.h" + +#include "mylist.h" +#include "database.h" +#include "settings.h" + +#include +#include +#include +#include + +#include + +namespace LocalMyList { + +DirectoryWatcher::DirectoryWatcher(Database *db, Settings *settings, QObject *parent) : + QObject(parent) +{ + this->db = db; + this->settings = settings; + + watcher = new QFileSystemWatcher(); + connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watchedDirectoryChanged(QString)), Qt::QueuedConnection); + + setWatchedDirectories(); +} + +DirectoryWatcher::~DirectoryWatcher() +{ + delete watcher; +} + +void DirectoryWatcher::setWatchedDirectories() +{ + QStringList currentEntries = watcher->directories(); + if (!currentEntries.isEmpty()) + watcher->removePaths(currentEntries); + + currentEntries = watcher->files(); + if (!currentEntries.isEmpty()) + watcher->removePaths(currentEntries); + + QStringList watchedDirectories = db->getWatchedDirectories(MyList::instance()->hostId()); + watcher->addPaths(watchedDirectories); + + qDebug() << "Watching" << watchedDirectories; +} + +void DirectoryWatcher::watchedDirectoryChanged(const QString &path) +{ + qDebug() << path << "changed!"; + + QDir dir(path); + + QStringList currentEntries = dir.entryList(QDir::Files); + QSet currentSet = currentEntries.toSet(); + QSet oldEntries = previousEntries.value(path); + QSet newEntries = currentSet - oldEntries; + + qDebug() << newEntries; + + foreach (const QString &entry, newEntries) + { + QFileInfo fileInfo(path + "/" + entry); + + if (!fileInfo.exists()) + continue; + + if (!fileInfo.isFile()) + continue; + + qDebug() << "Potential file to add" << fileInfo.canonicalFilePath(); + + UnknownFile uf = db->getUnknownFileByPath(fileInfo.canonicalFilePath()); + if (!uf.ed2k.isEmpty() && uf.size) + continue; + + File f = db->getFileByPath(fileInfo.canonicalFilePath()); + if (f.fid) + continue; + + qDebug() << "New file to add" << fileInfo.canonicalFilePath(); + QMetaObject::invokeMethod(MyList::instance(), "addFile", Qt::QueuedConnection, Q_ARG(QFileInfo, fileInfo)); + + } + + previousEntries.insert(path, currentSet); +} + +} // namespace LocalMyList diff --git a/localmylist/directorywatcher.h b/localmylist/directorywatcher.h new file mode 100644 index 0000000..0f96bec --- /dev/null +++ b/localmylist/directorywatcher.h @@ -0,0 +1,40 @@ +#ifndef DIRECTORYWATCHER_H +#define DIRECTORYWATCHER_H + +#include "localmylist_global.h" +#include +#include +#include + +class QFileSystemWatcher; + +namespace LocalMyList { + +class Database; +class Settings; + +class LOCALMYLISTSHARED_EXPORT DirectoryWatcher : public QObject +{ + Q_OBJECT +public: + explicit DirectoryWatcher(Database *db, Settings *settings, QObject *parent = 0); + ~DirectoryWatcher(); + +signals: + +public slots: + void setWatchedDirectories(); + + void watchedDirectoryChanged(const QString &path); + +private: + Database *db; + Settings *settings; + + QFileSystemWatcher *watcher; + QMap > previousEntries; +}; + +} // namespace LocalMyList + +#endif // DIRECTORYWATCHER_H diff --git a/localmylist/localmylist.pro b/localmylist/localmylist.pro index 998b4c4..c41ab2e 100644 --- a/localmylist/localmylist.pro +++ b/localmylist/localmylist.pro @@ -24,7 +24,8 @@ SOURCES += \ settings.cpp \ renamehandler.cpp \ unknownfilelookuptask.cpp \ - renameutils.cpp + renameutils.cpp \ + directorywatcher.cpp HEADERS += \ localmylist_global.h \ @@ -42,7 +43,8 @@ HEADERS += \ settings.h \ renamehandler.h \ unknownfilelookuptask.h \ - renameutils.h + renameutils.h \ + directorywatcher.h CONV_HEADERS += \ include/LocalMyList/AbstractTask \ diff --git a/localmylist/mylist.cpp b/localmylist/mylist.cpp index 9cf532e..1c0c871 100644 --- a/localmylist/mylist.cpp +++ b/localmylist/mylist.cpp @@ -12,6 +12,7 @@ #include "workthread.h" #include "requesthandler.h" #include "renamehandler.h" +#include "directorywatcher.h" #include namespace LocalMyList { @@ -22,6 +23,7 @@ MyList::MyList() m_requestHandler = 0; m_renameHandler = 0; + m_directoryWatcher = 0; workThread = 0; db = new Database("main"); @@ -105,7 +107,7 @@ void MyList::setupUdpClient() void MyList::setupRequestHandler() { - if (m_requestHandler) + if (m_requestHandler || !db->isConnected()) return; m_requestHandler = new RequestHandler(db, this); @@ -124,6 +126,14 @@ void MyList::setupRenameHandler() m_renameHandler->moveToThread(workThread); } +void MyList::setupDirectoryWatcher() +{ + if (m_directoryWatcher || !db->isConnected()) + return; + + m_directoryWatcher = new DirectoryWatcher(db, m_settings); +} + void MyList::setupWorkThread() { if (workThread) @@ -143,6 +153,8 @@ void MyList::setupHostInfo() qWarning("Unknown host!"); } qDebug() << "host id" << hostId(); + + setupDirectoryWatcher(); } void MyList::loadLocalSettings(QSettings &s) diff --git a/localmylist/mylist.h b/localmylist/mylist.h index 6f687df..58a813f 100644 --- a/localmylist/mylist.h +++ b/localmylist/mylist.h @@ -18,6 +18,7 @@ class AbstractTask; class WorkThread; class RequestHandler; class RenameHandler; +class DirectoryWatcher; class LOCALMYLISTSHARED_EXPORT MyList : public QObject { Q_OBJECT @@ -51,6 +52,7 @@ public slots: void setupUdpClient(); void setupRequestHandler(); void setupRenameHandler(); + void setupDirectoryWatcher(); void setupWorkThread(); void setupHostInfo(); @@ -72,6 +74,7 @@ private: WorkThread *workThread; RequestHandler *m_requestHandler; RenameHandler *m_renameHandler; + DirectoryWatcher *m_directoryWatcher; Settings *m_settings; HostInfo hostInfo; diff --git a/localmylist/share/schema/schema.sql b/localmylist/share/schema/schema.sql index 9ebf364..e325946 100644 --- a/localmylist/share/schema/schema.sql +++ b/localmylist/share/schema/schema.sql @@ -179,6 +179,13 @@ CREATE TABLE host ( CONSTRAINT host_unique_name UNIQUE (name) ); +CREATE TABLE watched_directory +( + host_id integer NOT NULL, + directory text NOT NULL, + CONSTRAINT watched_directory_pk PRIMARY KEY (host_id, directory) +); + CREATE TABLE log ( log_id serial NOT NULL, type integer, diff --git a/management-gui/mainwindow.cpp b/management-gui/mainwindow.cpp index a82b101..83ea3f8 100644 --- a/management-gui/mainwindow.cpp +++ b/management-gui/mainwindow.cpp @@ -286,3 +286,8 @@ void MainWindow::on_actionRenameScript_triggered() { openRenameScriptEditor(0); } + +void MainWindow::on_actionStartDirectoryWatcher_triggered() +{ + MyList::instance()->setupDirectoryWatcher(); +} diff --git a/management-gui/mainwindow.h b/management-gui/mainwindow.h index 602a827..b83b375 100644 --- a/management-gui/mainwindow.h +++ b/management-gui/mainwindow.h @@ -57,6 +57,7 @@ private slots: void on_actionRemoveKnownUnknownFiles_triggered(); void on_refreshButton_clicked(); void on_actionRenameScript_triggered(); + void on_actionStartDirectoryWatcher_triggered(); private: Ui::MainWindow *ui; diff --git a/management-gui/mainwindow.ui b/management-gui/mainwindow.ui index ee3e123..ed4d657 100644 --- a/management-gui/mainwindow.ui +++ b/management-gui/mainwindow.ui @@ -60,6 +60,7 @@ + @@ -217,6 +218,11 @@ Rename Script... + + + Start Directory Watcher + +