-rw-r--r-- | libopie2/opiecore/ofilenotify.cpp | 15 | ||||
-rw-r--r-- | libopie2/opiecore/ofilenotify.h | 10 |
2 files changed, 23 insertions, 2 deletions
diff --git a/libopie2/opiecore/ofilenotify.cpp b/libopie2/opiecore/ofilenotify.cpp index de4c63b..270570e 100644 --- a/libopie2/opiecore/ofilenotify.cpp +++ b/libopie2/opiecore/ofilenotify.cpp | |||
@@ -197,26 +197,39 @@ bool OFileNotification::activate() | |||
197 | bool OFileNotification::hasChanged() | 197 | bool OFileNotification::hasChanged() |
198 | { | 198 | { |
199 | bool c = false; | 199 | bool c = false; |
200 | 200 | ||
201 | struct stat newstat; | 201 | struct stat newstat; |
202 | ::memset( &newstat, 0, sizeof newstat ); | 202 | ::memset( &newstat, 0, sizeof newstat ); |
203 | ::stat( _path, &newstat ); | 203 | int result = ::stat( _path, &newstat ); // may fail if file has been renamed or deleted. that doesn't matter :) |
204 | 204 | ||
205 | qDebug( "result of newstat call is %d (%s=%d)", result, strerror( errno ), errno ); | ||
205 | qDebug( "stat.atime = %0lx, newstat.atime = %0lx", (long)_stat.st_atime, (long)newstat.st_atime ); | 206 | qDebug( "stat.atime = %0lx, newstat.atime = %0lx", (long)_stat.st_atime, (long)newstat.st_atime ); |
206 | qDebug( "stat.mtime = %0lx, newstat.mtime = %0lx", (long)_stat.st_mtime, (long)newstat.st_mtime ); | 207 | qDebug( "stat.mtime = %0lx, newstat.mtime = %0lx", (long)_stat.st_mtime, (long)newstat.st_mtime ); |
208 | qDebug( "stat.ctime = %0lx, newstat.ctime = %0lx", (long)_stat.st_ctime, (long)newstat.st_ctime ); | ||
209 | |||
210 | if ( !c && (_type & (Delete|Rename)) && (long)newstat.st_atime == 0 && (long)newstat.st_mtime == 0 && (long)newstat.st_ctime == 0) | ||
211 | { | ||
212 | qDebug( "OFileNotification::hasChanged(): file has been deleted or renamed" ); | ||
213 | c = true; | ||
214 | } | ||
207 | if ( !c && (_type & Access) && (long)_stat.st_atime < (long)newstat.st_atime ) | 215 | if ( !c && (_type & Access) && (long)_stat.st_atime < (long)newstat.st_atime ) |
208 | { | 216 | { |
209 | qDebug( "OFileNotification::hasChanged(): atime changed" ); | 217 | qDebug( "OFileNotification::hasChanged(): atime changed" ); |
210 | c = true; | 218 | c = true; |
211 | } | 219 | } |
212 | if ( !c && (_type & Modify) && (long)_stat.st_mtime < (long)newstat.st_mtime ) | 220 | if ( !c && (_type & Modify) && (long)_stat.st_mtime < (long)newstat.st_mtime ) |
213 | { | 221 | { |
214 | qDebug( "OFileNotification::hasChanged(): mtime changed" ); | 222 | qDebug( "OFileNotification::hasChanged(): mtime changed" ); |
215 | c = true; | 223 | c = true; |
216 | } | 224 | } |
225 | if ( !c && (_type & Attrib) && (long)_stat.st_ctime < (long)newstat.st_ctime ) | ||
226 | { | ||
227 | qDebug( "OFileNotification::hasChanged(): ctime changed" ); | ||
228 | c = true; | ||
229 | } | ||
217 | 230 | ||
218 | return c; | 231 | return c; |
219 | } | 232 | } |
220 | 233 | ||
221 | 234 | ||
222 | void OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) | 235 | void OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) |
diff --git a/libopie2/opiecore/ofilenotify.h b/libopie2/opiecore/ofilenotify.h index 5315896..13b5a6b 100644 --- a/libopie2/opiecore/ofilenotify.h +++ b/libopie2/opiecore/ofilenotify.h | |||
@@ -73,13 +73,13 @@ class OFileNotification : public QObject | |||
73 | 73 | ||
74 | signals: | 74 | signals: |
75 | void triggered(); | 75 | void triggered(); |
76 | 76 | ||
77 | protected: | 77 | protected: |
78 | bool activate(); | 78 | bool activate(); |
79 | bool hasChanged(); | 79 | virtual bool hasChanged(); |
80 | static bool registerSignalHandler(); | 80 | static bool registerSignalHandler(); |
81 | static void unregisterSignalHandler(); | 81 | static void unregisterSignalHandler(); |
82 | static void __signalHandler( int sig, siginfo_t *si, void *data ); | 82 | static void __signalHandler( int sig, siginfo_t *si, void *data ); |
83 | 83 | ||
84 | private: | 84 | private: |
85 | QString _path; | 85 | QString _path; |
@@ -87,11 +87,19 @@ class OFileNotification : public QObject | |||
87 | QSignal _signal; | 87 | QSignal _signal; |
88 | int _fd; | 88 | int _fd; |
89 | bool _active; | 89 | bool _active; |
90 | struct stat _stat; | 90 | struct stat _stat; |
91 | }; | 91 | }; |
92 | 92 | ||
93 | |||
94 | class ODirectoryNotification : public OFileNotification | ||
95 | { | ||
96 | public: | ||
97 | virtual bool hasChanged() { return true; }; | ||
98 | }; | ||
99 | |||
100 | |||
93 | } | 101 | } |
94 | } | 102 | } |
95 | 103 | ||
96 | #endif | 104 | #endif |
97 | 105 | ||