-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 | |||
@@ -8,12 +8,13 @@ | |||
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> |
@@ -86,21 +87,53 @@ DemoApp::DemoApp( int argc, char** argv ) : OApplication( argc, argv, "libopie2 | |||
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 | } |
@@ -121,15 +154,20 @@ DemoApp::DemoApp( int argc, char** argv ) : OApplication( argc, argv, "libopie2 | |||
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(); |
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 | |||
@@ -16,13 +16,14 @@ 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; |
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 | |||
@@ -90,23 +90,23 @@ int OFileNotification::watch( const QString& path, bool sshot, OFileNotification | |||
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 ); |
@@ -252,12 +252,27 @@ 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 | |||
@@ -126,19 +126,19 @@ class OFileNotification : public QObject | |||
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 | /** |
@@ -219,12 +219,18 @@ class ODirNotification : public QObject | |||
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 | ||