diff options
author | Shane Kearns <shane.kearns@sosco.com> | 2009-08-18 07:30:46 (GMT) |
---|---|---|
committer | Shane Kearns <shane.kearns@sosco.com> | 2009-08-18 07:44:56 (GMT) |
commit | 547e737c4fc01fb33cb2eae8d4662b367fccb097 (patch) | |
tree | 8f42e77b65eae93ac481aa452db184cb3e0de34e /src/corelib/io | |
parent | 0b2ee937495f2746816676d094be42b674eed900 (diff) | |
download | Qt-547e737c4fc01fb33cb2eae8d4662b367fccb097.zip Qt-547e737c4fc01fb33cb2eae8d4662b367fccb097.tar.gz Qt-547e737c4fc01fb33cb2eae8d4662b367fccb097.tar.bz2 |
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
Diffstat (limited to 'src/corelib/io')
-rw-r--r-- | src/corelib/io/qfilesystemwatcher_symbian.cpp | 29 | ||||
-rw-r--r-- | 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; |