From 547e737c4fc01fb33cb2eae8d4662b367fccb097 Mon Sep 17 00:00:00 2001 From: Shane Kearns Date: Tue, 18 Aug 2009 09:30:46 +0200 Subject: Fixes to Symbian native engine for QFileSystemWatcher. The wrong version of cancel was used, resulting in all filesystem notifications being cancelled when one path was removed from the engine. For directory notifications, changed ENotifyAll to ENotifyEntry to reduce the spurious directory changed notifications which come from file modifications within that directory. On Symbian OS, opening a file for overwrite (truncate mode in Qt terms) will cause a directory change notification, the OS considers it to be the same type of event as creating a new file for the first time. Other platforms presumably do not have this behaviour otherwise the auto test would fail there as well. Reviewed-by: miikka heikkinen --- src/corelib/io/qfilesystemwatcher_symbian.cpp | 29 ++++++++++++++++++--------- src/corelib/io/qfilesystemwatcher_symbian_p.h | 4 ++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/corelib/io/qfilesystemwatcher_symbian.cpp b/src/corelib/io/qfilesystemwatcher_symbian.cpp index 49a5f34..412372a 100644 --- a/src/corelib/io/qfilesystemwatcher_symbian.cpp +++ b/src/corelib/io/qfilesystemwatcher_symbian.cpp @@ -52,20 +52,25 @@ QT_BEGIN_NAMESPACE CNotifyChangeEvent* CNotifyChangeEvent::New(RFs &fs, const TDesC& file, - QSymbianFileSystemWatcherEngine* e) + QSymbianFileSystemWatcherEngine* e, bool aIsDir) { - CNotifyChangeEvent* self = new CNotifyChangeEvent(fs, file, e); + CNotifyChangeEvent* self = new CNotifyChangeEvent(fs, file, e, aIsDir); return self; } CNotifyChangeEvent::CNotifyChangeEvent(RFs &fs, const TDesC& file, - QSymbianFileSystemWatcherEngine* e, TInt aPriority) : + QSymbianFileSystemWatcherEngine* e, bool aIsDir, TInt aPriority) : CActive(aPriority), + isDir(aIsDir), fsSession(fs), watchedPath(file), engine(e) { - fsSession.NotifyChange(ENotifyAll, iStatus, file); + if(isDir) { + fsSession.NotifyChange(ENotifyEntry, iStatus, file); + } else { + fsSession.NotifyChange(ENotifyAll, iStatus, file); + } CActiveScheduler::Add(this); SetActive(); } @@ -77,8 +82,12 @@ CNotifyChangeEvent::~CNotifyChangeEvent() void CNotifyChangeEvent::RunL() { - if (iStatus.Int() == KErrNone){ - fsSession.NotifyChange(ENotifyAll, iStatus, watchedPath); + if (iStatus.Int() == KErrNone) { + if(isDir) { + fsSession.NotifyChange(ENotifyEntry, iStatus, watchedPath); + } else { + fsSession.NotifyChange(ENotifyAll, iStatus, watchedPath); + } SetActive(); QT_TRYCATCH_LEAVING(engine->emitPathChanged(this)); } else { @@ -88,7 +97,7 @@ void CNotifyChangeEvent::RunL() void CNotifyChangeEvent::DoCancel() { - fsSession.NotifyChangeCancel(); + fsSession.NotifyChangeCancel(iStatus); } QSymbianFileSystemWatcherEngine::QSymbianFileSystemWatcherEngine() : @@ -132,8 +141,8 @@ QStringList QSymbianFileSystemWatcherEngine::addPaths(const QStringList &paths, // Use absolute filepath as relative paths seem to have some issues. QString filePath = fi.absoluteFilePath(); - if(isDir && filePath.at(filePath.size()-1) != QChar('/')) { - filePath += QChar('/'); + if(isDir && filePath.at(filePath.size()-1) != QChar(L'/')) { + filePath += QChar(L'/'); } currentEvent = NULL; @@ -264,7 +273,7 @@ void QSymbianFileSystemWatcherEngine::addNativeListener(const QString &directory QMutexLocker locker(&mutex); QString nativeDir(QDir::toNativeSeparators(directoryPath)); TPtrC ptr(qt_QString2TPtrC(nativeDir)); - currentEvent = CNotifyChangeEvent::New(fsSession, ptr, this); + currentEvent = CNotifyChangeEvent::New(fsSession, ptr, this, directoryPath.endsWith(QChar(L'/'), Qt::CaseSensitive)); syncCondition.wakeOne(); } diff --git a/src/corelib/io/qfilesystemwatcher_symbian_p.h b/src/corelib/io/qfilesystemwatcher_symbian_p.h index 53b2b13..846541b 100644 --- a/src/corelib/io/qfilesystemwatcher_symbian_p.h +++ b/src/corelib/io/qfilesystemwatcher_symbian_p.h @@ -71,10 +71,10 @@ class CNotifyChangeEvent : public CActive { public: CNotifyChangeEvent(RFs &fsSession, const TDesC& file, QSymbianFileSystemWatcherEngine* engine, - TInt aPriority = EPriorityStandard); + bool aIsDir, TInt aPriority = EPriorityStandard); ~CNotifyChangeEvent(); static CNotifyChangeEvent* New(RFs &fsSession, const TDesC& file, - QSymbianFileSystemWatcherEngine* engine); + QSymbianFileSystemWatcherEngine* engine, bool aIsDir); bool isDir; -- cgit v0.12