Diffstat (limited to 'libopie2/opiecore/ofilenotify.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | libopie2/opiecore/ofilenotify.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/libopie2/opiecore/ofilenotify.cpp b/libopie2/opiecore/ofilenotify.cpp index efd041a..11d4f87 100644 --- a/libopie2/opiecore/ofilenotify.cpp +++ b/libopie2/opiecore/ofilenotify.cpp @@ -48,107 +48,107 @@ using namespace Opie::Core; #include <errno.h> #include <unistd.h> static QIntDict<OFileNotification> notification_list; QSocketNotifier* OFileNotification::_sn; int OFileNotification::_fd = -1; #define INOTIFY_DEVICE "/dev/inotify" namespace Opie { namespace Core { OFileNotification::OFileNotification( QObject* parent, const char* name ) :QObject( parent, name ), _active( false ), _multi( true ) { qDebug( "OFileNotification::OFileNotification()" ); } OFileNotification::~OFileNotification() { stop(); qDebug( "OFileNotification::~OFileNotification()" ); } bool OFileNotification::isActive() const { return _active; } int OFileNotification::watch( const QString& path, bool sshot, OFileNotificationType type ) { // 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 ) { + 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 ); _path = path; _multi = !sshot; _type = type; _active = true; qDebug( "OFileNotification::watch(): watching '%s' [wd=%d].", (const char*) path, _wd ); return _wd; } void OFileNotification::stop() { notification_list.remove( _wd ); _path = QString::null; _wd = 0; _active = false; if ( notification_list.isEmpty() ) { OFileNotification::unregisterEventHandler(); } } OFileNotificationType OFileNotification::type() const { return _type; } QString OFileNotification::path() const { return _path; } @@ -210,54 +210,69 @@ void OFileNotification::inotifyEventHandler() return; } bool OFileNotification::registerEventHandler() { OFileNotification::_fd = ::open( INOTIFY_DEVICE, O_RDONLY ); if ( OFileNotification::_fd < 0 ) { qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) ); return false; } 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; -} + if ( recurse == 0 ) + { + OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); + int result = fn->startWatching( path, sshot, type ); + if ( result != -1 ) + { + connect( fn, SIGNAL( triggered( const QString& ) ), this, SIGNAL( triggered( const QString& ) ) ); + return result; + } + } + else + { + qDebug( "ODirNotification::watch(), recursion not yet implemented... :)" ); + return -1; } - }
\ No newline at end of file + +} // namespace Ui + +} // namespace Opie |