From cdd09cc4ebab4e95f7c1286f09cef17a2c9cedf4 Mon Sep 17 00:00:00 2001
From: Murray Read <ext-murray.2.read@nokia.com>
Date: Mon, 13 Feb 2012 16:33:22 +0000
Subject: Checking for directory exists in failed QDir::mkpath on Symbian
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

QDir::mkpath should return true if the directory already exists. In the
new native Symbian implementation, RFs returns KErrPermission denied
when you try to access some data caged directories such as C:\private.
This was being interpreted as failure, as the code expected
KErrAlreadyExists for the case where the directory exists.

In this circumstance we now check if the directory already exists.

Task-number: ou1cimx1#974477
Change-Id: Ie476219bc963c23d3c7e1773ebded8ecf137fd3c
Reviewed-by: Pasi Pentikäinen <ext-pasi.a.pentikainen@nokia.com>
---
 src/corelib/io/qfilesystemengine_symbian.cpp | 11 +++++++++--
 tests/auto/qdir/tst_qdir.cpp                 |  6 ++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/corelib/io/qfilesystemengine_symbian.cpp b/src/corelib/io/qfilesystemengine_symbian.cpp
index 9eabdc1..edbe945 100644
--- a/src/corelib/io/qfilesystemengine_symbian.cpp
+++ b/src/corelib/io/qfilesystemengine_symbian.cpp
@@ -237,12 +237,19 @@ bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool crea
     if (!abspath.endsWith(QLatin1Char('\\')))
         abspath.append(QLatin1Char('\\'));
     TInt r;
+    TPtrC symPath(qt_QString2TPtrC(abspath));
     if (createParents)
-        r = qt_s60GetRFs().MkDirAll(qt_QString2TPtrC(abspath));
+        r = qt_s60GetRFs().MkDirAll(symPath);
     else
-        r = qt_s60GetRFs().MkDir(qt_QString2TPtrC(abspath));
+        r = qt_s60GetRFs().MkDir(symPath);
     if (createParents && r == KErrAlreadyExists)
         return true; //# Qt5 - QDir::mkdir returns false for existing dir, QDir::mkpath returns true (should be made consistent in Qt 5)
+    if (createParents && r == KErrPermissionDenied) {
+        // check for already exists, which is not returned from RFs when it denies permission
+        TEntry entry;
+        if (qt_s60GetRFs().Entry(symPath, entry) == KErrNone)
+            r = KErrNone;
+    }
     return (r == KErrNone);
 }
 
diff --git a/tests/auto/qdir/tst_qdir.cpp b/tests/auto/qdir/tst_qdir.cpp
index c507037..56862a8 100644
--- a/tests/auto/qdir/tst_qdir.cpp
+++ b/tests/auto/qdir/tst_qdir.cpp
@@ -299,6 +299,12 @@ void tst_QDir::mkdir_data()
     QDir dir;
     for (int i = 0; i < dirs.count(); ++i)
         dir.rmpath(dirs.at(i));
+
+#ifdef Q_OS_SYMBIAN
+    // testing for directories that exist, but which we cannot necessarily create
+    QTest::newRow("symbian0") << QString::fromLatin1("C:/private") << true;
+    QTest::newRow("symbian1") << QString::fromLatin1("C:/private/E0340002") << true;
+#endif
 }
 
 void tst_QDir::mkdir()
-- 
cgit v0.12