private slots:
void hashingFinished();
-
- // File data is handled via requests
- // not just any task
-// void fileDataRecieved(bool success);
-
private:
QFileInfo m_file;
return f;
}
-UnknownFile Database::getUnknownFilebyPath(const QString &path)
+UnknownFile Database::getUnknownFileByPath(const QString &path)
{
d->getUnknownFileByPathQuery.bindValue(":path", path);
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(
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);
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);
QList<PendingMyListUpdate> getPendingMyListUpdateBatch(int limit = 10);
bool clearPendingMyListUpdate(const PendingMyListUpdate &request);
+ QStringList getWatchedDirectories(int hostId);
+
bool clearStartedPendingRequests();
bool clearStartedMyListUpdateRequests();
bool clearFileRenames();
if (f.fid)
continue;
- UnknownFile uf = db->getUnknownFilebyPath(entry.canonicalFilePath());
+ UnknownFile uf = db->getUnknownFileByPath(entry.canonicalFilePath());
if (!uf.ed2k.isEmpty() && uf.size)
continue;
}
--- /dev/null
+#include "directorywatcher.h"
+
+#include "mylist.h"
+#include "database.h"
+#include "settings.h"
+
+#include <QFileSystemWatcher>
+#include <QDir>
+#include <QFileInfo>
+#include <QMetaObject>
+
+#include <QDebug>
+
+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<QString> currentSet = currentEntries.toSet();
+ QSet<QString> oldEntries = previousEntries.value(path);
+ QSet<QString> 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
--- /dev/null
+#ifndef DIRECTORYWATCHER_H
+#define DIRECTORYWATCHER_H
+
+#include "localmylist_global.h"
+#include <QObject>
+#include <QMap>
+#include <QSet>
+
+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<QString, QSet<QString> > previousEntries;
+};
+
+} // namespace LocalMyList
+
+#endif // DIRECTORYWATCHER_H
settings.cpp \
renamehandler.cpp \
unknownfilelookuptask.cpp \
- renameutils.cpp
+ renameutils.cpp \
+ directorywatcher.cpp
HEADERS += \
localmylist_global.h \
settings.h \
renamehandler.h \
unknownfilelookuptask.h \
- renameutils.h
+ renameutils.h \
+ directorywatcher.h
CONV_HEADERS += \
include/LocalMyList/AbstractTask \
#include "workthread.h"
#include "requesthandler.h"
#include "renamehandler.h"
+#include "directorywatcher.h"
#include <AniDBUdpClient/Client>
namespace LocalMyList {
m_requestHandler = 0;
m_renameHandler = 0;
+ m_directoryWatcher = 0;
workThread = 0;
db = new Database("main");
void MyList::setupRequestHandler()
{
- if (m_requestHandler)
+ if (m_requestHandler || !db->isConnected())
return;
m_requestHandler = new RequestHandler(db, this);
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)
qWarning("Unknown host!");
}
qDebug() << "host id" << hostId();
+
+ setupDirectoryWatcher();
}
void MyList::loadLocalSettings(QSettings &s)
class WorkThread;
class RequestHandler;
class RenameHandler;
+class DirectoryWatcher;
class LOCALMYLISTSHARED_EXPORT MyList : public QObject {
Q_OBJECT
void setupUdpClient();
void setupRequestHandler();
void setupRenameHandler();
+ void setupDirectoryWatcher();
void setupWorkThread();
void setupHostInfo();
WorkThread *workThread;
RequestHandler *m_requestHandler;
RenameHandler *m_renameHandler;
+ DirectoryWatcher *m_directoryWatcher;
Settings *m_settings;
HostInfo hostInfo;
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,
{
openRenameScriptEditor(0);
}
+
+void MainWindow::on_actionStartDirectoryWatcher_triggered()
+{
+ MyList::instance()->setupDirectoryWatcher();
+}
void on_actionRemoveKnownUnknownFiles_triggered();
void on_refreshButton_clicked();
void on_actionRenameScript_triggered();
+ void on_actionStartDirectoryWatcher_triggered();
private:
Ui::MainWindow *ui;
<addaction name="actionConnect"/>
<addaction name="actionDisconnect"/>
<addaction name="separator"/>
+ <addaction name="actionStartDirectoryWatcher"/>
<addaction name="actionStartRenameHandler"/>
<addaction name="actionStartUDPCLient"/>
<addaction name="separator"/>
<string>Rename Script...</string>
</property>
</action>
+ <action name="actionStartDirectoryWatcher">
+ <property name="text">
+ <string>Start Directory Watcher</string>
+ </property>
+ </action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>