-rw-r--r-- | libopie2/opiecore/linux/ofilenotify.cpp | 79 | ||||
-rw-r--r-- | libopie2/opiecore/linux/ofilenotify.h | 13 |
2 files changed, 66 insertions, 26 deletions
diff --git a/libopie2/opiecore/linux/ofilenotify.cpp b/libopie2/opiecore/linux/ofilenotify.cpp index 3096f7e..a7820ee 100644 --- a/libopie2/opiecore/linux/ofilenotify.cpp +++ b/libopie2/opiecore/linux/ofilenotify.cpp | |||
@@ -205,48 +205,54 @@ void OFileNotification::stop() | |||
205 | { | 205 | { |
206 | notification_list.remove( _wd ); | 206 | notification_list.remove( _wd ); |
207 | _path = QString::null; | 207 | _path = QString::null; |
208 | _wd = 0; | 208 | _wd = 0; |
209 | _active = false; | 209 | _active = false; |
210 | if ( notification_list.isEmpty() ) | 210 | if ( notification_list.isEmpty() ) |
211 | { | 211 | { |
212 | OFileNotification::unregisterEventHandler(); | 212 | OFileNotification::unregisterEventHandler(); |
213 | } | 213 | } |
214 | } | 214 | } |
215 | 215 | ||
216 | 216 | ||
217 | OFileNotificationType OFileNotification::type() const | 217 | OFileNotificationType OFileNotification::type() const |
218 | { | 218 | { |
219 | return _type; | 219 | return _type; |
220 | } | 220 | } |
221 | 221 | ||
222 | 222 | ||
223 | QString OFileNotification::path() const | 223 | QString OFileNotification::path() const |
224 | { | 224 | { |
225 | return _path; | 225 | return _path; |
226 | } | 226 | } |
227 | 227 | ||
228 | 228 | ||
229 | bool OFileNotification::isSingleShot() const | ||
230 | { | ||
231 | return !_multi; | ||
232 | } | ||
233 | |||
234 | |||
229 | bool OFileNotification::activate( const OFileNotificationEvent* e ) | 235 | bool OFileNotification::activate( const OFileNotificationEvent* e ) |
230 | { | 236 | { |
231 | qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() ); | 237 | qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() ); |
232 | 238 | ||
233 | // dumb signal | 239 | // dumb signal |
234 | _signal.activate(); | 240 | _signal.activate(); |
235 | 241 | ||
236 | // generic signal | 242 | // generic signal |
237 | emit triggered( _path, e->mask(), e->name() ); | 243 | emit triggered( _path, e->mask(), e->name() ); |
238 | 244 | ||
239 | // specialized signals | 245 | // specialized signals |
240 | switch ( e->mask() ) | 246 | switch ( e->mask() ) |
241 | { | 247 | { |
242 | case Access: emit accessed( _path ); break; | 248 | case Access: emit accessed( _path ); break; |
243 | case Modify: emit modified( _path ); break; | 249 | case Modify: emit modified( _path ); break; |
244 | case Attrib: emit attributed( _path); break; | 250 | case Attrib: emit attributed( _path); break; |
245 | case CloseWrite: emit closed( _path, true ); break; | 251 | case CloseWrite: emit closed( _path, true ); break; |
246 | case CloseNoWrite: emit closed( _path, false ); break; | 252 | case CloseNoWrite: emit closed( _path, false ); break; |
247 | case Open: emit opened( _path ); break; | 253 | case Open: emit opened( _path ); break; |
248 | case MovedFrom: emit movedFrom( _path, e->name() ); break; | 254 | case MovedFrom: emit movedFrom( _path, e->name() ); break; |
249 | case MovedTo: emit movedTo( _path, e->name() ); break; | 255 | case MovedTo: emit movedTo( _path, e->name() ); break; |
250 | case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break; | 256 | case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break; |
251 | case DeleteFile: emit deletedFile( _path, e->name() ); break; | 257 | case DeleteFile: emit deletedFile( _path, e->name() ); break; |
252 | case CreateSubdir: emit createdSubdir( _path, e->name() ); break; | 258 | case CreateSubdir: emit createdSubdir( _path, e->name() ); break; |
@@ -310,108 +316,129 @@ bool OFileNotification::registerEventHandler() | |||
310 | qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) ); | 316 | qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) ); |
311 | return false; | 317 | return false; |
312 | } | 318 | } |
313 | 319 | ||
314 | OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read, this, "inotify event" ); | 320 | OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read, this, "inotify event" ); |
315 | connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) ); | 321 | connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) ); |
316 | 322 | ||
317 | qDebug( "OFileNotification::registerEventHandler(): done" ); | 323 | qDebug( "OFileNotification::registerEventHandler(): done" ); |
318 | return true; | 324 | return true; |
319 | } | 325 | } |
320 | 326 | ||
321 | 327 | ||
322 | void OFileNotification::unregisterEventHandler() | 328 | void OFileNotification::unregisterEventHandler() |
323 | { | 329 | { |
324 | if ( _sn ) delete _sn; | 330 | if ( _sn ) delete _sn; |
325 | if ( OFileNotification::_fd ) | 331 | if ( OFileNotification::_fd ) |
326 | ::close( OFileNotification::_fd ); | 332 | ::close( OFileNotification::_fd ); |
327 | qDebug( "OFileNotification::unregisterEventHandler(): done" ); | 333 | qDebug( "OFileNotification::unregisterEventHandler(): done" ); |
328 | } | 334 | } |
329 | 335 | ||
330 | //================================================================================================= | 336 | //================================================================================================= |
331 | // ODirNotification | 337 | // ODirNotification |
332 | //================================================================================================= | 338 | //================================================================================================= |
333 | ODirNotification::ODirNotification( QObject* parent, const char* name ) | 339 | ODirNotification::ODirNotification( QObject* parent, const char* name ) |
334 | :QObject( parent, name ) | 340 | :QObject( parent, name ), _topfilenotification( 0 ), _type( Nothing ), _depth( -123 ) |
335 | { | 341 | { |
336 | qDebug( "ODirNotification::ODirNotification()" ); | 342 | qDebug( "ODirNotification::ODirNotification()" ); |
337 | } | 343 | } |
338 | 344 | ||
339 | 345 | ||
340 | ODirNotification::~ODirNotification() | 346 | ODirNotification::~ODirNotification() |
341 | { | 347 | { |
342 | qDebug( "ODirNotification::~ODirNotification()" ); | 348 | qDebug( "ODirNotification::~ODirNotification()" ); |
343 | } | 349 | } |
344 | 350 | ||
351 | /* | ||
352 | Love-Trowbridge recursive directory scanning algorithm: | ||
353 | |||
354 | Step 1. Start at initial directory foo. Add watch. | ||
355 | |||
356 | Step 2. Setup handlers for watch created in Step 1. | ||
357 | Specifically, ensure that a directory created | ||
358 | in foo will result in a handled CREATE_SUBDIR | ||
359 | event. | ||
360 | |||
361 | Step 3. Read the contents of foo. | ||
362 | |||
363 | Step 4. For each subdirectory of foo read in step 3, repeat | ||
364 | step 1. | ||
365 | |||
366 | Step 5. For any CREATE_SUBDIR event on bar, if a watch is | ||
367 | not yet created on bar, repeat step 1 on bar. | ||
368 | */ | ||
345 | 369 | ||
346 | int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) | 370 | int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) |
347 | { | 371 | { |
348 | qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, type, recurse ); | 372 | if ( _type == Nothing ) _type = type; // only set it once - for the top level call |
349 | 373 | OFileNotificationType subtype = ( recurse != 0 ) ? (OFileNotificationType) int( _type | CreateSubdir ) : _type; | |
374 | qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, subtype, recurse ); | ||
350 | OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); | 375 | OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); |
351 | int result = fn->startWatching( path, sshot, type ); | 376 | |
377 | int result = fn->startWatching( path, sshot, subtype ); | ||
352 | if ( result != -1 ) | 378 | if ( result != -1 ) |
353 | { | 379 | { |
380 | |||
381 | if ( !_topfilenotification ) _topfilenotification = fn; // only set it once - for the top level call | ||
382 | if ( _depth == -123 ) _depth = recurse; // only set it once - for the top level call | ||
383 | |||
354 | connect( fn, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ), this, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ) ); | 384 | connect( fn, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ), this, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ) ); |
355 | connect( fn, SIGNAL( accessed( const QString& ) ), this, SIGNAL( accessed( const QString& ) ) ); | 385 | connect( fn, SIGNAL( accessed( const QString& ) ), this, SIGNAL( accessed( const QString& ) ) ); |
356 | connect( fn, SIGNAL( modified( const QString& ) ), this, SIGNAL( modified( const QString& ) ) ); | 386 | connect( fn, SIGNAL( modified( const QString& ) ), this, SIGNAL( modified( const QString& ) ) ); |
357 | connect( fn, SIGNAL( attributed( const QString& ) ), this, SIGNAL( attributed( const QString& ) ) ); | 387 | connect( fn, SIGNAL( attributed( const QString& ) ), this, SIGNAL( attributed( const QString& ) ) ); |
358 | connect( fn, SIGNAL( closed( const QString&, bool ) ), this, SIGNAL( closed( const QString&, bool ) ) ); | 388 | connect( fn, SIGNAL( closed( const QString&, bool ) ), this, SIGNAL( closed( const QString&, bool ) ) ); |
359 | connect( fn, SIGNAL( opened( const QString& ) ), this, SIGNAL( opened( const QString& ) ) ); | 389 | connect( fn, SIGNAL( opened( const QString& ) ), this, SIGNAL( opened( const QString& ) ) ); |
360 | connect( fn, SIGNAL( movedTo( const QString&, const QString& ) ), this, SIGNAL( movedTo( const QString&, const QString& ) ) ); | 390 | connect( fn, SIGNAL( movedTo( const QString&, const QString& ) ), this, SIGNAL( movedTo( const QString&, const QString& ) ) ); |
361 | connect( fn, SIGNAL( movedFrom( const QString&, const QString& ) ), this, SIGNAL( movedFrom( const QString&, const QString& ) ) ); | 391 | connect( fn, SIGNAL( movedFrom( const QString&, const QString& ) ), this, SIGNAL( movedFrom( const QString&, const QString& ) ) ); |
362 | connect( fn, SIGNAL( deletedSubdir( const QString&, const QString& ) ), this, SIGNAL( deletedSubdir( const QString&, const QString& ) ) ); | 392 | connect( fn, SIGNAL( deletedSubdir( const QString&, const QString& ) ), this, SIGNAL( deletedSubdir( const QString&, const QString& ) ) ); |
363 | connect( fn, SIGNAL( deletedFile( const QString&, const QString& ) ), this, SIGNAL( deletedFile( const QString&, const QString& ) ) );; | 393 | connect( fn, SIGNAL( deletedFile( const QString&, const QString& ) ), this, SIGNAL( deletedFile( const QString&, const QString& ) ) );; |
364 | connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SIGNAL( createdSubdir( const QString&, const QString& ) ) ); | 394 | connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SIGNAL( createdSubdir( const QString&, const QString& ) ) ); |
365 | connect( fn, SIGNAL( createdFile( const QString&, const QString& ) ), this, SIGNAL( createdFile( const QString&, const QString& ) ) ); | 395 | connect( fn, SIGNAL( createdFile( const QString&, const QString& ) ), this, SIGNAL( createdFile( const QString&, const QString& ) ) ); |
366 | connect( fn, SIGNAL( deleted( const QString& ) ), this, SIGNAL( deleted( const QString& ) ) ); | 396 | connect( fn, SIGNAL( deleted( const QString& ) ), this, SIGNAL( deleted( const QString& ) ) ); |
367 | connect( fn, SIGNAL( unmounted( const QString& ) ), this, SIGNAL( unmounted( const QString& ) ) ); | 397 | connect( fn, SIGNAL( unmounted( const QString& ) ), this, SIGNAL( unmounted( const QString& ) ) ); |
368 | 398 | ||
369 | if ( recurse ) | 399 | if ( recurse != 0 ) |
370 | { | 400 | { |
401 | connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SLOT( subdirCreated( const QString&, const QString& ) ) ); | ||
402 | |||
371 | QDir directory( path ); | 403 | QDir directory( path ); |
372 | QStringList subdirs = directory.entryList( QDir::Dirs ); | 404 | QStringList subdirs = directory.entryList( QDir::Dirs ); |
373 | 405 | ||
374 | for ( QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it ) | 406 | for ( QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it ) |
375 | { | 407 | { |
376 | if ( (*it) == "." || (*it) == ".." ) continue; | 408 | if ( (*it) == "." || (*it) == ".." ) continue; |
377 | QString subpath = QString( "%1/%2" ).arg( path ).arg( *it ); | 409 | QString subpath = QString( "%1/%2" ).arg( path ).arg( *it ); |
378 | int subresult = watch( subpath, sshot, type, recurse-1 ); | 410 | int subresult = watch( subpath, sshot, subtype, recurse-1 ); |
379 | if ( subresult == -1 ) | 411 | if ( subresult == -1 ) |
380 | { | 412 | { |
381 | qDebug( "ODirNotification::watch(): subresult for '%s' was -1. Interrupting", (const char*) (*it) ); | 413 | qDebug( "ODirNotification::watch(): subresult for '%s' was -1. Interrupting", (const char*) (*it) ); |
382 | return -1; | 414 | return -1; |
383 | } | 415 | } |
384 | } | 416 | } |
385 | } | 417 | } |
386 | //connect( fn, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ), this, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ) ); | ||
387 | } | 418 | } |
388 | else return -1; | 419 | else return -1; |
389 | } | 420 | } |
390 | 421 | ||
391 | 422 | ||
392 | // void ODirNotification::subdirCreated( const QString& name ) | 423 | void ODirNotification::subdirCreated( const QString& dir, const QString& subdir ) |
393 | 424 | { | |
394 | 425 | qDebug( "*** ODirNotification::subdirCreated '%s/%s'", (const char*) dir, (const char*) subdir ); | |
395 | /* | 426 | QString newdir = dir; |
396 | Love-Trowbridge recursive directory scanning algorithm: | 427 | if ( newdir.startsWith( _topfilenotification->path() ) ) |
397 | 428 | { | |
398 | Step 1. Start at initial directory foo. Add watch. | 429 | newdir.replace( _topfilenotification->path(), "" ); |
399 | 430 | int level = newdir.contains( '/' ); | |
400 | Step 2. Setup handlers for watch created in Step 1. | 431 | qDebug( "*** dirpart = '%s' ==> level = %d", (const char*) newdir, level ); |
401 | Specifically, ensure that a directory created | ||
402 | in foo will result in a handled CREATE_SUBDIR | ||
403 | event. | ||
404 | |||
405 | Step 3. Read the contents of foo. | ||
406 | 432 | ||
407 | Step 4. For each subdirectory of foo read in step 3, repeat | 433 | if ( _depth == -1 || _depth > level ) |
408 | step 1. | 434 | { |
435 | watch( QString( "%1/%2" ).arg( dir ).arg( subdir ), _topfilenotification->isSingleShot(), _topfilenotification->type(), _depth == -1 ? -1 : _depth-level-1 ); | ||
436 | } | ||
409 | 437 | ||
410 | Step 5. For any CREATE_SUBDIR event on bar, if a watch is | 438 | } |
411 | not yet created on bar, repeat step 1 on bar. | 439 | } |
412 | */ | ||
413 | 440 | ||
414 | 441 | ||
415 | } // namespace Ui | 442 | } // namespace Ui |
416 | 443 | ||
417 | } // namespace Opie | 444 | } // namespace Opie |
diff --git a/libopie2/opiecore/linux/ofilenotify.h b/libopie2/opiecore/linux/ofilenotify.h index 05343b9..17e6b5d 100644 --- a/libopie2/opiecore/linux/ofilenotify.h +++ b/libopie2/opiecore/linux/ofilenotify.h | |||
@@ -90,48 +90,49 @@ class OFileNotificationEvent; | |||
90 | * | 90 | * |
91 | * This enumerate provides a means to specify the type of events that you are interest in. | 91 | * This enumerate provides a means to specify the type of events that you are interest in. |
92 | * Valid values are: | 92 | * Valid values are: |
93 | * <ul> | 93 | * <ul> |
94 | * <li>Access: The file was accessed (read) | 94 | * <li>Access: The file was accessed (read) |
95 | * <li>Modify The file was modified (write,truncate) | 95 | * <li>Modify The file was modified (write,truncate) |
96 | * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp) | 96 | * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp) |
97 | * <li>CloseWrite = Writable file was closed | 97 | * <li>CloseWrite = Writable file was closed |
98 | * <li>CloseNoWrite = Unwritable file was closed | 98 | * <li>CloseNoWrite = Unwritable file was closed |
99 | * <li>Open = File was opened | 99 | * <li>Open = File was opened |
100 | * <li>MovedFrom = File was moved from X | 100 | * <li>MovedFrom = File was moved from X |
101 | * <li>MovedTo = File was moved to Y | 101 | * <li>MovedTo = File was moved to Y |
102 | * <li>DeleteSubdir = Subdir was deleted | 102 | * <li>DeleteSubdir = Subdir was deleted |
103 | * <li>DeleteFile = Subfile was deleted | 103 | * <li>DeleteFile = Subfile was deleted |
104 | * <li>CreateSubdir = Subdir was created | 104 | * <li>CreateSubdir = Subdir was created |
105 | * <li>CreateFile = Subfile was created | 105 | * <li>CreateFile = Subfile was created |
106 | * <li>DeleteSelf = Self was deleted | 106 | * <li>DeleteSelf = Self was deleted |
107 | * <li>Unmount = The backing filesystem was unmounted | 107 | * <li>Unmount = The backing filesystem was unmounted |
108 | * </ul> | 108 | * </ul> |
109 | * | 109 | * |
110 | **/ | 110 | **/ |
111 | 111 | ||
112 | enum OFileNotificationType | 112 | enum OFileNotificationType |
113 | { | 113 | { |
114 | Nothing = 0, | ||
114 | Access = IN_ACCESS, | 115 | Access = IN_ACCESS, |
115 | Modify = IN_MODIFY, | 116 | Modify = IN_MODIFY, |
116 | Attrib = IN_ATTRIB, | 117 | Attrib = IN_ATTRIB, |
117 | CloseWrite = IN_CLOSE_WRITE, | 118 | CloseWrite = IN_CLOSE_WRITE, |
118 | CloseNoWrite = IN_CLOSE_NOWRITE, | 119 | CloseNoWrite = IN_CLOSE_NOWRITE, |
119 | Open = IN_OPEN, | 120 | Open = IN_OPEN, |
120 | MovedFrom = IN_MOVED_FROM, | 121 | MovedFrom = IN_MOVED_FROM, |
121 | MovedTo = IN_MOVED_TO, | 122 | MovedTo = IN_MOVED_TO, |
122 | DeleteSubdir = IN_DELETE_SUBDIR, | 123 | DeleteSubdir = IN_DELETE_SUBDIR, |
123 | DeleteFile = IN_DELETE_FILE, | 124 | DeleteFile = IN_DELETE_FILE, |
124 | CreateSubdir = IN_CREATE_SUBDIR, | 125 | CreateSubdir = IN_CREATE_SUBDIR, |
125 | CreateFile = IN_CREATE_FILE, | 126 | CreateFile = IN_CREATE_FILE, |
126 | DeleteSelf = IN_DELETE_SELF, | 127 | DeleteSelf = IN_DELETE_SELF, |
127 | Unmount = IN_UNMOUNT, | 128 | Unmount = IN_UNMOUNT, |
128 | _QueueOverflow = IN_Q_OVERFLOW, /* Internal, don't use this in client code */ | 129 | _QueueOverflow = IN_Q_OVERFLOW, /* Internal, don't use this in client code */ |
129 | _Ignored = IN_IGNORED, /* Internal, don't use this in client code */ | 130 | _Ignored = IN_IGNORED, /* Internal, don't use this in client code */ |
130 | }; | 131 | }; |
131 | 132 | ||
132 | /*====================================================================================== | 133 | /*====================================================================================== |
133 | * OFileNotification | 134 | * OFileNotification |
134 | *======================================================================================*/ | 135 | *======================================================================================*/ |
135 | 136 | ||
136 | /** | 137 | /** |
137 | * @brief Represents a file notification | 138 | * @brief Represents a file notification |
@@ -177,48 +178,52 @@ class OFileNotification : public QObject | |||
177 | * This sample program automatically terminates when the file "/tmp/quit" has been accessed. | 178 | * This sample program automatically terminates when the file "/tmp/quit" has been accessed. |
178 | * | 179 | * |
179 | * | 180 | * |
180 | * The @a receiver is the receiving object and the @a member is the slot. | 181 | * The @a receiver is the receiving object and the @a member is the slot. |
181 | **/ | 182 | **/ |
182 | static bool singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify ); | 183 | static bool singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify ); |
183 | /** | 184 | /** |
184 | * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once. | 185 | * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once. |
185 | * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then. | 186 | * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then. |
186 | **/ | 187 | **/ |
187 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); | 188 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); |
188 | /** | 189 | /** |
189 | * Stop watching for file events. | 190 | * Stop watching for file events. |
190 | **/ | 191 | **/ |
191 | void stop(); | 192 | void stop(); |
192 | /** | 193 | /** |
193 | * @returns the notification type as set by @ref start(). | 194 | * @returns the notification type as set by @ref start(). |
194 | **/ | 195 | **/ |
195 | OFileNotificationType type() const; | 196 | OFileNotificationType type() const; |
196 | /** | 197 | /** |
197 | * @returns the path to the file being watched by this instance. | 198 | * @returns the path to the file being watched by this instance. |
198 | **/ | 199 | **/ |
199 | QString path() const; | 200 | QString path() const; |
200 | /** | 201 | /** |
202 | * @returns if the notification is single-shot | ||
203 | */ | ||
204 | bool isSingleShot() const; | ||
205 | /** | ||
201 | * @returns if a file is currently being watched. | 206 | * @returns if a file is currently being watched. |
202 | **/ | 207 | **/ |
203 | bool isActive() const; | 208 | bool isActive() const; |
204 | /** | 209 | /** |
205 | * @internal | 210 | * @internal |
206 | */ | 211 | */ |
207 | int startWatching( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); | 212 | int startWatching( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); |
208 | 213 | ||
209 | signals: | 214 | signals: |
210 | void triggered( const QString&, unsigned int, const QString& ); | 215 | void triggered( const QString&, unsigned int, const QString& ); |
211 | void accessed( const QString& ); | 216 | void accessed( const QString& ); |
212 | void modified( const QString& ); | 217 | void modified( const QString& ); |
213 | void attributed( const QString& ); | 218 | void attributed( const QString& ); |
214 | void closed( const QString&, bool ); | 219 | void closed( const QString&, bool ); |
215 | void opened( const QString& ); | 220 | void opened( const QString& ); |
216 | void movedTo( const QString&, const QString& ); | 221 | void movedTo( const QString&, const QString& ); |
217 | void movedFrom( const QString&, const QString& ); | 222 | void movedFrom( const QString&, const QString& ); |
218 | void deletedSubdir( const QString&, const QString& ); | 223 | void deletedSubdir( const QString&, const QString& ); |
219 | void deletedFile( const QString&, const QString& ); | 224 | void deletedFile( const QString&, const QString& ); |
220 | void createdSubdir( const QString&, const QString& ); | 225 | void createdSubdir( const QString&, const QString& ); |
221 | void createdFile( const QString&, const QString& ); | 226 | void createdFile( const QString&, const QString& ); |
222 | void deleted( const QString& ); | 227 | void deleted( const QString& ); |
223 | void unmounted( const QString& ); | 228 | void unmounted( const QString& ); |
224 | 229 | ||
@@ -271,48 +276,56 @@ class ODirNotification : public QObject | |||
271 | * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree, | 276 | * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree, |
272 | * use 0 for no recursion and -1 for unlimited recursion. | 277 | * use 0 for no recursion and -1 for unlimited recursion. |
273 | * Set @a sshot to True if you want to be notified only once. | 278 | * Set @a sshot to True if you want to be notified only once. |
274 | **/ | 279 | **/ |
275 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 ); | 280 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 ); |
276 | 281 | ||
277 | signals: | 282 | signals: |
278 | /** | 283 | /** |
279 | * This signal is emitted if an event happens of the specified type happens to the directory being watched. | 284 | * This signal is emitted if an event happens of the specified type happens to the directory being watched. |
280 | **/ | 285 | **/ |
281 | void triggered( const QString&, unsigned int, const QString& ); | 286 | void triggered( const QString&, unsigned int, const QString& ); |
282 | void accessed( const QString& ); | 287 | void accessed( const QString& ); |
283 | void modified( const QString& ); | 288 | void modified( const QString& ); |
284 | void attributed( const QString& ); | 289 | void attributed( const QString& ); |
285 | void closed( const QString&, bool ); | 290 | void closed( const QString&, bool ); |
286 | void opened( const QString& ); | 291 | void opened( const QString& ); |
287 | void movedTo( const QString&, const QString& ); | 292 | void movedTo( const QString&, const QString& ); |
288 | void movedFrom( const QString&, const QString& ); | 293 | void movedFrom( const QString&, const QString& ); |
289 | void deletedSubdir( const QString&, const QString& ); | 294 | void deletedSubdir( const QString&, const QString& ); |
290 | void deletedFile( const QString&, const QString& ); | 295 | void deletedFile( const QString&, const QString& ); |
291 | void createdSubdir( const QString&, const QString& ); | 296 | void createdSubdir( const QString&, const QString& ); |
292 | void createdFile( const QString&, const QString& ); | 297 | void createdFile( const QString&, const QString& ); |
293 | void deleted( const QString& ); | 298 | void deleted( const QString& ); |
294 | void unmounted( const QString& ); | 299 | void unmounted( const QString& ); |
300 | |||
301 | private slots: | ||
302 | void subdirCreated( const QString&, const QString& ); | ||
303 | |||
304 | private: | ||
305 | OFileNotification* _topfilenotification; | ||
306 | OFileNotificationType _type; | ||
307 | int _depth; | ||
295 | }; | 308 | }; |
296 | 309 | ||
297 | /*====================================================================================== | 310 | /*====================================================================================== |
298 | * OFileNotificationEvent | 311 | * OFileNotificationEvent |
299 | *======================================================================================*/ | 312 | *======================================================================================*/ |
300 | 313 | ||
301 | class OFileNotificationEvent | 314 | class OFileNotificationEvent |
302 | { | 315 | { |
303 | public: | 316 | public: |
304 | OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ); | 317 | OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ); |
305 | ~OFileNotificationEvent(); | 318 | ~OFileNotificationEvent(); |
306 | OFileNotification* parent() const { return _parent; }; | 319 | OFileNotification* parent() const { return _parent; }; |
307 | int descriptor() const { return _wd; }; | 320 | int descriptor() const { return _wd; }; |
308 | unsigned int mask() const { return _mask; }; | 321 | unsigned int mask() const { return _mask; }; |
309 | unsigned int cookie() const { return _cookie; }; | 322 | unsigned int cookie() const { return _cookie; }; |
310 | QString name() const { return _name; }; | 323 | QString name() const { return _name; }; |
311 | void activate() { _parent->activate( this ); }; | 324 | void activate() { _parent->activate( this ); }; |
312 | 325 | ||
313 | private: | 326 | private: |
314 | OFileNotification* _parent; | 327 | OFileNotification* _parent; |
315 | int _wd; | 328 | int _wd; |
316 | unsigned int _mask; | 329 | unsigned int _mask; |
317 | unsigned int _cookie; | 330 | unsigned int _cookie; |
318 | QString _name; | 331 | QString _name; |