summaryrefslogtreecommitdiffstats
path: root/smdirwatcher.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2014-12-07 22:40:10 +0100
committerArno <am@disconnect.de>2014-12-07 22:40:10 +0100
commit3adf6f859dd4d5df8e8fceacce74487814867e61 (patch)
tree5725a517b379ceeb30eda09fbe6a7405e5f6bbe8 /smdirwatcher.cpp
parent51bc87ebc73b5777ad36e35ec20445b07a0d7639 (diff)
downloadSheMov-3adf6f859dd4d5df8e8fceacce74487814867e61.tar.gz
SheMov-3adf6f859dd4d5df8e8fceacce74487814867e61.tar.bz2
SheMov-3adf6f859dd4d5df8e8fceacce74487814867e61.zip
Major revamp of the file Manager
Nothing is async any more. Didn't work, anyway. Instead show a QProgressDialog when gathering data. Was kinda surprising that processEvents has to be called explicitly... Well, done!
Diffstat (limited to 'smdirwatcher.cpp')
-rw-r--r--smdirwatcher.cpp177
1 files changed, 72 insertions, 105 deletions
diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp
index 59313bb..24deee1 100644
--- a/smdirwatcher.cpp
+++ b/smdirwatcher.cpp
@@ -8,6 +8,8 @@
#include <QDateTime>
#include <QDir>
#include <QImage>
+#include <QProgressDialog>
+#include <QApplication>
#include <sys/inotify.h>
#include <unistd.h>
@@ -17,55 +19,38 @@
#include "smdirwatcher.h"
#include "smtreeitem.h"
#include "helper.h"
+#include "smglobals.h"
SmDirWatcher::SmDirWatcher(int numFields, QObject *parent) : QThread(parent), mFd(0), mDescr(0), mNumFields(numFields), mExpensiveOps(true) {
mBufLen = 1024 * (sizeof(struct inotify_event) + 16);
mINdata = new char[mBufLen];
mFd = inotify_init();
- mAsyncPool = new QThreadPool(this);
}
void SmDirWatcher::setDir(const QString &dir){
if(mDescr){
inotify_rm_watch(mFd, mDescr); //generates IN_IGNORE ???
}
- foreach(AsyncTask *s, mAsyncTasks){
- s->skipMe();
- }
- mAsyncPool->waitForDone();
- foreach(AsyncTask *s, mAsyncTasks){
- s->deleteLater();
- }
- mAsyncTasks.clear();
mCurrent = dir;
QDir d(mCurrent);
+ QWidget *fsWidget = SmGlobals::instance()->registeredWidgets().value("FSWidget");
+ QProgressDialog *pDlg = new QProgressDialog(tr("Gathering data..."), QString(), 0, d.count(), fsWidget);
+ pDlg->setWindowModality(Qt::WindowModal);
+ Helper::centerWidget(pDlg);
+ pDlg->show();
SmTreeItem *rootItem = new SmTreeItem(mNumFields);
- foreach(QFileInfo fi, d.entryInfoList()){
+ for(uint i = 0; i < d.count(); ++i){
+ QFileInfo fi = d.entryInfoList().at(i);
+ pDlg->setValue(i);
+ qApp->processEvents();
if(fi.fileName() == "." || fi.fileName() == ".."){
continue;
}
QList<QVariant> data = generalData(fi.absoluteFilePath());
- QString mime = data.at(SmDirModel::Type).toString();
SmTreeItem *newItem = new SmTreeItem(data, rootItem);
rootItem->appendChild(newItem);
- if(mExpensiveOps){
- Md5Summer *s = new Md5Summer(fi.absoluteFilePath());
- s->setAutoDelete(false);
- connect(s, SIGNAL(md5sumDone(QString,QString)), this, SIGNAL(setMd5Sum(QString,QString)));
- mAsyncTasks.append(s);
- if(mime.startsWith("video")){
- FfmpegGatherer *g = new FfmpegGatherer(fi.absoluteFilePath());
- g->setAutoDelete(false);
- connect(g, SIGNAL(ffmpegDone(QString,QVariantMap)), this, SIGNAL(setFfmpeg(QString,QVariantMap)));
- mAsyncTasks.append(g);
- }else if(mime.startsWith("image")){
- PicSizeGatherer *pg = new PicSizeGatherer(fi.absoluteFilePath());
- pg->setAutoDelete(false);
- connect(pg, SIGNAL(picSizeDone(QString,QVariant)), this, SIGNAL(setPicSize(QString,QVariant)));
- mAsyncTasks.append(pg);
- }
- }
}
+ pDlg->deleteLater();
emit population(rootItem);
/* mask rationale:
* IN_DELETE_SELF cannot happen since we're only
@@ -75,31 +60,6 @@ void SmDirWatcher::setDir(const QString &dir){
mDescr = inotify_add_watch(mFd, qPrintable(dir), IN_CLOSE_WRITE | IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO);
}
-void SmDirWatcher::startAsyncJobs(){
- foreach(AsyncTask *s, mAsyncTasks){
- mAsyncPool->start(s);
- }
-}
-
-void SmDirWatcher::gatherAsync(const QString &path){
- if(!mExpensiveOps){
- return;
- }
- QString mimeType = Helper::mimeType(path);
- Md5Summer *s = new Md5Summer(path);
- connect(s, SIGNAL(md5sumDone(QString,QString)), this, SIGNAL(setMd5Sum(QString,QString)));
- mAsyncPool->start(s);
- if(mimeType.startsWith("video")){
- FfmpegGatherer *g = new FfmpegGatherer(path);
- connect(g, SIGNAL(ffmpegDone(QString,QVariantMap)), this, SIGNAL(setFfmpeg(QString,QVariantMap)));
- mAsyncPool->start(g);
- }else if(mimeType.startsWith("image")){
- PicSizeGatherer *ps = new PicSizeGatherer(path);
- connect(ps, SIGNAL(picSizeDone(QString,QVariant)), this, SIGNAL(setPicSize(QString,QVariant)));
- mAsyncPool->start(ps);
- }
-}
-
void SmDirWatcher::setExpensiveOps(bool expensiveOps){
mExpensiveOps = expensiveOps;
}
@@ -111,11 +71,64 @@ QList<QVariant> SmDirWatcher::generalData(const QString &path){
QString mime = Helper::mimeType(fi.absoluteFilePath());
data << mime;
data << fi.lastModified();
- data << QVariant() << QVariant() << QVariant();
- data << fi.absoluteFilePath() << 0;
+ QString md5;
+ if(mExpensiveOps){
+ md5 = Helper::md5Sum(path);
+ data << md5;
+ if(mime.startsWith("video")){
+ QVariantMap m = Helper::ffmpegData(fi.absoluteFilePath());
+ data << m.value("duration") << m.value("bit_rate");
+ }else if(mime.startsWith("image")){
+ QVariant picSize = Helper::picSize(fi.absoluteFilePath());
+ data << picSize << QVariant();
+ }else{
+ data << QVariant() << QVariant();
+ }
+ data << fi.absoluteFilePath();
+ int present = presenceData(md5);
+ data << present;
+ }else{
+ data << QVariant() << QVariant() << QVariant() << fi.absoluteFilePath() << SmDirModel::InNone;
+ }
return data;
}
+int SmDirWatcher::presenceData(QString &md5){
+ int retval = SmDirModel::InNone;
+ QSqlDatabase db = QSqlDatabase::database("treedb");
+ QSqlQuery present1Q(db);
+ present1Q.prepare("SELECT COUNT(*) FROM files WHERE cmd5sum = :md5");
+ present1Q.bindValue(":md5", md5);
+ present1Q.exec();
+ while(present1Q.next()){
+ int c = present1Q.value(0).toInt();
+ if(c > 0){
+ retval = SmDirModel::InFiles;
+ }
+ }
+ QSqlQuery present2Q(db);
+ present2Q.prepare("SELECT COUNT(*) from files_origin WHERE cmd5sum = :md5");
+ present2Q.bindValue(":md5", md5);
+ while(present2Q.next()){
+ int c = present2Q.value(0).toInt();
+ if(c > 0){
+ retval = SmDirModel::InOrigin;
+ }
+ }
+ QSqlQuery present3Q(db);
+ present3Q.prepare("SELECT COUNT(*) FROM pics WHERE cmd5sum = :md5");
+ present3Q.bindValue(":md5", md5);
+ while(present3Q.next()){
+ int c = present3Q.value(0).toInt();
+ if(c > 0){
+ retval = SmDirModel::InPictures;
+ }
+ }
+ return retval;
+}
+
+#include <QDebug>
+
void SmDirWatcher::run(){
struct pollfd pfd[1];
pfd[0].fd = mFd;
@@ -140,12 +153,16 @@ void SmDirWatcher::run(){
QString name = QString("%1/%2").arg(mCurrent).arg(e->name);
QList<QVariant> d = generalData(name);
if(mask & IN_CREATE || mask & IN_MOVED_TO){
+ qDebug() << "Adding" << name;
emit newData(d, Added);
}else if(mask & IN_DELETE || mask & IN_MOVED_FROM){
+ qDebug() << "DEL|MOVE" << name;
emit newData(d, Deleted);
}else if(mask & IN_MODIFY){
+ qDebug() << "MOD" << name;
emit newData(d, Modified);
}else if(mask & IN_CLOSE_WRITE){
+ qDebug() << "CLOSEW" << name;
emit newData(d, CloseWrite);
}
i += sizeof(inotify_event) + e->len;
@@ -156,53 +173,3 @@ void SmDirWatcher::stop(){
quit();
wait();
}
-
-AsyncTask::AsyncTask(const QString &path) : mSkip(false), mPath(path) {}
-
-bool AsyncTask::skipMe(){
- if(mStatusMx.tryLock()){
- mSkip = true;
- mStatusMx.unlock();
- return true;
- }
- return false;
-}
-
-Md5Summer::Md5Summer(const QString &path) : AsyncTask(path) {}
-
-void Md5Summer::run(){
- mStatusMx.lock();
- bool skip = mSkip;
- mStatusMx.unlock();
- if(skip){
- return;
- }
- QString md5 = Helper::md5Sum(mPath);
- emit md5sumDone(mPath, md5);
-}
-
-FfmpegGatherer::FfmpegGatherer(const QString &path) : AsyncTask(path) {}
-
-void FfmpegGatherer::run(){
- mStatusMx.lock();
- bool skip = mSkip;
- mStatusMx.unlock();
- if(skip){
- return;
- }
- QVariantMap retval = Helper::ffmpegData(mPath);
- emit ffmpegDone(mPath, retval);
-}
-
-PicSizeGatherer::PicSizeGatherer(const QString &path) : AsyncTask(path) {}
-
-void PicSizeGatherer::run(){
- mStatusMx.lock();
- bool skip = mSkip;
- mStatusMx.unlock();
- if(skip){
- return;
- }
- QVariant retval = Helper::picSize(mPath);
- emit picSizeDone(mPath, retval);
-}