-rw-r--r-- | libopie2/opiecore/ofilenotify.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/libopie2/opiecore/ofilenotify.cpp b/libopie2/opiecore/ofilenotify.cpp index 270570e..5f2a1cc 100644 --- a/libopie2/opiecore/ofilenotify.cpp +++ b/libopie2/opiecore/ofilenotify.cpp | |||
@@ -66,33 +66,33 @@ OFileNotification::~OFileNotification() | |||
66 | 66 | ||
67 | bool OFileNotification::isActive() const | 67 | bool OFileNotification::isActive() const |
68 | { | 68 | { |
69 | return _active; | 69 | return _active; |
70 | } | 70 | } |
71 | 71 | ||
72 | 72 | ||
73 | int OFileNotification::start( const QString& path, bool sshot, OFileNotificationType type ) | 73 | int OFileNotification::start( const QString& path, bool sshot, OFileNotificationType type ) |
74 | { | 74 | { |
75 | _path = QString::null; | 75 | _path = QString::null; |
76 | _fd = 0; | 76 | _fd = 0; |
77 | if ( _active ) stop(); | 77 | if ( _active ) stop(); |
78 | QString dirpath; | 78 | QString dirpath; |
79 | 79 | ||
80 | // check if path exists and whether it is a file or a directory, if it exists at all | 80 | // check if path exists and whether it is a file or a directory, if it exists at all |
81 | int result = ::stat( (const char*) path, &_stat ); | 81 | int result = ::stat( (const char*) path, &_stat ); |
82 | if ( result == -1 ) | 82 | if ( !(type & Create) && result == -1 ) |
83 | { | 83 | { |
84 | qWarning( "OFileNotification::start(): Can't stat '%s': %s.", (const char*) path, strerror( errno ) ); | 84 | qWarning( "OFileNotification::start(): Can't stat '%s': %s.", (const char*) path, strerror( errno ) ); |
85 | return -1; | 85 | return -1; |
86 | } | 86 | } |
87 | 87 | ||
88 | // if it is not a directory, we need to find out in which directory the file is | 88 | // if it is not a directory, we need to find out in which directory the file is |
89 | bool isDirectory = S_ISDIR( _stat.st_mode ); | 89 | bool isDirectory = S_ISDIR( _stat.st_mode ); |
90 | if ( !isDirectory ) | 90 | if ( !isDirectory ) |
91 | { | 91 | { |
92 | int slashpos; | 92 | int slashpos; |
93 | slashpos = path.findRev( '/' ); | 93 | slashpos = path.findRev( '/' ); |
94 | if ( slashpos > 0 ) | 94 | if ( slashpos > 0 ) |
95 | { | 95 | { |
96 | _path = path; | 96 | _path = path; |
97 | dirpath = path.left( slashpos ); | 97 | dirpath = path.left( slashpos ); |
98 | } | 98 | } |
@@ -189,37 +189,44 @@ bool OFileNotification::activate() | |||
189 | _signal.activate(); | 189 | _signal.activate(); |
190 | return true; | 190 | return true; |
191 | } | 191 | } |
192 | else | 192 | else |
193 | return false; | 193 | return false; |
194 | } | 194 | } |
195 | 195 | ||
196 | 196 | ||
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 | int result = ::stat( _path, &newstat ); // may fail if file has been renamed or deleted. that doesn't matter :) | 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( "result of newstat call is %d (%s=%d)", result, result == -1 ? strerror( errno ) : "success", errno ); |
206 | 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 ); |
207 | 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 ); | 208 | qDebug( "stat.ctime = %0lx, newstat.ctime = %0lx", (long)_stat.st_ctime, (long)newstat.st_ctime ); |
209 | 209 | ||
210 | if ( !c && (_type & Create) && | ||
211 | (long)_stat.st_atime == 0 && (long)_stat.st_mtime == 0 && (long)_stat.st_ctime == 0 && | ||
212 | (long)newstat.st_atime > 0 && (long)newstat.st_mtime > 0 && (long)newstat.st_ctime > 0) | ||
213 | { | ||
214 | qDebug( "OFileNotification::hasChanged(): file has been created" ); | ||
215 | c = true; | ||
216 | } | ||
210 | if ( !c && (_type & (Delete|Rename)) && (long)newstat.st_atime == 0 && (long)newstat.st_mtime == 0 && (long)newstat.st_ctime == 0) | 217 | if ( !c && (_type & (Delete|Rename)) && (long)newstat.st_atime == 0 && (long)newstat.st_mtime == 0 && (long)newstat.st_ctime == 0) |
211 | { | 218 | { |
212 | qDebug( "OFileNotification::hasChanged(): file has been deleted or renamed" ); | 219 | qDebug( "OFileNotification::hasChanged(): file has been deleted or renamed" ); |
213 | c = true; | 220 | c = true; |
214 | } | 221 | } |
215 | if ( !c && (_type & Access) && (long)_stat.st_atime < (long)newstat.st_atime ) | 222 | if ( !c && (_type & Access) && (long)_stat.st_atime < (long)newstat.st_atime ) |
216 | { | 223 | { |
217 | qDebug( "OFileNotification::hasChanged(): atime changed" ); | 224 | qDebug( "OFileNotification::hasChanged(): atime changed" ); |
218 | c = true; | 225 | c = true; |
219 | } | 226 | } |
220 | if ( !c && (_type & Modify) && (long)_stat.st_mtime < (long)newstat.st_mtime ) | 227 | if ( !c && (_type & Modify) && (long)_stat.st_mtime < (long)newstat.st_mtime ) |
221 | { | 228 | { |
222 | qDebug( "OFileNotification::hasChanged(): mtime changed" ); | 229 | qDebug( "OFileNotification::hasChanged(): mtime changed" ); |
223 | c = true; | 230 | c = true; |
224 | } | 231 | } |
225 | if ( !c && (_type & Attrib) && (long)_stat.st_ctime < (long)newstat.st_ctime ) | 232 | if ( !c && (_type & Attrib) && (long)_stat.st_ctime < (long)newstat.st_ctime ) |