summaryrefslogtreecommitdiff
path: root/libopie2/opiecore/ofilenotify.h
Unidiff
Diffstat (limited to 'libopie2/opiecore/ofilenotify.h') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/ofilenotify.h93
1 files changed, 50 insertions, 43 deletions
diff --git a/libopie2/opiecore/ofilenotify.h b/libopie2/opiecore/ofilenotify.h
index d820f7c..e3621cf 100644
--- a/libopie2/opiecore/ofilenotify.h
+++ b/libopie2/opiecore/ofilenotify.h
@@ -1,15 +1,15 @@
1/* 1/*
2                This file is part of the Opie Project 2                This file is part of the Opie Project
3 =. Copyright (C) 2004 Michael 'Mickey' Lauer <mickey@Vanille.de> 3 =. Copyright (C) 2004-2005 Michael 'Mickey' Lauer <mickey@Vanille.de>
4 .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5          .>+-= 5          .>+-=
6_;:,     .>    :=|. This program is free software; you can 6_;:,     .>    :=|. This program is free software; you can
7.> <`_,   >  .   <= redistribute it and/or modify it under 7.> <`_,   >  .   <= redistribute it and/or modify it under
8:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 8:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
9.="- .-=="i,     .._ License as published by the Free Software 9.="- .-=="i,     .._ License as published by the Free Software
10- .   .-<_>     .<> Foundation; either version 2 of the License, 10- .   .-<_>     .<> Foundation; version 2 of the License.
11    ._= =}       : or (at your option) any later version. 11    ._= =}       :
12   .%`+i>       _;_. 12   .%`+i>       _;_.
13   .i_,=:_.      -<s. This program is distributed in the hope that 13   .i_,=:_.      -<s. This program is distributed in the hope that
14    +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 14    +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
15   : ..    .:,     . . . without even the implied warranty of 15   : ..    .:,     . . . without even the implied warranty of
@@ -32,15 +32,14 @@ _;:,     .>    :=|. This program is free software; you can
32#define _GNU_SOURCE 32#define _GNU_SOURCE
33#endif 33#endif
34 34
35/* QT */ 35/* QT */
36#include <qobject.h> 36#include <qsocketnotifier.h>
37#include <qsignal.h> 37#include <qsignal.h>
38#include <qstring.h> 38#include <qstring.h>
39 39
40/* STD */ 40/* STD */
41#include <signal.h> 41#include "inotify.h"
42#include <fcntl.h>
43 42
44namespace Opie { 43namespace Opie {
45namespace Core { 44namespace Core {
46 45
@@ -55,24 +54,43 @@ namespace Core {
55 * Valid values are: 54 * Valid values are:
56 * <ul> 55 * <ul>
57 * <li>Access: The file was accessed (read) 56 * <li>Access: The file was accessed (read)
58 * <li>Modify The file was modified (write,truncate) 57 * <li>Modify The file was modified (write,truncate)
59 * <li>Create = The file was created in the directory
60 * <li>Delete = The file was unlinked from directory
61 * <li>Rename = The file was renamed
62 * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp) 58 * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp)
59 * <li>CloseWrite = Writable file was closed
60 * <li>CloseNoWrite = Unwritable file was closed
61 * <li>Open = File was opened
62 * <li>MovedFrom = File was moved from X
63 * <li>MovedTo = File was moved to Y
64 * <li>DeleteSubdir = Subdir was deleted
65 * <li>DeleteFile = Subfile was deleted
66 * <li>CreateSubdir = Subdir was created
67 * <li>CreateFile = Subfile was created
68 * <li>DeleteSelf = Self was deleted
69 * <li>Unmount = The backing filesystem was unmounted
63 * </ul> 70 * </ul>
64 * 71 *
65 **/ 72 **/
66 73
67enum OFileNotificationType { Single = 0x0000000, 74enum OFileNotificationType
68 Multi = DN_MULTISHOT, 75{
69 Access = DN_ACCESS, 76 Access = IN_ACCESS,
70 Modify = DN_MODIFY, 77 Modify = IN_MODIFY,
71 Create = DN_CREATE, 78 Attrib = IN_ATTRIB,
72 Delete = DN_DELETE, 79 CloseWrite = IN_CLOSE_WRITE,
73 Rename = DN_RENAME, 80 CloseNoWrite = IN_CLOSE_NOWRITE,
74 Attrib = DN_ATTRIB }; 81 Open = IN_OPEN,
82 MovedFrom = IN_MOVED_FROM,
83 MovedTo = IN_MOVED_TO,
84 DeleteSubdir = IN_DELETE_SUBDIR,
85 DeleteFile = IN_DELETE_FILE,
86 CreateSubdir = IN_CREATE_SUBDIR,
87 CreateFile = IN_CREATE_FILE,
88 DeleteSelf = IN_DELETE_SELF,
89 Unmount = IN_UNMOUNT,
90 _QueueOverflow = IN_Q_OVERFLOW, /* Internal, don't use this in client code */
91 _Ignored = IN_IGNORED, /* Internal, don't use this in client code */
92};
75 93
76/*====================================================================================== 94/*======================================================================================
77 * OFileNotification 95 * OFileNotification
78 *======================================================================================*/ 96 *======================================================================================*/
@@ -80,11 +98,11 @@ enum OFileNotificationType { Single = 0x0000000,
80/** 98/**
81 * @brief Represents a file notification 99 * @brief Represents a file notification
82 * 100 *
83 * This class allows to watch for events happening to files. 101 * This class allows to watch for events happening to files.
84 * It uses the dnotify kernel interface which is a very efficient signalling interface. 102 * It uses the inotify kernel interface
85 * 103 *
86 * @see <file:///usr/src/linux/Documentation/dnotify.txt> 104 * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/
87 * 105 *
88 * @author Michael 'Mickey' Lauer <mickey@vanille.de> 106 * @author Michael 'Mickey' Lauer <mickey@vanille.de>
89 * 107 *
90 **/ 108 **/
@@ -105,9 +123,9 @@ class OFileNotification : public QObject
105 * Example: 123 * Example:
106 * <pre> 124 * <pre>
107 * 125 *
108 * #include <opie2/oapplication.h> 126 * #include <opie2/oapplication.h>
109 * #include <opie2/onitify.h> 127 * #include <opie2/ofilenotify.h>
110 * using namespace Opie::Core; 128 * using namespace Opie::Core;
111 * 129 *
112 * int main( int argc, char **argv ) 130 * int main( int argc, char **argv )
113 * { 131 * {
@@ -117,9 +135,9 @@ class OFileNotification : public QObject
117 * return a.exec(); 135 * return a.exec();
118 * } 136 * }
119 * </pre> 137 * </pre>
120 * 138 *
121 * This sample program automatically terminates when the file "/tmp/quite" has been created. 139 * This sample program automatically terminates when the file "/tmp/quit" has been created.
122 * 140 *
123 * 141 *
124 * The @a receiver is the receiving object and the @a member is the slot. 142 * The @a receiver is the receiving object and the @a member is the slot.
125 **/ 143 **/
@@ -127,9 +145,9 @@ class OFileNotification : public QObject
127 /** 145 /**
128 * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once. 146 * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once.
129 * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then. 147 * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then.
130 **/ 148 **/
131 int start( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); 149 int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify );
132 /** 150 /**
133 * Stop watching for file events. 151 * Stop watching for file events.
134 **/ 152 **/
135 void stop(); 153 void stop();
@@ -141,12 +159,8 @@ class OFileNotification : public QObject
141 * @returns the path to the file being watched by this instance. 159 * @returns the path to the file being watched by this instance.
142 **/ 160 **/
143 QString path() const; 161 QString path() const;
144 /** 162 /**
145 * @returns the UNIX file descriptor for the file being watched.
146 **/
147 int fileno() const;
148 /**
149 * @returns if a file is currently being watched. 163 * @returns if a file is currently being watched.
150 **/ 164 **/
151 bool isActive() const; 165 bool isActive() const;
152 166
@@ -157,33 +171,26 @@ class OFileNotification : public QObject
157 void triggered(); 171 void triggered();
158 172
159 protected: 173 protected:
160 bool activate(); 174 bool activate();
161 virtual bool hasChanged(); 175
162 static bool registerSignalHandler(); 176 private slots:
163 static void unregisterSignalHandler(); 177 void inotifyEventHandler();
164 static void __signalHandler( int sig, siginfo_t *si, void *data );
165 178
166 private: 179 private:
180 bool registerEventHandler();
181 void unregisterEventHandler();
182
167 QString _path; 183 QString _path;
168 OFileNotificationType _type; 184 OFileNotificationType _type;
169 QSignal _signal; 185 QSignal _signal;
170 int _fd;
171 bool _active; 186 bool _active;
172 struct stat _stat; 187 bool _multi;
173}; 188 static QSocketNotifier* _sn;
174 189 int _wd; // inotify watch descriptor
175#if 0 190 static int _fd; // inotify device descriptor
176
177class ODirectoryNotification : public OFileNotification
178{
179
180 public:
181 virtual bool hasChanged() { return true; };
182}; 191};
183 192
184#endif
185
186} 193}
187} 194}
188 195
189#endif 196#endif