diff options
Diffstat (limited to 'konq-plugins/fsview/scan.h')
-rw-r--r-- | konq-plugins/fsview/scan.h | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/konq-plugins/fsview/scan.h b/konq-plugins/fsview/scan.h new file mode 100644 index 0000000..38b015c --- /dev/null +++ b/konq-plugins/fsview/scan.h @@ -0,0 +1,230 @@ +/* This file is part of FSView. + Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de> + + KCachegrind 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, version 2. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +/* + * Classes for breadth-first search in local filesystem + */ + +#ifndef FSDIR_H +#define FSDIR_H + +#include <qptrlist.h> +#include <qvaluevector.h> +#include <qfile.h> + +/* Use KDE_lstat and KIO::fileoffset_t for 64-bit sizes */ +#include <klargefile.h> +#include <kio/global.h> + +class ScanDir; +class ScanFile; + +class ScanItem +{ + public: + ScanItem(const QString& p, ScanDir* d) + { absPath = p; dir = d; } + + QString absPath; + ScanDir* dir; +}; + +typedef QPtrList<ScanItem> ScanItemList; + + +/** + * Listener for events from directory scanning. + * + * You can register a listener for the ScanManager to get + * all scan events and a listener for every ScanDir for + * directory specific scan events. + * + * sizeChanged is called when a scan of a subdirectory + * finished. + */ +class ScanListener +{ + public: + virtual void scanStarted(ScanDir*) {} + virtual void sizeChanged(ScanDir*) {} + virtual void scanFinished(ScanDir*) {} + // destroyed events are not delivered to listeners of ScanManager + virtual void destroyed(ScanDir*) {} + virtual void destroyed(ScanFile*) {} +}; + + + +/** + * ScanManager + * + * Start/Stop/Restart Scans. Example: + * + * ScanManager m("/opt"); + * m.startScan(); + * while(m.scan()); + */ +class ScanManager +{ + public: + ScanManager(); + ScanManager(const QString& path); + ~ScanManager(); + + /** Set the top path for scanning + * The ScanDir object created gets attribute data. + */ + ScanDir* setTop(const QString& path, int data = 0); + ScanDir* top() { return _topDir; } + + bool scanRunning(); + unsigned int scanLength() { return _list.count(); } + + /** + * Starts the scan. Stop previous scan if running. + * For the actual scan to happen, you have to call + * scan() peridically. + * + * If from !=0, restart scan at given position; from must + * be from the previous scan of this manager. + */ + void startScan(ScanDir* from = 0); + + /** Stop a current running scan. + * Make all directories to finish their scan. + */ + void stopScan(); + + /** + * Scan first directory from todo list. + * Directories added to the todo list are attributed with data. + * Returns the number of new subdirectories created for scanning. + */ + int scan(int data); + + /* set listener to get a callbacks from this ScanDir */ + void setListener(ScanListener*); + ScanListener* listener() { return _listener; } + + private: + ScanItemList _list; + ScanDir* _topDir; + ScanListener* _listener; +}; + +class ScanFile +{ + public: + ScanFile(); + ScanFile(const QString& n, KIO::fileoffset_t s); + ~ScanFile(); + + const QString& name() { return _name; } + KIO::fileoffset_t size() { return _size; } + + /* set listener to get callbacks from this ScanDir */ + void setListener(ScanListener* l) { _listener = l; } + ScanListener* listener() { return _listener; } + + private: + QString _name; + KIO::fileoffset_t _size; + ScanListener* _listener; +}; + +typedef QValueVector<ScanFile> ScanFileVector; +typedef QValueVector<ScanDir> ScanDirVector; + +/** + * A directory to scan. + * You can attribute a directory to scan with a + * integer data attribute. + */ +class ScanDir +{ + public: + ScanDir(); + ScanDir(const QString& n, ScanManager* m, + ScanDir* p = 0, int data = 0); + ~ScanDir(); + + /* Get items of this directory + * and append subdirectories to todo list. + * + * Directories added to the todo list are attributed with data. + * Returns the number of new subdirectories created for scanning. + */ + int scan(ScanItem* si, ScanItemList& list, int data); + + /* clear scan objects below */ + void clear(); + + /* + * Setup for child rescan + */ + void setupChildRescan(); + + /* Absolute path. Warning: Slow, loops to top parent. */ + QString path(); + + /* get integer data attribute */ + int data() { return _data; } + void setData(int d) { _data = d; } + + ScanFileVector& files() { return _files; } + ScanDirVector& dirs() { return _dirs; } + const QString& name() { return _name; } + KIO::fileoffset_t size() { update(); return _size; } + unsigned int fileCount() { update(); return _fileCount; } + unsigned int dirCount() { update(); return _dirCount; } + ScanDir* parent() { return _parent; } + bool scanStarted() { return (_dirsFinished >= 0); } + bool scanFinished() { return (_dirsFinished == (int)_dirs.count()); } + bool scanRunning() { return scanStarted() && !scanFinished(); } + + /* set listener to get a callbacks from this ScanDir */ + void setListener(ScanListener*); + ScanListener* listener() { return _listener; } + ScanManager* manager() { return _manager; } + + /* force current scan to be finished */ + void finish(); + + private: + void update(); + + /* this propagates file count and size to upper dirs */ + void subScanFinished(); + void callScanStarted(); + void callSizeChanged(); + void callScanFinished(); + + ScanFileVector _files; + ScanDirVector _dirs; + + QString _name; + bool _dirty; /* needs a call to update() */ + KIO::fileoffset_t _size, _fileSize; + unsigned int _fileCount, _dirCount; + int _dirsFinished, _data; + ScanDir* _parent; + ScanListener* _listener; + ScanManager* _manager; +}; + +#endif |