aboutsummaryrefslogtreecommitdiff
path: root/src/3rdParty/efsw/FileWatcherGeneric.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdParty/efsw/FileWatcherGeneric.cpp')
-rwxr-xr-xsrc/3rdParty/efsw/FileWatcherGeneric.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/3rdParty/efsw/FileWatcherGeneric.cpp b/src/3rdParty/efsw/FileWatcherGeneric.cpp
new file mode 100755
index 0000000..074cff1
--- /dev/null
+++ b/src/3rdParty/efsw/FileWatcherGeneric.cpp
@@ -0,0 +1,156 @@
1#include <efsw/FileSystem.hpp>
2#include <efsw/FileWatcherGeneric.hpp>
3#include <efsw/Lock.hpp>
4#include <efsw/System.hpp>
5
6namespace efsw {
7
8FileWatcherGeneric::FileWatcherGeneric( FileWatcher* parent ) :
9 FileWatcherImpl( parent ), mThread( NULL ), mLastWatchID( 0 ) {
10 mInitOK = true;
11 mIsGeneric = true;
12}
13
14FileWatcherGeneric::~FileWatcherGeneric() {
15 mInitOK = false;
16
17 efSAFE_DELETE( mThread );
18
19 /// Delete the watches
20 WatchList::iterator it = mWatches.begin();
21
22 for ( ; it != mWatches.end(); ++it ) {
23 efSAFE_DELETE( ( *it ) );
24 }
25}
26
27WatchID FileWatcherGeneric::addWatch( const std::string& directory, FileWatchListener* watcher,
28 bool recursive ) {
29 std::string dir( directory );
30
31 FileSystem::dirAddSlashAtEnd( dir );
32
33 FileInfo fi( dir );
34
35 if ( !fi.isDirectory() ) {
36 return Errors::Log::createLastError( Errors::FileNotFound, dir );
37 } else if ( !fi.isReadable() ) {
38 return Errors::Log::createLastError( Errors::FileNotReadable, dir );
39 } else if ( pathInWatches( dir ) ) {
40 return Errors::Log::createLastError( Errors::FileRepeated, dir );
41 }
42
43 std::string curPath;
44 std::string link( FileSystem::getLinkRealPath( dir, curPath ) );
45
46 if ( "" != link ) {
47 if ( pathInWatches( link ) ) {
48 return Errors::Log::createLastError( Errors::FileRepeated, dir );
49 } else if ( !linkAllowed( curPath, link ) ) {
50 return Errors::Log::createLastError( Errors::FileOutOfScope, dir );
51 } else {
52 dir = link;
53 }
54 }
55
56 mLastWatchID++;
57
58 WatcherGeneric* pWatch = new WatcherGeneric( mLastWatchID, dir, watcher, this, recursive );
59
60 Lock lock( mWatchesLock );
61 mWatches.push_back( pWatch );
62
63 return pWatch->ID;
64}
65
66void FileWatcherGeneric::removeWatch( const std::string& directory ) {
67 WatchList::iterator it = mWatches.begin();
68
69 for ( ; it != mWatches.end(); ++it ) {
70 if ( ( *it )->Directory == directory ) {
71 WatcherGeneric* watch = ( *it );
72
73 Lock lock( mWatchesLock );
74
75 mWatches.erase( it );
76
77 efSAFE_DELETE( watch );
78
79 return;
80 }
81 }
82}
83
84void FileWatcherGeneric::removeWatch( WatchID watchid ) {
85 WatchList::iterator it = mWatches.begin();
86
87 for ( ; it != mWatches.end(); ++it ) {
88 if ( ( *it )->ID == watchid ) {
89 WatcherGeneric* watch = ( *it );
90
91 Lock lock( mWatchesLock );
92
93 mWatches.erase( it );
94
95 efSAFE_DELETE( watch );
96
97 return;
98 }
99 }
100}
101
102void FileWatcherGeneric::watch() {
103 if ( NULL == mThread ) {
104 mThread = new Thread( &FileWatcherGeneric::run, this );
105 mThread->launch();
106 }
107}
108
109void FileWatcherGeneric::run() {
110 do {
111 {
112 Lock lock( mWatchesLock );
113
114 WatchList::iterator it = mWatches.begin();
115
116 for ( ; it != mWatches.end(); ++it ) {
117 ( *it )->watch();
118 }
119 }
120
121 if ( mInitOK )
122 System::sleep( 1000 );
123 } while ( mInitOK );
124}
125
126void FileWatcherGeneric::handleAction( Watcher*, const std::string&, unsigned long, std::string ) {
127 /// Not used
128}
129
130std::list<std::string> FileWatcherGeneric::directories() {
131 std::list<std::string> dirs;
132
133 Lock lock( mWatchesLock );
134
135 WatchList::iterator it = mWatches.begin();
136
137 for ( ; it != mWatches.end(); ++it ) {
138 dirs.push_back( ( *it )->Directory );
139 }
140
141 return dirs;
142}
143
144bool FileWatcherGeneric::pathInWatches( const std::string& path ) {
145 WatchList::iterator it = mWatches.begin();
146
147 for ( ; it != mWatches.end(); ++it ) {
148 if ( ( *it )->Directory == path || ( *it )->pathInWatches( path ) ) {
149 return true;
150 }
151 }
152
153 return false;
154}
155
156} // namespace efsw