author | mickeyl <mickeyl> | 2005-05-06 19:47:16 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2005-05-06 19:47:16 (UTC) |
commit | 8b1a64ffe497f5395544c6702225003aca293f80 (patch) (side-by-side diff) | |
tree | 98d8aa7db946ae0bc9f96f51fd040627a125dceb /libopie2/opiecore/ofilenotify.cpp | |
parent | e73cc9ec4596e1b5e9eed13af710606f358860ba (diff) | |
download | opie-8b1a64ffe497f5395544c6702225003aca293f80.zip opie-8b1a64ffe497f5395544c6702225003aca293f80.tar.gz opie-8b1a64ffe497f5395544c6702225003aca293f80.tar.bz2 |
fix a couple of issues with OFileNotification, seems to work with single and multiple file notifications now
add a named trigger
Diffstat (limited to 'libopie2/opiecore/ofilenotify.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libopie2/opiecore/ofilenotify.cpp | 95 |
1 files changed, 65 insertions, 30 deletions
diff --git a/libopie2/opiecore/ofilenotify.cpp b/libopie2/opiecore/ofilenotify.cpp index c221e58..efd041a 100644 --- a/libopie2/opiecore/ofilenotify.cpp +++ b/libopie2/opiecore/ofilenotify.cpp @@ -81,36 +81,48 @@ bool OFileNotification::isActive() const int OFileNotification::watch( const QString& path, bool sshot, OFileNotificationType type ) { - if ( QFile::exists( path ) ) + // check if path exists and is a regular file + struct stat s; + if ( ::stat( (const char*) path, &s ) == -1 ) { - if ( notification_list.isEmpty() ) - { - OFileNotification::registerEventHandler(); - } - - struct inotify_watch_request iwr; - ::memset( &iwr, 0, sizeof iwr ); - iwr.name = const_cast<char*>( (const char*) path ); - iwr.mask = type; - - _wd = ::ioctl( OFileNotification::_fd, INOTIFY_WATCH, &iwr ); - - if ( _wd < 0 ) - { - qWarning( "OFileNotification::watch(): inotify can't watch '%s': %s.", (const char*) path, strerror( errno ) ); - return -1; - } - - notification_list.insert( _wd, this ); - _multi = !sshot; - _type = type; - _active = true; - qDebug( "OFileNotification::watch(): watching '%s' [wd=%d].", (const char*) path, _wd ); - return _wd; + qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); + return -1; } - else + if ( !S_ISREG( s.st_mode ) ) { - qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); + qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, "not a regular file" ); + return -1; + } + + if ( notification_list.isEmpty() ) + { + OFileNotification::registerEventHandler(); + } + + return startWatching( path, sshot, type ); +} + + +int OFileNotification::startWatching( const QString& path, bool sshot, OFileNotificationType type ) +{ + struct inotify_watch_request iwr; + ::memset( &iwr, 0, sizeof iwr ); + iwr.name = const_cast<char*>( (const char*) path ); + iwr.mask = type; + + _wd = ::ioctl( OFileNotification::_fd, INOTIFY_WATCH, &iwr ); + + if ( _wd < 0 ) + { + qWarning( "OFileNotification::watch(): inotify can't watch '%s': %s.", (const char*) path, strerror( errno ) ); return -1; } + + notification_list.insert( _wd, this ); + _path = path; + _multi = !sshot; + _type = type; + _active = true; + qDebug( "OFileNotification::watch(): watching '%s' [wd=%d].", (const char*) path, _wd ); + return _wd; } @@ -143,5 +155,5 @@ QString OFileNotification::path() const bool OFileNotification::activate() { - emit triggered(); + emit triggered( _path ); _signal.activate(); if ( !_multi ) stop(); @@ -150,9 +162,9 @@ bool OFileNotification::activate() -void OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) +bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) { OFileNotification* ofn = new OFileNotification(); ofn->_signal.connect( receiver, member ); - ofn->watch( path, true, type ); + return ofn->watch( path, true, type ) != -1; } @@ -219,4 +231,5 @@ bool OFileNotification::registerEventHandler() void OFileNotification::unregisterEventHandler() { + if ( _sn ) delete _sn; if ( OFileNotification::_fd ) ::close( OFileNotification::_fd ); @@ -224,5 +237,27 @@ void OFileNotification::unregisterEventHandler() } +//================================================================================================= +// ODirNotification +//================================================================================================= +ODirNotification::ODirNotification( QObject* parent, const char* name ) + :QObject( parent, name ) +{ + qDebug( "ODirNotification::ODirNotification()" ); +} + +ODirNotification::~ODirNotification() +{ + qDebug( "ODirNotification::~ODirNotification()" ); } + + +int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) +{ + qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, type, recurse ); + return 0; } + +} + +}
\ No newline at end of file |