]> git.lyx.org Git - lyx.git/blob - src/support/FileMonitor.h
Remove non-copyable idioms
[lyx.git] / src / support / FileMonitor.h
1 // -*- C++ -*-
2 /**
3  * \file FileMonitor.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Angus Leeming
8  *
9  * Full author contact details are available in file CREDITS.
10  *
11  * FileMonitor monitors a file and informs a listener when that file has
12  * changed.
13  */
14
15 #ifndef FILEMONITOR_H
16 #define FILEMONITOR_H
17
18 #include <boost/signal.hpp>
19
20 namespace lyx {
21 namespace support {
22
23 class FileName;
24
25 class FileMonitor
26 {
27 public:
28         /** Once monitoring begins, the file will be monitored every
29          *  interval ms.
30          *
31          * FIXME: rewrite and simplify using an encapsulation of QFileSystemWatcher.
32          */
33         FileMonitor(FileName const & file_with_path, int interval);
34
35         /// Destructor
36         ~FileMonitor();
37
38         ///
39         void reset(FileName const & file_with_path) const;
40
41         ///
42         FileName const & filename() const;
43
44         /// Begin monitoring the file
45         void start() const;
46         ///
47         void stop() const;
48         ///
49         bool monitoring() const;
50
51         /** The checksum is recomputed whenever the file is modified.
52          *  If the file is not being monitored, then the checksum will be
53          *  recomputed each time this function is called.
54          */
55         unsigned long checksum() const;
56
57         /// Connect and you'll be informed when the file has changed.
58         typedef boost::signal<void()> FileChangedSig;
59         typedef FileChangedSig::slot_type slot_type;
60         ///
61         boost::signals::connection connect(slot_type const &) const;
62
63 private:
64         /// noncopyable
65         FileMonitor(FileMonitor const &);
66         void operator=(FileMonitor const &);
67
68         /// Use the Pimpl idiom to hide the internals.
69         class Impl;
70         /// The pointer never changes although *pimpl_'s contents may.
71         Impl * const pimpl_;
72 };
73
74 } // namespace support
75 } // namespace lyx
76
77 #endif // FILEMONITOR_H