summaryrefslogtreecommitdiffstats
path: root/smdirwatcher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'smdirwatcher.cpp')
-rw-r--r--smdirwatcher.cpp96
1 files changed, 77 insertions, 19 deletions
diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp
index 78dae2a..8650d3b 100644
--- a/smdirwatcher.cpp
+++ b/smdirwatcher.cpp
@@ -7,6 +7,8 @@
#include <QVarLengthArray>
#include <QMutexLocker>
+#include <QDateTime>
+#include <QDir>
#include <sys/inotify.h>
#include <stropts.h>
@@ -15,6 +17,8 @@
#include <errno.h>
#include "smdirwatcher.h"
+#include "smtreeitem.h"
+#include "helper.h"
extern int errno;
@@ -34,11 +38,11 @@ void SmDirWatcher::setDir(const QString &dir){
inotify_rm_watch(mFd, mDescr); //generates IN_IGNORE ???
}
/* mask rationale:
- * IN_DELETE_SELF, IN_MOVE_TO and IN_MOVE_FROM cannot happen,
- * since we're only watching one directory at all times
- * don't care about the other events
+ * IN_DELETE_SELF cannot happen since we're only
+ * watching one directory at all time.
+ * We don't care about the other events
*/
- mDescr = inotify_add_watch(mFd, qPrintable(dir), IN_CLOSE_WRITE | IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_FROM);
+ mDescr = inotify_add_watch(mFd, qPrintable(dir), IN_CLOSE_WRITE | IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO);
mCurrent = dir;
}
@@ -46,40 +50,94 @@ void SmDirWatcher::run(){
QMutexLocker lock(&mWatchMx);
QVarLengthArray<char, 4096> data(4096);
int r = read(mFd, data.data(), data.size());
- while(r < 0){
- int err = errno;
- // buffer too small
- if(err == EINVAL){
- data.resize(data.size() * 2);
- r = read(mFd, data.data(), data.size());
- continue;
- // dunno
- }else{
+ int err = errno;
+ if(r < 0){
+ if(err != EAGAIN){
return;
}
+ r = read(mFd, data.data(), data.size());
}
// inspect data
char *at = data.data();
+ inotify_event *e = reinterpret_cast<inotify_event*>(at);
+ if(!e->len){
+ return;
+ }
char *end = at + data.size();
while(at < end){
- inotify_event *e = reinterpret_cast<inotify_event*>(at);
if(e->mask & IN_IGNORED){
at += sizeof(inotify_event) + e->len;
continue;
}
+ quint32 mask = e->mask;
QString name = QString("%1/%2").arg(mCurrent).arg(e->name);
- if(e->mask & IN_CREATE){
+ at += sizeof(inotify_event) + e->len;
+ if(mask & IN_CREATE){
emit dwEvent(name, Added);
+ return;
}
- if(e->mask & IN_DELETE){
+ if(mask & IN_DELETE){
emit dwEvent(name, Deleted);
+ return;
}
- if(e->mask & IN_CLOSE_WRITE || e->mask & IN_MODIFY){
+ if(mask & IN_CLOSE_WRITE || e->mask & IN_MODIFY){
emit dwEvent(name, Modified);
+ return;
}
- if(e->mask & IN_MOVED_FROM){
+ if(mask & IN_MOVED_FROM || e->mask & IN_MOVED_TO){
emit needRefresh();
+ return;
}
- at += sizeof(inotify_event) + e->len;
}
}
+
+SmDataGatherer::SmDataGatherer(const int numFields, QObject *parent) : QThread(parent), mNumFields(numFields) {}
+
+void SmDataGatherer::setCurrent(const QString &current, int mode){
+ QMutexLocker lock(&mSetMx);
+ mCurrent = current;
+ mMode = mode;
+}
+
+void SmDataGatherer::run(){
+ QMutexLocker lock(&mRunMx);
+ QFileInfo fi(mCurrent);
+ if(fi.isDir()){
+ SmTreeItem *rv = populate();
+ emit population(rv);
+ return;
+ }
+ if(fi.isFile()){
+ QList<QVariant> fd = fileData(fi);
+ emit newData(fd, mMode);
+ }
+}
+
+SmTreeItem * SmDataGatherer::populate(){
+ SmTreeItem *retval = new SmTreeItem(mNumFields);
+ QDir d = QDir(mCurrent);
+ foreach(QFileInfo fi, d.entryInfoList()){
+ if(fi.fileName() == "."){
+ continue;
+ }
+ QList<QVariant> data = fileData(fi);
+ SmTreeItem *newItem = new SmTreeItem(data, retval);
+ retval->appendChild(newItem);
+ }
+ return retval;
+}
+
+const QList<QVariant> SmDataGatherer::fileData(const QFileInfo &fi) const{
+ QList<QVariant> data;
+ data << fi.fileName() << fi.size();
+ QString mime = Helper::mimeType(fi.absoluteFilePath());
+ data << mime;
+ data << fi.lastModified();
+ QList<QVariant> si = QList<QVariant>() << QVariant() << QVariant();
+ if(mime.startsWith("video")){
+ si = Helper::duration(fi.absoluteFilePath());
+ }
+ data << Helper::md5Sum(fi.absoluteFilePath());
+ data << si << fi.absoluteFilePath();
+ return data;
+}