summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiecore/ofilenotify.cpp55
-rw-r--r--libopie2/opiecore/ofilenotify.h42
2 files changed, 84 insertions, 13 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
@@ -80,13 +80,30 @@ 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 )
{
+ 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 );
@@ -101,18 +118,13 @@ int OFileNotification::watch( const QString& path, bool sshot, OFileNotification
}
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()
@@ -142,18 +154,18 @@ QString OFileNotification::path() const
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;
}
@@ -218,11 +230,34 @@ bool OFileNotification::registerEventHandler()
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;
}
+
+}
+
}
diff --git a/libopie2/opiecore/ofilenotify.h b/libopie2/opiecore/ofilenotify.h
index ea525e9..41ba84d 100644
--- a/libopie2/opiecore/ofilenotify.h
+++ b/libopie2/opiecore/ofilenotify.h
@@ -98,7 +98,7 @@ enum OFileNotificationType
* @brief Represents a file notification
*
* This class allows to watch for events happening to files.
- * It uses the inotify kernel interface
+ * It uses the inotify linux (2.6.x) kernel interface.
*
* @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/
*
@@ -140,7 +140,7 @@ class OFileNotification : public QObject
*
* The @a receiver is the receiving object and the @a member is the slot.
**/
- static void singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify );
+ static bool singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify );
/**
* Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once.
* Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then.
@@ -162,12 +162,16 @@ class OFileNotification : public QObject
* @returns if a file is currently being watched.
**/
bool isActive() const;
+ /**
+ * @internal
+ */
+ int startWatching( const QString& path, bool sshot = false, OFileNotificationType type = Modify );
signals:
/**
* This signal is emitted if an event happens of the specified type happens to the file being watched.
**/
- void triggered();
+ void triggered( const QString& name );
protected:
bool activate();
@@ -189,6 +193,38 @@ class OFileNotification : public QObject
static int _fd; // inotify device descriptor
};
+/*======================================================================================
+ * ODirNotification
+ *======================================================================================*/
+
+/**
+ * @brief Represents a directory notification
+ *
+ * This class allows to watch for events happening to directories
+ * It uses the OFileNotification class
+ *
+ * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/
+ *
+ * @author Michael 'Mickey' Lauer <mickey@vanille.de>
+ *
+ **/
+
+class ODirNotification : public QObject
+{
+ Q_OBJECT
+
+ public:
+ ODirNotification( QObject* parent = 0, const char* name = 0 );
+ ~ODirNotification();
+ /**
+ * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree,
+ * use 0 for no recursion and -1 for unlimited recursion.
+ * Set @a sshot to True if you want to be notified only once.
+ **/
+ int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 );
+};
+
+
}
}