From 3adf6f859dd4d5df8e8fceacce74487814867e61 Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 7 Dec 2014 22:40:10 +0100 Subject: 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! --- smdirwatcher.cpp | 177 ++++++++++++++++++++++--------------------------------- 1 file changed, 72 insertions(+), 105 deletions(-) (limited to 'smdirwatcher.cpp') diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp index 59313bb..24deee1 100644 --- a/smdirwatcher.cpp +++ b/smdirwatcher.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -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 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 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 + 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 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); -} -- cgit v1.2.3-70-g09d2