kdirwatch_p.h
00001
00002
00003
00004
00005
00006
00007 #ifndef _KDIRWATCH_P_H
00008 #define _KDIRWATCH_P_H
00009
00010 #ifdef HAVE_FAM
00011 #include <fam.h>
00012 #endif
00013
00014 #include <ctime>
00015
00016 #define invalid_ctime ((time_t)-1)
00017
00018
00019
00020
00021 class KDirWatchPrivate : public QObject
00022 {
00023 Q_OBJECT
00024 public:
00025
00026 enum entryStatus { Normal = 0, NonExistent };
00027 enum entryMode { UnknownMode = 0, StatMode, DNotifyMode, FAMMode };
00028 enum { NoChange=0, Changed=1, Created=2, Deleted=4 };
00029
00030 struct Client {
00031 KDirWatch* instance;
00032 int count;
00033
00034 bool watchingStopped;
00035
00036 int pending;
00037 };
00038
00039 class Entry
00040 {
00041 public:
00042
00043 time_t m_ctime;
00044
00045 int m_nlink;
00046 entryStatus m_status;
00047 entryMode m_mode;
00048 bool isDir;
00049
00050 QPtrList<Client> m_clients;
00051
00052 QPtrList<Entry> m_entries;
00053 QString path;
00054
00055 int msecLeft, freq;
00056
00057 void addClient(KDirWatch*);
00058 void removeClient(KDirWatch*);
00059 int clients();
00060 bool isValid() { return m_clients.count() || m_entries.count(); }
00061
00062 #ifdef HAVE_FAM
00063 FAMRequest fr;
00064 #endif
00065
00066 #ifdef HAVE_DNOTIFY
00067 int dn_fd;
00068 bool dn_dirty;
00069 void propagate_dirty();
00070 #endif
00071 };
00072
00073 typedef QMap<QString,Entry> EntryMap;
00074
00075 KDirWatchPrivate();
00076 ~KDirWatchPrivate();
00077
00078 void resetList (KDirWatch*,bool);
00079 void useFreq(Entry* e, int newFreq);
00080 void addEntry(KDirWatch*,const QString&, Entry*, bool);
00081 void removeEntry(KDirWatch*,const QString&, Entry*);
00082 bool stopEntryScan(KDirWatch*, Entry*);
00083 bool restartEntryScan(KDirWatch*, Entry*, bool );
00084 void stopScan(KDirWatch*);
00085 void startScan(KDirWatch*, bool, bool);
00086
00087 void removeEntries(KDirWatch*);
00088 void statistics();
00089
00090 Entry* entry(const QString&);
00091 int scanEntry(Entry* e);
00092 void emitEvent(Entry* e, int event, const QString &fileName = QString::null);
00093
00094
00095 void ref() { m_ref++; }
00096 bool deref() { return ( --m_ref == 0 ); }
00097
00098 public slots:
00099 void slotRescan();
00100 void famEventReceived();
00101 void slotActivated();
00102 void slotRemoveDelayed();
00103
00104 public:
00105 QTimer *timer;
00106 EntryMap m_mapEntries;
00107
00108 int freq;
00109 int statEntries;
00110 int m_nfsPollInterval, m_PollInterval;
00111 int m_ref;
00112 bool useStat(Entry*);
00113
00114 bool delayRemove;
00115 QPtrList<Entry> removeList;
00116
00117 #ifdef HAVE_FAM
00118 QSocketNotifier *sn;
00119 FAMConnection fc;
00120 bool use_fam;
00121
00122 void checkFAMEvent(FAMEvent*);
00123 bool useFAM(Entry*);
00124 #endif
00125
00126 #ifdef HAVE_DNOTIFY
00127 bool supports_dnotify;
00128 bool rescan_all;
00129 int mPipe[2];
00130 QTimer mTimer;
00131 QSocketNotifier *mSn;
00132 QIntDict<Entry> fd_Entry;
00133
00134 static void dnotify_handler(int, siginfo_t *si, void *);
00135 static void dnotify_sigio_handler(int, siginfo_t *si, void *);
00136 bool useDNotify(Entry*);
00137 #endif
00138 };
00139
00140 #endif // KDIRWATCH_P_H
00141
This file is part of the documentation for kio Library Version 3.2.2.