kdelibs/kdecore/io/kdirwatch_p.h
Ivailo Monev 61333c4671 generic: namespaced Qt4/Katie build fixes
most of the changes were done trought Katie's namefsck script which
convertes forward class declarations to include directives, however
other fixes here and there were needed as well as some questionable
changes to Q_DECLARE_TYPEINFO() macro calls because they most likely
have to do the namespacing themselfs (QT_BEGIN/END_NAMESPACE, and
probably will be in Katie) meaning that some of the changes may be
temporary and reverted later.

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2017-08-04 09:24:39 +00:00

197 lines
5.1 KiB
C++

/* Private Header for class of KDirWatchPrivate
*
* this separate header file is needed for MOC processing
* because KDirWatchPrivate has signals and slots
*
* This file is part of the KDE libraries
* Copyright (C) 1998 Sven Radej <sven@lisa.exp.univie.ac.at>
* Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
* Copyright (C) 2007 Flavio Castelli <flavio.castelli@gmail.com>
* Copyright (C) 2008 Jarosław Staniek <staniek@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License version 2 as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef KDIRWATCH_P_H
#define KDIRWATCH_P_H
#include <io/config-kdirwatch.h>
#include "kdirwatch.h"
#include <QtCore/qset.h>
#include <QtCore/qmap.h>
#include <QtCore/qobject.h>
#include <QtCore/qtimer.h>
#include <QtCore/qsocketnotifier.h>
#ifdef HAVE_FAM
#include <limits.h>
#include <fam.h>
#endif
#include <sys/time.h>
#include <sys/param.h> // ino_t
#include <sys/stat.h> // ino_t
#include <ctime>
#define invalid_ctime ((time_t)-1)
#ifndef QT_NO_FILESYSTEMWATCHER
#include <QtCore/qfilesystemwatcher.h>
#endif
/* KDirWatchPrivate is a singleton and does the watching
* for every KDirWatch instance in the application.
*/
class KDirWatchPrivate : public QObject
{
Q_OBJECT
public:
enum entryStatus { Normal = 0, NonExistent };
enum entryMode { UnknownMode = 0, FAMMode, QFSWatchMode };
enum { NoChange=0, Changed=1, Created=2, Deleted=4 };
struct Client {
KDirWatch* instance;
int count;
// did the instance stop watching
bool watchingStopped;
// events blocked when stopped
int pending;
KDirWatch::WatchModes m_watchModes;
};
class Entry
{
public:
// the last observed modification time
time_t m_ctime;
// the last observed link count
int m_nlink;
// last observed inode
ino_t m_ino;
entryStatus m_status;
entryMode m_mode;
bool isDir;
// instances interested in events
QList<Client *> m_clients;
// nonexistent entries of this directory
QList<Entry *> m_entries;
QString path;
int msecLeft, freq;
QString parentDirectory() const;
void addClient(KDirWatch*, KDirWatch::WatchModes);
void removeClient(KDirWatch*);
int clientCount() const;
bool isValid() { return m_clients.count() || m_entries.count(); }
Entry* findSubEntry(const QString& path) const {
Q_FOREACH(Entry* sub_entry, m_entries) {
if (sub_entry->path == path)
return sub_entry;
}
return 0;
}
bool dirty;
void propagate_dirty();
QList<Client *> clientsForFileOrDir(const QString& tpath, bool* isDir) const;
#ifdef HAVE_FAM
FAMRequest fr;
#endif
};
typedef QMap<QString,Entry> EntryMap;
KDirWatchPrivate();
~KDirWatchPrivate();
void resetList (KDirWatch*,bool);
void useFreq(Entry* e, int newFreq);
void addEntry(KDirWatch* instance,const QString& _path, Entry* sub_entry,
bool isDir, KDirWatch::WatchModes watchModes = KDirWatch::WatchDirOnly);
bool removeEntry(KDirWatch*,const QString&, Entry* sub_entry);
void removeEntry(KDirWatch*,Entry* e, Entry* sub_entry);
bool stopEntryScan(KDirWatch*, Entry*);
bool restartEntryScan(KDirWatch*, Entry*, bool );
void stopScan(KDirWatch*);
void startScan(KDirWatch*, bool, bool);
void removeEntries(KDirWatch*);
void statistics();
void addWatch(Entry* entry);
void removeWatch(Entry* entry);
Entry* entry(const QString&);
int scanEntry(Entry* e);
void emitEvent(const Entry* e, int event, const QString &fileName = QString());
// Memory management - delete when last KDirWatch gets deleted
void ref() { m_ref++; }
bool deref() { return ( --m_ref == 0 ); }
static bool isNoisyFile( const char *filename );
public Q_SLOTS:
void slotRescan();
void famEventReceived(); // for FAM
void slotRemoveDelayed();
void fswEventReceived(const QString &path); // for QFileSystemWatcher
public:
QTimer timer;
EntryMap m_mapEntries;
KDirWatch::Method m_preferredMethod, m_nfsPreferredMethod;
int freq;
int statEntries;
int m_nfsPollInterval, m_PollInterval;
int m_ref;
// removeList is allowed to contain any entry at most once
QSet<Entry *> removeList;
bool delayRemove;
bool rescan_all;
QTimer rescan_timer;
#ifdef HAVE_FAM
QSocketNotifier *sn;
FAMConnection fc;
bool use_fam;
void checkFAMEvent(FAMEvent*);
bool useFAM(Entry*);
#endif
#ifndef QT_NO_FILESYSTEMWATCHER
QFileSystemWatcher *fsWatcher;
bool useQFSWatch(Entry* e);
#endif
bool _isStopped;
};
QDebug operator<<(QDebug debug, const KDirWatchPrivate::Entry &entry);
#endif // KDIRWATCH_P_H