On Thu, Jul 26, 2012 at 9:55 AM, logic.cpp <logic....@gmail.com> wrote:
> So how about something like this (others have suggested something along these 
> lines):
>
> In order to work recursively,

Recursive isn't the same problem. Recursive is easy. The only problem
with doing recursive before was that 256 fd limit on Mac... which I
think we should get around by using FSEvents.


The rest of your  post was kind of confusing, but I came up with a
design where everyone wins. It's just a high level public API design,
but you should be able to easily figure out the internals from it (let
me know if you can't).

It's:
1) Cross platform without requiring the user to write custom code
2) Customizable/optimizable for the apps that need/want it
3) Efficient on platforms that support fine grained notifications,
inefficient (unless you do (2) above) on platforms without


Here you go, I used overly verbose wording to make it as clear as
possible. Also, I'm not sure how interfaces are supposed to be named
within Qt so I just guessed. And note the pure virtual public slot in
the interface... it should help explain.



class QFileSystemWatcher : public QObject
{
        Q_OBJECT
public:
        QFileSystemWatcher(QObject *parent = 0);
        
QFileSystemWatcher(IQFileSystemWatcherSpecialCoarseToFineGrainedNotificationsFigureOuter
*userCustomSnapshotComparisonCode, QObject *parent = 0);

        void addPath(const QString &path, bool recursive = false);
        void addPaths(const QStringList &paths, bool recursive = false);
        QStringList directories() const;
        QStringList files() const;
        void removePath(const QString &path, bool recursivelyRemove = false);
        void removePaths(const QStringList &paths, bool recursivelyRemove = 
false);
signals:
        void directoryChanged(const QString &dir);
        void fileChanged(const QString &file);
};

class IQFileSystemWatcherSpecialCoarseToFineGrainedNotificationsFigureOuter
: public QObject
{
        Q_OBJECT
public slots:
        virtual void dirChangedSoFigureOutFileChangesAndEmitThem(const QString 
&dir)=0;
signals:
        void manuallyDetectedFileChanged(const QString &file);
};

class 
QFileSystemWatcherDefaultSpecialCoarseToFineGrainedNotificationsFigureOuter
: public IQFileSystemWatcherSpecialCoarseToFineGrainedNotificationsFigureOuter
{
        Q_OBJECT
public slots:
        void dirChangedSoFigureOutFileChangesAndEmitThem(const QString &dir)
        {
                //here is the default implementation using the most common 
method
(snapshot comparison of file properties) for detecting fine grained
notifications

                //after we detect a file in the dir has changed, we simply do:
                emit manuallyDetectedFileChanged(filename);
        }
};


using it:
//if you want cross-platform support and don't care that some
platforms will be very slow
QFileSystemWatcher *fsw = new QFileSystemWatcher();

//if you have a special app and want to do some optimized detection
(but this is only applicable to platforms that don't already provide
fine-grained. in those cases the interface is simply ignored)
IQFileSystemWatcherSpecialCoarseToFineGrainedNotificationsFigureOuter
*myOptimizedDetector = new MyOptimizedDetector();
QFileSystemWatcher *fsw = new QFileSystemWatcher(myOptimizedDetector);


d3fault
_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to