author | mickeyl <mickeyl> | 2005-05-06 20:18:58 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2005-05-06 20:18:58 (UTC) |
commit | e8bb0ef7701e6bb565dc178424687e82b12bd8ec (patch) (unidiff) | |
tree | db22a14ae11f6ec2b942b51af6def4e03d3a8f50 | |
parent | 8b1a64ffe497f5395544c6702225003aca293f80 (diff) | |
download | opie-e8bb0ef7701e6bb565dc178424687e82b12bd8ec.zip opie-e8bb0ef7701e6bb565dc178424687e82b12bd8ec.tar.gz opie-e8bb0ef7701e6bb565dc178424687e82b12bd8ec.tar.bz2 |
first sketch at ODirNotification class
-rw-r--r-- | examples/opiecore/onotifydemo/onotifydemo.cpp | 50 | ||||
-rw-r--r-- | examples/opiecore/onotifydemo/onotifydemo.h | 3 | ||||
-rw-r--r-- | libopie2/opiecore/ofilenotify.cpp | 31 | ||||
-rw-r--r-- | libopie2/opiecore/ofilenotify.h | 10 |
4 files changed, 77 insertions, 17 deletions
diff --git a/examples/opiecore/onotifydemo/onotifydemo.cpp b/examples/opiecore/onotifydemo/onotifydemo.cpp index 0e84d80..2beda2a 100644 --- a/examples/opiecore/onotifydemo/onotifydemo.cpp +++ b/examples/opiecore/onotifydemo/onotifydemo.cpp | |||
@@ -2,24 +2,25 @@ | |||
2 | 2 | ||
3 | /* OPIE */ | 3 | /* OPIE */ |
4 | #include <opie2/odebug.h> | 4 | #include <opie2/odebug.h> |
5 | #include <opie2/oapplication.h> | 5 | #include <opie2/oapplication.h> |
6 | #include <opie2/ofiledialog.h> | 6 | #include <opie2/ofiledialog.h> |
7 | #include <opie2/olistview.h> | 7 | #include <opie2/olistview.h> |
8 | #include <opie2/ofilenotify.h> | 8 | #include <opie2/ofilenotify.h> |
9 | using namespace Opie::Core; | 9 | using namespace Opie::Core; |
10 | using namespace Opie::Ui; | 10 | using namespace Opie::Ui; |
11 | 11 | ||
12 | /* QT */ | 12 | /* QT */ |
13 | #include <qcheckbox.h> | 13 | #include <qcheckbox.h> |
14 | #include <qfileinfo.h> | ||
14 | #include <qvbox.h> | 15 | #include <qvbox.h> |
15 | #include <qhbox.h> | 16 | #include <qhbox.h> |
16 | #include <qhbuttongroup.h> | 17 | #include <qhbuttongroup.h> |
17 | #include <qvbuttongroup.h> | 18 | #include <qvbuttongroup.h> |
18 | #include <qmessagebox.h> | 19 | #include <qmessagebox.h> |
19 | #include <qpushbutton.h> | 20 | #include <qpushbutton.h> |
20 | 21 | ||
21 | DemoApp::DemoApp( int argc, char** argv ) : OApplication( argc, argv, "libopie2 notify demo" ) | 22 | DemoApp::DemoApp( int argc, char** argv ) : OApplication( argc, argv, "libopie2 notify demo" ) |
22 | { | 23 | { |
23 | 24 | ||
24 | QVBox* vbox = new QVBox(); | 25 | QVBox* vbox = new QVBox(); |
25 | setMainWidget( vbox ); | 26 | setMainWidget( vbox ); |
@@ -80,33 +81,65 @@ DemoApp::DemoApp( int argc, char** argv ) : OApplication( argc, argv, "libopie2 | |||
80 | 81 | ||
81 | void DemoApp::addTrigger( bool multi ) | 82 | void DemoApp::addTrigger( bool multi ) |
82 | { | 83 | { |
83 | if ( !m ) | 84 | if ( !m ) |
84 | { | 85 | { |
85 | QMessageBox::warning( 0, "Add Trigger", "<p>Can't add trigger without at least one selected trigger type</p>", "&Sorry", 0 ); | 86 | QMessageBox::warning( 0, "Add Trigger", "<p>Can't add trigger without at least one selected trigger type</p>", "&Sorry", 0 ); |
86 | return; | 87 | return; |
87 | } | 88 | } |
88 | 89 | ||
89 | QString filename = OFileDialog::getOpenFileName( OFileSelector::ExtendedAll ); | 90 | QString filename = OFileDialog::getOpenFileName( OFileSelector::ExtendedAll ); |
90 | if ( !filename.isEmpty() ) | 91 | if ( !filename.isEmpty() ) |
91 | { | 92 | { |
93 | bool success = true; | ||
92 | odebug << "Filename = " << filename << oendl; | 94 | odebug << "Filename = " << filename << oendl; |
93 | 95 | ||
94 | int fntype = m; | 96 | int fntype = m; |
95 | QString modifier = QString().sprintf( " = 0x%08x", fntype ); | 97 | QString modifier = QString().sprintf( " = 0x%08x", fntype ); |
96 | new OListViewItem( l, filename, multi ? "MULTI" : "SINGLE", modifier ); | 98 | |
97 | if ( !multi ) | 99 | if ( QFileInfo( filename ).isFile() ) |
98 | OFileNotification::singleShot( filename, this, SLOT( trigger() ), (OFileNotificationType) fntype ); | 100 | { |
101 | if ( !multi ) | ||
102 | { | ||
103 | success = OFileNotification::singleShot( filename, this, SLOT( unnamedTrigger() ), (OFileNotificationType) fntype ); | ||
104 | } | ||
105 | else | ||
106 | { | ||
107 | OFileNotification* fn = new OFileNotification(); | ||
108 | success = fn->watch( filename, false, (OFileNotificationType) fntype ); | ||
109 | connect( fn, SIGNAL( triggered( const QString& ) ), this, SLOT( namedTrigger( const QString& ) ) ); | ||
110 | } | ||
111 | } | ||
112 | else if ( QFileInfo( filename ).isDir() ) | ||
113 | { | ||
114 | ODirNotification* dn = new ODirNotification(); | ||
115 | success = dn->watch( filename, !multi, (OFileNotificationType) fntype ); | ||
116 | connect( dn, SIGNAL( triggered( const QString& ) ), this, SLOT( namedTrigger( const QString& ) ) ); | ||
117 | } | ||
118 | else | ||
119 | { | ||
120 | odebug << "Huh!? Neither file nor directory..." << oendl; | ||
121 | return; | ||
122 | } | ||
123 | |||
124 | /* if ( !success ) | ||
125 | { | ||
126 | QMessageBox::warning( 0, "Add Trigger", "<p>Couldn't add trigger :(</p>", "&Sorry", 0 ); | ||
127 | return; | ||
128 | } | ||
99 | else | 129 | else |
100 | odebug << "not yet implemented..." << oendl; | 130 | */ { |
131 | new OListViewItem( l, filename, multi ? "MULTI" : "SINGLE", modifier ); | ||
132 | } | ||
133 | return; | ||
101 | } | 134 | } |
102 | else | 135 | else |
103 | { | 136 | { |
104 | odebug << "cancelled." << oendl; | 137 | odebug << "cancelled." << oendl; |
105 | } | 138 | } |
106 | } | 139 | } |
107 | 140 | ||
108 | void DemoApp::modifierClicked( int modifier ) { m = static_cast<OFileNotificationType>( (int)m ^ int(modifier) ); }; | 141 | void DemoApp::modifierClicked( int modifier ) { m = static_cast<OFileNotificationType>( (int)m ^ int(modifier) ); }; |
109 | void DemoApp::addSingle() { addTrigger(); }; | 142 | void DemoApp::addSingle() { addTrigger(); }; |
110 | void DemoApp::addMulti() { addTrigger( true ); }; | 143 | void DemoApp::addMulti() { addTrigger( true ); }; |
111 | 144 | ||
112 | void DemoApp::delTrigger() | 145 | void DemoApp::delTrigger() |
@@ -115,26 +148,31 @@ DemoApp::DemoApp( int argc, char** argv ) : OApplication( argc, argv, "libopie2 | |||
115 | if ( !item ) | 148 | if ( !item ) |
116 | { | 149 | { |
117 | QMessageBox::warning( 0, "Del Trigger", "<p>No trigger selected!</p>", "&Sorry", 0 ); | 150 | QMessageBox::warning( 0, "Del Trigger", "<p>No trigger selected!</p>", "&Sorry", 0 ); |
118 | return; | 151 | return; |
119 | } | 152 | } |
120 | else | 153 | else |
121 | { | 154 | { |
122 | QString filename( item->text( 0 ) ); | 155 | QString filename( item->text( 0 ) ); |
123 | odebug << "Filename = " << filename << oendl; | 156 | odebug << "Filename = " << filename << oendl; |
124 | } | 157 | } |
125 | } | 158 | } |
126 | 159 | ||
127 | void DemoApp::trigger() | 160 | void DemoApp::unnamedTrigger() |
161 | { | ||
162 | owarn << "DemoApp::singleShotStrigger() : F I R E !!!!!" << oendl; | ||
163 | } | ||
164 | |||
165 | void DemoApp::namedTrigger( const QString& path ) | ||
128 | { | 166 | { |
129 | owarn << "FIRE!" << oendl; | 167 | owarn << "DemoApp::named trigger = " << path << " : F I R E !!!!!" << oendl; |
130 | } | 168 | } |
131 | 169 | ||
132 | int main( int argc, char** argv ) | 170 | int main( int argc, char** argv ) |
133 | { | 171 | { |
134 | DemoApp* app = new DemoApp( argc, argv ); | 172 | DemoApp* app = new DemoApp( argc, argv ); |
135 | app->exec(); | 173 | app->exec(); |
136 | 174 | ||
137 | return 0; | 175 | return 0; |
138 | 176 | ||
139 | } | 177 | } |
140 | 178 | ||
diff --git a/examples/opiecore/onotifydemo/onotifydemo.h b/examples/opiecore/onotifydemo/onotifydemo.h index c4e3456..f6ac5ea 100644 --- a/examples/opiecore/onotifydemo/onotifydemo.h +++ b/examples/opiecore/onotifydemo/onotifydemo.h | |||
@@ -10,20 +10,21 @@ class DemoApp : public Opie::Core::OApplication | |||
10 | { | 10 | { |
11 | Q_OBJECT | 11 | Q_OBJECT |
12 | public: | 12 | public: |
13 | DemoApp( int argc, char** argv ); | 13 | DemoApp( int argc, char** argv ); |
14 | 14 | ||
15 | public: | 15 | public: |
16 | void addTrigger( bool multi = false ); | 16 | void addTrigger( bool multi = false ); |
17 | public slots: | 17 | public slots: |
18 | void modifierClicked( int modifier ); | 18 | void modifierClicked( int modifier ); |
19 | void addSingle(); | 19 | void addSingle(); |
20 | void addMulti(); | 20 | void addMulti(); |
21 | void delTrigger(); | 21 | void delTrigger(); |
22 | void trigger(); | 22 | void unnamedTrigger(); |
23 | void namedTrigger( const QString& name ); | ||
23 | 24 | ||
24 | private: | 25 | private: |
25 | Opie::Ui::OListView* l; | 26 | Opie::Ui::OListView* l; |
26 | QButtonGroup* g1; | 27 | QButtonGroup* g1; |
27 | QButtonGroup* g2; | 28 | QButtonGroup* g2; |
28 | Opie::Core::OFileNotificationType m; | 29 | Opie::Core::OFileNotificationType m; |
29 | }; | 30 | }; |
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 | |||
@@ -84,35 +84,35 @@ int OFileNotification::watch( const QString& path, bool sshot, OFileNotification | |||
84 | struct stat s; | 84 | struct stat s; |
85 | if ( ::stat( (const char*) path, &s ) == -1 ) | 85 | if ( ::stat( (const char*) path, &s ) == -1 ) |
86 | { | 86 | { |
87 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); | 87 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); |
88 | return -1; | 88 | return -1; |
89 | } | 89 | } |
90 | if ( !S_ISREG( s.st_mode ) ) | 90 | if ( !S_ISREG( s.st_mode ) ) |
91 | { | 91 | { |
92 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, "not a regular file" ); | 92 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, "not a regular file" ); |
93 | return -1; | 93 | return -1; |
94 | } | 94 | } |
95 | 95 | ||
96 | if ( notification_list.isEmpty() ) | ||
97 | { | ||
98 | OFileNotification::registerEventHandler(); | ||
99 | } | ||
100 | |||
101 | return startWatching( path, sshot, type ); | 96 | return startWatching( path, sshot, type ); |
102 | } | 97 | } |
103 | 98 | ||
104 | 99 | ||
105 | int OFileNotification::startWatching( const QString& path, bool sshot, OFileNotificationType type ) | 100 | int OFileNotification::startWatching( const QString& path, bool sshot, OFileNotificationType type ) |
106 | { | 101 | { |
102 | if ( notification_list.isEmpty() ) | ||
103 | { | ||
104 | OFileNotification::registerEventHandler(); | ||
105 | } | ||
106 | |||
107 | struct inotify_watch_request iwr; | 107 | struct inotify_watch_request iwr; |
108 | ::memset( &iwr, 0, sizeof iwr ); | 108 | ::memset( &iwr, 0, sizeof iwr ); |
109 | iwr.name = const_cast<char*>( (const char*) path ); | 109 | iwr.name = const_cast<char*>( (const char*) path ); |
110 | iwr.mask = type; | 110 | iwr.mask = type; |
111 | 111 | ||
112 | _wd = ::ioctl( OFileNotification::_fd, INOTIFY_WATCH, &iwr ); | 112 | _wd = ::ioctl( OFileNotification::_fd, INOTIFY_WATCH, &iwr ); |
113 | 113 | ||
114 | if ( _wd < 0 ) | 114 | if ( _wd < 0 ) |
115 | { | 115 | { |
116 | qWarning( "OFileNotification::watch(): inotify can't watch '%s': %s.", (const char*) path, strerror( errno ) ); | 116 | qWarning( "OFileNotification::watch(): inotify can't watch '%s': %s.", (const char*) path, strerror( errno ) ); |
117 | return -1; | 117 | return -1; |
118 | } | 118 | } |
@@ -246,18 +246,33 @@ ODirNotification::ODirNotification( QObject* parent, const char* name ) | |||
246 | } | 246 | } |
247 | 247 | ||
248 | 248 | ||
249 | ODirNotification::~ODirNotification() | 249 | ODirNotification::~ODirNotification() |
250 | { | 250 | { |
251 | qDebug( "ODirNotification::~ODirNotification()" ); | 251 | qDebug( "ODirNotification::~ODirNotification()" ); |
252 | } | 252 | } |
253 | 253 | ||
254 | 254 | ||
255 | int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) | 255 | int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) |
256 | { | 256 | { |
257 | qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, type, recurse ); | 257 | qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, type, recurse ); |
258 | return 0; | ||
259 | } | ||
260 | 258 | ||
259 | if ( recurse == 0 ) | ||
260 | { | ||
261 | OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); | ||
262 | int result = fn->startWatching( path, sshot, type ); | ||
263 | if ( result != -1 ) | ||
264 | { | ||
265 | connect( fn, SIGNAL( triggered( const QString& ) ), this, SIGNAL( triggered( const QString& ) ) ); | ||
266 | return result; | ||
267 | } | ||
268 | } | ||
269 | else | ||
270 | { | ||
271 | qDebug( "ODirNotification::watch(), recursion not yet implemented... :)" ); | ||
272 | return -1; | ||
273 | } | ||
261 | } | 274 | } |
262 | 275 | ||
263 | } \ No newline at end of file | 276 | } // namespace Ui |
277 | |||
278 | } // namespace Opie | ||
diff --git a/libopie2/opiecore/ofilenotify.h b/libopie2/opiecore/ofilenotify.h index 41ba84d..3eb917e 100644 --- a/libopie2/opiecore/ofilenotify.h +++ b/libopie2/opiecore/ofilenotify.h | |||
@@ -120,31 +120,31 @@ class OFileNotification : public QObject | |||
120 | * bother with a timerEvent or to create a local QTimer object. | 120 | * bother with a timerEvent or to create a local QTimer object. |
121 | * | 121 | * |
122 | * Example: | 122 | * Example: |
123 | * <pre> | 123 | * <pre> |
124 | * | 124 | * |
125 | * #include <opie2/oapplication.h> | 125 | * #include <opie2/oapplication.h> |
126 | * #include <opie2/ofilenotify.h> | 126 | * #include <opie2/ofilenotify.h> |
127 | * using namespace Opie::Core; | 127 | * using namespace Opie::Core; |
128 | * | 128 | * |
129 | * int main( int argc, char **argv ) | 129 | * int main( int argc, char **argv ) |
130 | * { | 130 | * { |
131 | * OApplication a( argc, argv, "File Notification Example" ); | 131 | * OApplication a( argc, argv, "File Notification Example" ); |
132 | * OFileNotification::singleShot( "/tmp/quit", &a, SLOT(quit()), Create ); | 132 | * OFileNotification::singleShot( "/tmp/quit", &a, SLOT(quit()), Access ); |
133 | * ... // create and show your widgets | 133 | * ... // create and show your widgets |
134 | * return a.exec(); | 134 | * return a.exec(); |
135 | * } | 135 | * } |
136 | * </pre> | 136 | * </pre> |
137 | * | 137 | * |
138 | * This sample program automatically terminates when the file "/tmp/quit" has been created. | 138 | * This sample program automatically terminates when the file "/tmp/quit" has been accessed. |
139 | * | 139 | * |
140 | * | 140 | * |
141 | * The @a receiver is the receiving object and the @a member is the slot. | 141 | * The @a receiver is the receiving object and the @a member is the slot. |
142 | **/ | 142 | **/ |
143 | static bool singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify ); | 143 | static bool singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify ); |
144 | /** | 144 | /** |
145 | * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once. | 145 | * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once. |
146 | * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then. | 146 | * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then. |
147 | **/ | 147 | **/ |
148 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); | 148 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); |
149 | /** | 149 | /** |
150 | * Stop watching for file events. | 150 | * Stop watching for file events. |
@@ -213,20 +213,26 @@ class ODirNotification : public QObject | |||
213 | { | 213 | { |
214 | Q_OBJECT | 214 | Q_OBJECT |
215 | 215 | ||
216 | public: | 216 | public: |
217 | ODirNotification( QObject* parent = 0, const char* name = 0 ); | 217 | ODirNotification( QObject* parent = 0, const char* name = 0 ); |
218 | ~ODirNotification(); | 218 | ~ODirNotification(); |
219 | /** | 219 | /** |
220 | * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree, | 220 | * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree, |
221 | * use 0 for no recursion and -1 for unlimited recursion. | 221 | * use 0 for no recursion and -1 for unlimited recursion. |
222 | * Set @a sshot to True if you want to be notified only once. | 222 | * Set @a sshot to True if you want to be notified only once. |
223 | **/ | 223 | **/ |
224 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 ); | 224 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 ); |
225 | |||
226 | signals: | ||
227 | /** | ||
228 | * This signal is emitted if an event happens of the specified type happens to the directory being watched. | ||
229 | **/ | ||
230 | void triggered( const QString& name ); | ||
225 | }; | 231 | }; |
226 | 232 | ||
227 | 233 | ||
228 | } | 234 | } |
229 | } | 235 | } |
230 | 236 | ||
231 | #endif | 237 | #endif |
232 | 238 | ||