summaryrefslogtreecommitdiffstats
path: root/src/app/VFS/krdirwatch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/VFS/krdirwatch.cpp')
-rw-r--r--src/app/VFS/krdirwatch.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/app/VFS/krdirwatch.cpp b/src/app/VFS/krdirwatch.cpp
new file mode 100644
index 0000000..fe4e2de
--- /dev/null
+++ b/src/app/VFS/krdirwatch.cpp
@@ -0,0 +1,124 @@
+/***************************************************************************
+ krdirwatch.cpp
+ -------------------
+ copyright : (C) 2000 by Shie Erlich & Rafi Yanai
+ e-mail : krusader@users.sourceforge.net
+ web site : http://krusader.sourceforge.net
+ ---------------------------------------------------------------------------
+ Description
+ ***************************************************************************
+
+ A
+
+ db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b.
+ 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D
+ 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY'
+ 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b
+ 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88.
+ YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD
+
+ S o u rc e F i l e
+
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#include "krdirwatch.h"
+#include <unistd.h>
+#include <sys/types.h>
+#include <kdebug.h>
+#include "krpermhandler.h"
+#include "tqstringlist.h"
+#include <tqdir.h>
+
+KRdirWatch::KRdirWatch(int msec,bool dirOnly):
+ delay(msec),t(this), changed(false) {
+ if(dirOnly) dir.setFilter( TQDir::Dirs | TQDir::Hidden | TQDir::NoSymLinks );
+ watched.setAutoDelete(true);
+ connect(&t,TQ_SIGNAL(timeout()),this, TQ_SLOT(checkDirs()));
+ startScan();
+}
+
+KRdirWatch::~KRdirWatch(){
+ clearList();
+ stopScan();
+}
+
+void KRdirWatch::removeDir(TQString path){
+ t.stop();
+ for ( it = watched.first(); it != 0; )
+ if (it->path == path) watched.remove();
+ else it = watched.next();
+ if (!stopped) startScan();
+}
+
+void KRdirWatch::addDir(TQString path, bool checkPermissions){
+ t.stop();
+
+ krDirEntry* temp = new krDirEntry;
+ if (!dir.cd(path)){ // if it's not a dir or don't exist - don't add it
+ //kdDebug() << "KRDirWatch: can't watch " + path +", (don't exist)" << endl;
+ return;
+ }
+ if( checkPermissions ) {
+ // if we can't read it - don't bother
+ if (getgid() != 0 && !KRpermHandler::fileReadable(path) ){
+ //kdDebug() << "KRDirWatch: can't watch " + path +", (not readable)" << endl;
+ return;
+ }
+ if (!KRpermHandler::fileWriteable(path) ){ // read-only directorys can't be changed
+ //kdDebug() << "KRDirWatch: not watching " + path +", (read-only directory)" << endl;
+ return;
+ }
+ }
+ qfi.setFile(path);
+
+ temp->path = dir.path();
+ temp->count = dir.entryList(TQDir::All | TQDir::AccessMask).count();
+ temp->lastModified = qfi.lastModified();
+
+ watched.append(temp);
+ if (!stopped) startScan();
+}
+
+// here we do the actual checking
+void KRdirWatch::checkDirs(){
+ t.stop();
+
+ TQString path;
+ unsigned long count;
+ TQDateTime dt;
+
+ for ( it = watched.first(); it != 0; it = watched.next() ){
+ path = it->path;
+ qfi.setFile(path);
+ if (!dir.cd(path)){
+ clearList();
+ emit dirty();
+ return;
+ }
+ dt = qfi.lastModified();
+ count = dir.entryList(TQDir::All | TQDir::AccessMask).count();
+ // check for changes
+ if(it->lastModified!=dt || it->count!=count){
+ changed = true;
+ it->lastModified=dt;
+ it->count=count;
+ startScan();
+ return;
+ }
+ if(changed){
+ changed = false;
+ clearList();
+ emit dirty();
+ return;
+ }
+ }
+ if (!stopped) startScan();
+}
+
+#include "krdirwatch.moc"