Diffstat (limited to 'libopie2/opiecore/ofilenotify.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | libopie2/opiecore/ofilenotify.cpp | 55 |
1 files changed, 45 insertions, 10 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 @@ -71,57 +71,69 @@ OFileNotification::~OFileNotification() qDebug( "OFileNotification::~OFileNotification()" ); } bool OFileNotification::isActive() const { return _active; } 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 ) { + qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); + return -1; + } + if ( !S_ISREG( s.st_mode ) ) + { + 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; } - else - { - qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); - return -1; - } -} void OFileNotification::stop() { notification_list.remove( _wd ); _path = QString::null; _wd = 0; _active = false; if ( notification_list.isEmpty() ) { OFileNotification::unregisterEventHandler(); } @@ -133,36 +145,36 @@ OFileNotificationType OFileNotification::type() const return _type; } QString OFileNotification::path() const { return _path; } bool OFileNotification::activate() { - emit triggered(); + emit triggered( _path ); _signal.activate(); if ( !_multi ) stop(); return true; } -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; } void OFileNotification::inotifyEventHandler() { qWarning( "OFileNotification::__eventHandler(): reached." ); char buffer[16384]; size_t buffer_i; struct inotify_event *pevent, *event; ssize_t r; size_t event_size; @@ -209,20 +221,43 @@ bool OFileNotification::registerEventHandler() } OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read, this, "inotify event" ); connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) ); qDebug( "OFileNotification::registerEventHandler(): done" ); return true; } void OFileNotification::unregisterEventHandler() { + if ( _sn ) delete _sn; if ( OFileNotification::_fd ) ::close( OFileNotification::_fd ); qDebug( "OFileNotification::unregisterEventHandler(): done" ); } +//================================================================================================= +// 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; } + +} + } |