summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2005-05-10 13:30:51 (UTC)
committer mickeyl <mickeyl>2005-05-10 13:30:51 (UTC)
commite31f22952f47aeb54b206349f1e469704a6a6e8f (patch) (unidiff)
tree2aa06bf1ebd9850b1e987d1dcc94794699a0c9fe
parent9bcf6a5112d31ffdc196ebcd22a584c68f9f7b1e (diff)
downloadopie-e31f22952f47aeb54b206349f1e469704a6a6e8f.zip
opie-e31f22952f47aeb54b206349f1e469704a6a6e8f.tar.gz
opie-e31f22952f47aeb54b206349f1e469704a6a6e8f.tar.bz2
add foundation for a much more intuitive API for file notifications
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--examples/opiecore/onotifytest/.cvsignore6
-rw-r--r--examples/opiecore/onotifytest/main.cpp59
-rw-r--r--examples/opiecore/onotifytest/onotifytest.pro16
-rw-r--r--examples/opiecore/opiecore.pro2
-rw-r--r--libopie2/opiecore/ofilenotify.cpp58
-rw-r--r--libopie2/opiecore/ofilenotify.h37
6 files changed, 176 insertions, 2 deletions
diff --git a/examples/opiecore/onotifytest/.cvsignore b/examples/opiecore/onotifytest/.cvsignore
new file mode 100644
index 0000000..8f7300c
--- a/dev/null
+++ b/examples/opiecore/onotifytest/.cvsignore
@@ -0,0 +1,6 @@
1Makefile*
2moc*
3*moc
4*.o
5~*
6
diff --git a/examples/opiecore/onotifytest/main.cpp b/examples/opiecore/onotifytest/main.cpp
new file mode 100644
index 0000000..467ebc9
--- a/dev/null
+++ b/examples/opiecore/onotifytest/main.cpp
@@ -0,0 +1,59 @@
1// (C) Michael 'Mickey' Lauer <mickey@Vanille.de>
2// LICENSE = "GPLv2"
3
4/* OPIE */
5#include <opie2/odebug.h>
6#include <opie2/oapplication.h>
7#include <opie2/ofilenotify.h>
8using namespace Opie::Core;
9
10/* QT */
11#include <qpushbutton.h>
12#include <qtextstream.h>
13
14class App : public OApplication
15{
16
17public:
18OFile* tmpfoo;
19
20App( int argc, char** argv ) : OApplication( argc, argv, "libopie2 notify test" )
21{
22 odebug << "App()" << oendl;
23
24 tmpfoo = new OFile( "/tmp/foo" );
25 if ( tmpfoo->open( IO_ReadWrite ) )
26 {
27 QTextStream stream( tmpfoo );
28 stream << "This is my content";
29 }
30
31 QObject::connect( tmpfoo, SIGNAL(accessed(const QString&)), this, SLOT(quit()) );
32 QObject::connect( tmpfoo, SIGNAL(closed(const QString&,bool)), this, SLOT(quit()) );
33}
34
35~App()
36{
37 odebug << "~App()" << oendl;
38
39 delete tmpfoo;
40}
41
42};
43
44int main( int argc, char** argv )
45{
46 App* app = new App( argc, argv );
47 QPushButton* b = new QPushButton( "Click me to close", 0 );
48 QObject::connect( b, SIGNAL(clicked()), app, SLOT(quit()) );
49 b->resize( 200, 200 );
50 b->move( 150, 150 );
51 b->show();
52 app->setMainWidget( b );
53 app->exec();
54 delete app;
55
56 return 0;
57
58}
59
diff --git a/examples/opiecore/onotifytest/onotifytest.pro b/examples/opiecore/onotifytest/onotifytest.pro
new file mode 100644
index 0000000..4e0faec
--- a/dev/null
+++ b/examples/opiecore/onotifytest/onotifytest.pro
@@ -0,0 +1,16 @@
1TEMPLATE = app
2CONFIG = qt warn_on
3SOURCES = main.cpp
4INCLUDEPATH += $(OPIEDIR)/include
5DEPENDPATH += $(OPIEDIR)/include
6LIBS += -lopiecore2
7TARGET = onotifytest
8
9!contains( platform, x11 ) {
10 include( $(OPIEDIR)/include.pro )
11}
12
13contains( platform, x11 ) {
14 LIBS += -L$(OPIEDIR)/lib -Wl,-rpath,$(OPIEDIR)/lib
15}
16
diff --git a/examples/opiecore/opiecore.pro b/examples/opiecore/opiecore.pro
index 1f86a40..3550055 100644
--- a/examples/opiecore/opiecore.pro
+++ b/examples/opiecore/opiecore.pro
@@ -1,2 +1,2 @@
1TEMPLATE = subdirs 1TEMPLATE = subdirs
2unix:SUBDIRS = odebugdemo oconfigdemo oglobalsettingsdemo onotifydemo oprocessdemo oplugins oinputsystemdemo 2unix:SUBDIRS = odebugdemo oconfigdemo oglobalsettingsdemo onotifydemo onotifytest oprocessdemo oplugins oinputsystemdemo
diff --git a/libopie2/opiecore/ofilenotify.cpp b/libopie2/opiecore/ofilenotify.cpp
index 4264327..36ec6bf 100644
--- a/libopie2/opiecore/ofilenotify.cpp
+++ b/libopie2/opiecore/ofilenotify.cpp
@@ -46,32 +46,88 @@ using namespace Opie::Core;
46#include <assert.h> 46#include <assert.h>
47#include <string.h> 47#include <string.h>
48#include <errno.h> 48#include <errno.h>
49#include <unistd.h> 49#include <unistd.h>
50 50
51static QIntDict<OFileNotification> notification_list; 51static QIntDict<OFileNotification> notification_list;
52 52
53QSocketNotifier* OFileNotification::_sn; 53QSocketNotifier* OFileNotification::_sn;
54int OFileNotification::_fd = -1; 54int OFileNotification::_fd = -1;
55 55
56#define INOTIFY_DEVICE "/dev/inotify" 56#define INOTIFY_DEVICE "/dev/inotify"
57 57
58namespace Opie { 58namespace Opie {
59namespace Core { 59namespace Core {
60 60
61//================================================================================================= 61//=================================================================================================
62// OFile
63//=================================================================================================
64
65OFile::OFile() : QObject( 0, 0 ), QFile()
66{
67 qDebug( "OFile()" );
68}
69
70OFile::OFile( const QString& name ) : QObject( 0, 0 ), QFile( name )
71{
72 qDebug( "OFile()" );
73}
74
75OFile::~OFile()
76{
77 qDebug( "~OFile()" );
78}
79
80void OFile::connectNotify( const char *signal )
81{
82 QString s = normalizeSignalSlot( signal+1 );
83 qDebug( "OFile::connectNotify() signal = '%s'", (const char*) s );
84
85 if ( s.startsWith( "accessed" ) )
86
87
88
89
90
91
92
93 QObject::connectNotify( signal );
94
95/*
96 void accessed( const QString& );
97 void modified( const QString& );
98 void attributed( const QString& );
99 void closed( const QString&, bool );
100 void opened( const QString& );
101 void deleted( const QString& );
102 void unmounted( const QString& );
103*/
104
105}
106
107void OFile::disconnectNotify( const char* signal )
108{
109 qDebug( "OFile::disconnectNotify() signal = '%s'", signal );
110 QObject::disconnectNotify( signal );
111}
112
113int OFile::startWatch( int mode )
114{
115}
116
117//=================================================================================================
62// OFileNotificationEvent 118// OFileNotificationEvent
63//================================================================================================= 119//=================================================================================================
64OFileNotificationEvent::OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ) 120OFileNotificationEvent::OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name )
65 :_parent( parent ), _wd( wd ), _mask( mask ), _cookie( cookie ), _name( name ) 121 :_parent( parent ), _wd( wd ), _mask( mask ), _cookie( cookie ), _name( name )
66{ 122{
67 qDebug( "OFileNotificationEvent()" ); 123 qDebug( "OFileNotificationEvent()" );
68} 124}
69 125
70 126
71OFileNotificationEvent::~OFileNotificationEvent() 127OFileNotificationEvent::~OFileNotificationEvent()
72{ 128{
73 qDebug( "~OFileNotificationEvent()" ); 129 qDebug( "~OFileNotificationEvent()" );
74} 130}
75 131
76//================================================================================================= 132//=================================================================================================
77// OFileNotification 133// OFileNotification
@@ -206,33 +262,33 @@ bool OFileNotification::activate( const OFileNotificationEvent* e )
206} 262}
207 263
208 264
209bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) 265bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type )
210{ 266{
211 OFileNotification* ofn = new OFileNotification(); 267 OFileNotification* ofn = new OFileNotification();
212 ofn->_signal.connect( receiver, member ); 268 ofn->_signal.connect( receiver, member );
213 return ofn->watch( path, true, type ) != -1; 269 return ofn->watch( path, true, type ) != -1;
214} 270}
215 271
216 272
217void OFileNotification::inotifyEventHandler() 273void OFileNotification::inotifyEventHandler()
218{ 274{
219 qDebug( "OFileNotification::inotifyEventHandler(): reached." ); 275 qDebug( "OFileNotification::inotifyEventHandler(): reached." );
220 276
221 char buffer[16384]; 277 char buffer[16384];
222 size_t buffer_i; 278 ssize_t buffer_i;
223 struct inotify_event *pevent, *event; 279 struct inotify_event *pevent, *event;
224 ssize_t r; 280 ssize_t r;
225 size_t event_size; 281 size_t event_size;
226 int count = 0; 282 int count = 0;
227 283
228 r = ::read(_fd, buffer, 16384); 284 r = ::read(_fd, buffer, 16384);
229 285
230 if ( r <= 0 ) 286 if ( r <= 0 )
231 return; 287 return;
232 288
233 buffer_i = 0; 289 buffer_i = 0;
234 while ( buffer_i < r ) 290 while ( buffer_i < r )
235 { 291 {
236 pevent = (struct inotify_event *)&buffer[buffer_i]; 292 pevent = (struct inotify_event *)&buffer[buffer_i];
237 event_size = sizeof(struct inotify_event) + pevent->len; 293 event_size = sizeof(struct inotify_event) + pevent->len;
238 OFileNotificationEvent* e = new OFileNotificationEvent( notification_list[ pevent->wd ], pevent->wd, pevent->mask, 294 OFileNotificationEvent* e = new OFileNotificationEvent( notification_list[ pevent->wd ], pevent->wd, pevent->mask,
diff --git a/libopie2/opiecore/ofilenotify.h b/libopie2/opiecore/ofilenotify.h
index 5bbf421..05343b9 100644
--- a/libopie2/opiecore/ofilenotify.h
+++ b/libopie2/opiecore/ofilenotify.h
@@ -25,36 +25,73 @@ _;:,     .>    :=|. This program is free software; you can
25 Inc., 59 Temple Place - Suite 330, 25 Inc., 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. 26 Boston, MA 02111-1307, USA.
27*/ 27*/
28 28
29#ifndef OFILENOTIFY_H 29#ifndef OFILENOTIFY_H
30#define OFILENOTIFY_H 30#define OFILENOTIFY_H
31#if defined (__GNUC__) && (__GNUC__ < 3) 31#if defined (__GNUC__) && (__GNUC__ < 3)
32#define _GNU_SOURCE 32#define _GNU_SOURCE
33#endif 33#endif
34 34
35#include "linux_inotify.h" 35#include "linux_inotify.h"
36 36
37/* QT */ 37/* QT */
38#include <qsocketnotifier.h> 38#include <qsocketnotifier.h>
39#include <qsignal.h> 39#include <qsignal.h>
40#include <qstring.h> 40#include <qstring.h>
41#include <qobject.h>
42#include <qfile.h>
41 43
42namespace Opie { 44namespace Opie {
43namespace Core { 45namespace Core {
44 46
47class OFile : public QObject, public QFile
48{
49 Q_OBJECT
50
51 public:
52 OFile();
53 OFile( const QString & name );
54 virtual ~OFile();
55
56 protected:
57 virtual void connectNotify( const char* signal );
58 virtual void disconnectNotify( const char* signal );
59
60 private:
61 int startWatch( int mode );
62
63 signals:
64 void accessed( const QString& );
65 void modified( const QString& );
66 void attributed( const QString& );
67 void closed( const QString&, bool );
68 void opened( const QString& );
69 void deleted( const QString& );
70 void unmounted( const QString& );
71};
72
73/*
74 void movedTo( const QString&, const QString& );
75 void movedFrom( const QString&, const QString& );
76 void deletedSubdir( const QString&, const QString& );
77 void deletedFile( const QString&, const QString& );
78 void createdSubdir( const QString&, const QString& );
79 void createdFile( const QString&, const QString& );
80*/
81
45class OFileNotificationEvent; 82class OFileNotificationEvent;
46 83
47/*====================================================================================== 84/*======================================================================================
48 * OFileNotificationType 85 * OFileNotificationType
49 *======================================================================================*/ 86 *======================================================================================*/
50 87
51/** 88/**
52 * @brief An enumerate for the different types of file notifications 89 * @brief An enumerate for the different types of file notifications
53 * 90 *
54 * This enumerate provides a means to specify the type of events that you are interest in. 91 * This enumerate provides a means to specify the type of events that you are interest in.
55 * Valid values are: 92 * Valid values are:
56 * <ul> 93 * <ul>
57 * <li>Access: The file was accessed (read) 94 * <li>Access: The file was accessed (read)
58 * <li>Modify The file was modified (write,truncate) 95 * <li>Modify The file was modified (write,truncate)
59 * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp) 96 * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp)
60 * <li>CloseWrite = Writable file was closed 97 * <li>CloseWrite = Writable file was closed