summaryrefslogtreecommitdiffstats
path: root/src/corelib/io
diff options
context:
space:
mode:
authorShane Kearns <shane.kearns@sosco.com>2009-08-18 07:30:46 (GMT)
committerShane Kearns <shane.kearns@sosco.com>2009-08-18 07:44:56 (GMT)
commit547e737c4fc01fb33cb2eae8d4662b367fccb097 (patch)
tree8f42e77b65eae93ac481aa452db184cb3e0de34e /src/corelib/io
parent0b2ee937495f2746816676d094be42b674eed900 (diff)
downloadQt-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.cpp29
-rw-r--r--src/corelib/io/qfilesystemwatcher_symbian_p.h4
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;