summaryrefslogtreecommitdiffstats
path: root/tdecore/ksimpledirwatch_p.h
diff options
context:
space:
mode:
authorDarrell Anderson <[email protected]>2012-04-10 12:41:40 -0500
committerDarrell Anderson <[email protected]>2012-04-10 12:41:40 -0500
commit70341737e1b84be26cce82cd3b2ac461f4f79bf6 (patch)
tree6f26d703aaa84f88f60540828f13163729b5aaa8 /tdecore/ksimpledirwatch_p.h
parent364c969affe63fcc5ed2aadbea44b2c88f9f6a38 (diff)
parent92c24a24c59ff6787a4ea7bc14f1812491f3cef2 (diff)
downloadtdelibs-70341737e1b84be26cce82cd3b2ac461f4f79bf6.tar.gz
tdelibs-70341737e1b84be26cce82cd3b2ac461f4f79bf6.zip
Merge branch 'master' of http://scm.trinitydesktop.org/scm/git/tdelibs
Diffstat (limited to 'tdecore/ksimpledirwatch_p.h')
-rw-r--r--tdecore/ksimpledirwatch_p.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/tdecore/ksimpledirwatch_p.h b/tdecore/ksimpledirwatch_p.h
new file mode 100644
index 000000000..a0022f3ae
--- /dev/null
+++ b/tdecore/ksimpledirwatch_p.h
@@ -0,0 +1,161 @@
+/* Private Header for class of KSimpleDirWatchPrivate
+ *
+ * this separate header file is needed for TQMOC processing
+ * because KSimpleDirWatchPrivate has signals and slots
+ *
+ * KSimpleDirWatch is a basic copy of KDirWatch
+ * but with the KIO linking requirement removed
+ */
+
+#ifndef _KSIMPLEDIRWATCH_P_H
+#define _KSIMPLEDIRWATCH_P_H
+
+#ifdef HAVE_FAM
+#include <fam.h>
+#endif
+
+#include <ctime>
+
+#define invalid_ctime ((time_t)-1)
+
+/* KSimpleDirWatchPrivate is a singleton and does the watching
+ * for every KSimpleDirWatch instance in the application.
+ */
+class KSimpleDirWatchPrivate : public TQObject
+{
+ Q_OBJECT
+public:
+
+ enum entryStatus { Normal = 0, NonExistent };
+ enum entryMode { UnknownMode = 0, StatMode, DNotifyMode, INotifyMode, FAMMode };
+ enum { NoChange=0, Changed=1, Created=2, Deleted=4 };
+
+ struct Client {
+ KSimpleDirWatch* instance;
+ int count;
+ // did the instance stop watching
+ bool watchingStopped;
+ // events blocked when stopped
+ int pending;
+ };
+
+ class Entry
+ {
+ public:
+ // the last observed modification time
+ time_t m_ctime;
+ // the last observed link count
+ int m_nlink;
+ entryStatus m_status;
+ entryMode m_mode;
+ bool isDir;
+ // instances interested in events
+ TQPtrList<Client> m_clients;
+ // nonexistent entries of this directory
+ TQPtrList<Entry> m_entries;
+ TQString path;
+
+ int msecLeft, freq;
+
+ void addClient(KSimpleDirWatch*);
+ void removeClient(KSimpleDirWatch*);
+ int clients();
+ bool isValid() { return m_clients.count() || m_entries.count(); }
+
+ bool dirty;
+ void propagate_dirty();
+
+#ifdef HAVE_FAM
+ FAMRequest fr;
+#endif
+
+#ifdef HAVE_DNOTIFY
+ int dn_fd;
+#endif
+#ifdef HAVE_INOTIFY
+ int wd;
+#endif
+ };
+
+ typedef TQMap<TQString,Entry> EntryMap;
+
+ KSimpleDirWatchPrivate();
+ ~KSimpleDirWatchPrivate();
+
+ void resetList (KSimpleDirWatch*,bool);
+ void useFreq(Entry* e, int newFreq);
+ void addEntry(KSimpleDirWatch*,const TQString&, Entry*, bool);
+ void removeEntry(KSimpleDirWatch*,const TQString&, Entry*);
+ bool stopEntryScan(KSimpleDirWatch*, Entry*);
+ bool restartEntryScan(KSimpleDirWatch*, Entry*, bool );
+ void stopScan(KSimpleDirWatch*);
+ void startScan(KSimpleDirWatch*, bool, bool);
+
+ void removeEntries(KSimpleDirWatch*);
+ void statistics();
+
+ Entry* entry(const TQString&);
+ int scanEntry(Entry* e);
+ void emitEvent(Entry* e, int event, const TQString &fileName = TQString::null);
+
+ // Memory management - delete when last KSimpleDirWatch gets deleted
+ void ref() { m_ref++; }
+ bool deref() { return ( --m_ref == 0 ); }
+
+ static bool isNoisyFile( const char *filename );
+
+public slots:
+ void slotRescan();
+ void famEventReceived(); // for FAM
+ void slotActivated(); // for DNOTIFY
+ void slotRemoveDelayed();
+
+public:
+ TQTimer *timer;
+ EntryMap m_mapEntries;
+
+ int freq;
+ int statEntries;
+ int m_nfsPollInterval, m_PollInterval;
+ int m_ref;
+ bool useStat(Entry*);
+
+ bool delayRemove;
+ TQPtrList<Entry> removeList;
+
+ bool rescan_all;
+ TQTimer rescan_timer;
+
+#ifdef HAVE_FAM
+ TQSocketNotifier *sn;
+ FAMConnection fc;
+ bool use_fam;
+
+ void checkFAMEvent(FAMEvent*);
+ bool useFAM(Entry*);
+#endif
+
+#if defined(HAVE_DNOTIFY) || defined(HAVE_INOTIFY)
+ TQSocketNotifier *mSn;
+#endif
+
+#ifdef HAVE_DNOTIFY
+ bool supports_dnotify;
+ int mPipe[2];
+ TQIntDict<Entry> fd_Entry;
+
+ static void dnotify_handler(int, siginfo_t *si, void *);
+ static void dnotify_sigio_handler(int, siginfo_t *si, void *);
+ bool useDNotify(Entry*);
+#endif
+
+#ifdef HAVE_INOTIFY
+ bool supports_inotify;
+ int m_inotify_fd;
+
+ bool useINotify(Entry*);
+#endif
+};
+
+#endif // KSIMPLEDIRWATCH_P_H
+