summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/ofilenotify.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/libopie2/opiecore/ofilenotify.cpp b/libopie2/opiecore/ofilenotify.cpp
index 270570e..5f2a1cc 100644
--- a/libopie2/opiecore/ofilenotify.cpp
+++ b/libopie2/opiecore/ofilenotify.cpp
@@ -50,65 +50,65 @@ static QIntDict<OFileNotification> notification_list;
50 50
51namespace Opie { 51namespace Opie {
52namespace Core { 52namespace Core {
53 53
54OFileNotification::OFileNotification( QObject* parent, const char* name ) 54OFileNotification::OFileNotification( QObject* parent, const char* name )
55 :QObject( parent, name ), _active( false ) 55 :QObject( parent, name ), _active( false )
56{ 56{
57 qDebug( "OFileNotification::OFileNotification()" ); 57 qDebug( "OFileNotification::OFileNotification()" );
58} 58}
59 59
60 60
61OFileNotification::~OFileNotification() 61OFileNotification::~OFileNotification()
62{ 62{
63 qDebug( "OFileNotification::~OFileNotification()" ); 63 qDebug( "OFileNotification::~OFileNotification()" );
64} 64}
65 65
66 66
67bool OFileNotification::isActive() const 67bool OFileNotification::isActive() const
68{ 68{
69 return _active; 69 return _active;
70} 70}
71 71
72 72
73int OFileNotification::start( const QString& path, bool sshot, OFileNotificationType type ) 73int OFileNotification::start( const QString& path, bool sshot, OFileNotificationType type )
74{ 74{
75 _path = QString::null; 75 _path = QString::null;
76 _fd = 0; 76 _fd = 0;
77 if ( _active ) stop(); 77 if ( _active ) stop();
78 QString dirpath; 78 QString dirpath;
79 79
80 // check if path exists and whether it is a file or a directory, if it exists at all 80 // check if path exists and whether it is a file or a directory, if it exists at all
81 int result = ::stat( (const char*) path, &_stat ); 81 int result = ::stat( (const char*) path, &_stat );
82 if ( result == -1 ) 82 if ( !(type & Create) && result == -1 )
83 { 83 {
84 qWarning( "OFileNotification::start(): Can't stat '%s': %s.", (const char*) path, strerror( errno ) ); 84 qWarning( "OFileNotification::start(): Can't stat '%s': %s.", (const char*) path, strerror( errno ) );
85 return -1; 85 return -1;
86 } 86 }
87 87
88 // if it is not a directory, we need to find out in which directory the file is 88 // if it is not a directory, we need to find out in which directory the file is
89 bool isDirectory = S_ISDIR( _stat.st_mode ); 89 bool isDirectory = S_ISDIR( _stat.st_mode );
90 if ( !isDirectory ) 90 if ( !isDirectory )
91 { 91 {
92 int slashpos; 92 int slashpos;
93 slashpos = path.findRev( '/' ); 93 slashpos = path.findRev( '/' );
94 if ( slashpos > 0 ) 94 if ( slashpos > 0 )
95 { 95 {
96 _path = path; 96 _path = path;
97 dirpath = path.left( slashpos ); 97 dirpath = path.left( slashpos );
98 } 98 }
99 } 99 }
100 else /* isDirectory */ 100 else /* isDirectory */
101 { 101 {
102 qWarning( "FIXME FIXME FIXME = Directory Notification Not Yet Implemented!" ); 102 qWarning( "FIXME FIXME FIXME = Directory Notification Not Yet Implemented!" );
103 _path = path; 103 _path = path;
104 dirpath = path; 104 dirpath = path;
105 assert( 0 ); 105 assert( 0 );
106 } 106 }
107 107
108 int fd = ::open( (const char*) dirpath, O_RDONLY ); 108 int fd = ::open( (const char*) dirpath, O_RDONLY );
109 if ( fd != -1 ) 109 if ( fd != -1 )
110 { 110 {
111 if ( notification_list.isEmpty() ) 111 if ( notification_list.isEmpty() )
112 { 112 {
113 OFileNotification::registerSignalHandler(); 113 OFileNotification::registerSignalHandler();
114 } 114 }
@@ -173,69 +173,76 @@ QString OFileNotification::path() const
173{ 173{
174 return _path; 174 return _path;
175} 175}
176 176
177 177
178int OFileNotification::fileno() const 178int OFileNotification::fileno() const
179{ 179{
180 return _fd; 180 return _fd;
181} 181}
182 182
183 183
184bool OFileNotification::activate() 184bool OFileNotification::activate()
185{ 185{
186 if ( hasChanged() ) 186 if ( hasChanged() )
187 { 187 {
188 emit triggered(); 188 emit triggered();
189 _signal.activate(); 189 _signal.activate();
190 return true; 190 return true;
191 } 191 }
192 else 192 else
193 return false; 193 return false;
194} 194}
195 195
196 196
197bool OFileNotification::hasChanged() 197bool OFileNotification::hasChanged()
198{ 198{
199 bool c = false; 199 bool c = false;
200 200
201 struct stat newstat; 201 struct stat newstat;
202 ::memset( &newstat, 0, sizeof newstat ); 202 ::memset( &newstat, 0, sizeof newstat );
203 int result = ::stat( _path, &newstat ); // may fail if file has been renamed or deleted. that doesn't matter :) 203 int result = ::stat( _path, &newstat ); // may fail if file has been renamed or deleted. that doesn't matter :)
204 204
205 qDebug( "result of newstat call is %d (%s=%d)", result, strerror( errno ), errno ); 205 qDebug( "result of newstat call is %d (%s=%d)", result, result == -1 ? strerror( errno ) : "success", errno );
206 qDebug( "stat.atime = %0lx, newstat.atime = %0lx", (long)_stat.st_atime, (long)newstat.st_atime ); 206 qDebug( "stat.atime = %0lx, newstat.atime = %0lx", (long)_stat.st_atime, (long)newstat.st_atime );
207 qDebug( "stat.mtime = %0lx, newstat.mtime = %0lx", (long)_stat.st_mtime, (long)newstat.st_mtime ); 207 qDebug( "stat.mtime = %0lx, newstat.mtime = %0lx", (long)_stat.st_mtime, (long)newstat.st_mtime );
208 qDebug( "stat.ctime = %0lx, newstat.ctime = %0lx", (long)_stat.st_ctime, (long)newstat.st_ctime ); 208 qDebug( "stat.ctime = %0lx, newstat.ctime = %0lx", (long)_stat.st_ctime, (long)newstat.st_ctime );
209 209
210 if ( !c && (_type & Create) &&
211 (long)_stat.st_atime == 0 && (long)_stat.st_mtime == 0 && (long)_stat.st_ctime == 0 &&
212 (long)newstat.st_atime > 0 && (long)newstat.st_mtime > 0 && (long)newstat.st_ctime > 0)
213 {
214 qDebug( "OFileNotification::hasChanged(): file has been created" );
215 c = true;
216 }
210 if ( !c && (_type & (Delete|Rename)) && (long)newstat.st_atime == 0 && (long)newstat.st_mtime == 0 && (long)newstat.st_ctime == 0) 217 if ( !c && (_type & (Delete|Rename)) && (long)newstat.st_atime == 0 && (long)newstat.st_mtime == 0 && (long)newstat.st_ctime == 0)
211 { 218 {
212 qDebug( "OFileNotification::hasChanged(): file has been deleted or renamed" ); 219 qDebug( "OFileNotification::hasChanged(): file has been deleted or renamed" );
213 c = true; 220 c = true;
214 } 221 }
215 if ( !c && (_type & Access) && (long)_stat.st_atime < (long)newstat.st_atime ) 222 if ( !c && (_type & Access) && (long)_stat.st_atime < (long)newstat.st_atime )
216 { 223 {
217 qDebug( "OFileNotification::hasChanged(): atime changed" ); 224 qDebug( "OFileNotification::hasChanged(): atime changed" );
218 c = true; 225 c = true;
219 } 226 }
220 if ( !c && (_type & Modify) && (long)_stat.st_mtime < (long)newstat.st_mtime ) 227 if ( !c && (_type & Modify) && (long)_stat.st_mtime < (long)newstat.st_mtime )
221 { 228 {
222 qDebug( "OFileNotification::hasChanged(): mtime changed" ); 229 qDebug( "OFileNotification::hasChanged(): mtime changed" );
223 c = true; 230 c = true;
224 } 231 }
225 if ( !c && (_type & Attrib) && (long)_stat.st_ctime < (long)newstat.st_ctime ) 232 if ( !c && (_type & Attrib) && (long)_stat.st_ctime < (long)newstat.st_ctime )
226 { 233 {
227 qDebug( "OFileNotification::hasChanged(): ctime changed" ); 234 qDebug( "OFileNotification::hasChanged(): ctime changed" );
228 c = true; 235 c = true;
229 } 236 }
230 237
231 return c; 238 return c;
232} 239}
233 240
234 241
235void OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) 242void OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type )
236{ 243{
237 OFileNotification* ofn = new OFileNotification(); 244 OFileNotification* ofn = new OFileNotification();
238 ofn->_signal.connect( receiver, member ); 245 ofn->_signal.connect( receiver, member );
239 ofn->start( path, true, type ); 246 ofn->start( path, true, type );
240} 247}
241 248