diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/tests/viewpropertiestest.cpp | 33 | ||||
| -rw-r--r-- | src/views/viewproperties.cpp | 13 |
2 files changed, 23 insertions, 23 deletions
diff --git a/src/tests/viewpropertiestest.cpp b/src/tests/viewpropertiestest.cpp index 1d9e886e1..73a26f289 100644 --- a/src/tests/viewpropertiestest.cpp +++ b/src/tests/viewpropertiestest.cpp @@ -109,45 +109,34 @@ void ViewPropertiesTest::testReadOnlyDirectory() QVERIFY(QFile(localFolder).setPermissions(QFileDevice::ReadOwner)); QScopedPointer<ViewProperties> props(new ViewProperties(testDirUrl)); +#ifdef Q_OS_WIN + const QString destinationDir = props->destinationDir(QStringLiteral("local")) + QDir::separator() + QString(localFolder).remove(QLatin1Char(':')); +#else + const QString destinationDir = props->destinationDir(QStringLiteral("local")) + localFolder; +#endif + QVERIFY(props->isAutoSaveEnabled()); props->setSortRole("someNewSortRole"); props.reset(); -#ifdef Q_OS_WIN - // On Windows the read-only attribute is not honored on directories: files and - // Alternate Data Streams can still be created inside them. The properties are - // therefore stored locally rather than redirected to the destination directory. - KFileMetaData::UserMetaData metadata(localFolder); - if (metadata.isSupported()) { - QVERIFY(metadata.hasAttribute("kde.fm.viewproperties#1")); - } else { - QVERIFY(QFile::exists(dotDirectoryFile)); - } -#else - // On a directory without write permission the properties are redirected to the - // destination directory, leaving the local directory untouched. - const QString destinationDir = props->destinationDir(QStringLiteral("local")) + localFolder; QVERIFY(QDir(destinationDir).exists()); QVERIFY(!QFile::exists(dotDirectoryFile)); KFileMetaData::UserMetaData metadata(localFolder); - QVERIFY(metadata.attribute(QStringLiteral("kde.fm.viewproperties#1")).isEmpty()); -#endif + const QString viewProperties = metadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(viewProperties.isEmpty()); - // The stored value round-trips regardless of where it was written. props.reset(new ViewProperties(testDirUrl)); QVERIFY(props->isAutoSaveEnabled()); QCOMPARE(props->sortRole(), "someNewSortRole"); props.reset(); -#ifndef Q_OS_WIN - KFileMetaData::UserMetaData destMetadata(destinationDir); - if (destMetadata.isSupported()) { - QVERIFY(destMetadata.hasAttribute("kde.fm.viewproperties#1")); + metadata = KFileMetaData::UserMetaData(destinationDir); + if (metadata.isSupported()) { + QVERIFY(metadata.hasAttribute("kde.fm.viewproperties#1")); } else { QVERIFY(QFile::exists(destinationDir + "/.directory")); } -#endif // un-restrict write permissions QFile(localFolder).setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner); diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index 94262e651..f461ebb89 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -14,6 +14,10 @@ #include <QBuffer> #include <QCryptographicHash> +#ifdef Q_OS_WIN +#include <windows.h> +#endif + #include <KFileItem> #include <KFileMetaData/UserMetaData> @@ -186,7 +190,14 @@ ViewProperties::ViewProperties(const QUrl &url) if (!useDestinationDir) { const QFileInfo dirInfo(m_filePath); const QFileInfo fileInfo(m_filePath + QDir::separator() + ViewPropertiesFileName); - useDestinationDir = !dirInfo.isWritable() || (dirInfo.size() > 0 && fileInfo.exists() && !(fileInfo.isReadable() && fileInfo.isWritable())); + bool dirWritable = dirInfo.isWritable(); +#ifdef Q_OS_WIN + if (dirWritable) { + const DWORD attrs = GetFileAttributesW(reinterpret_cast<const wchar_t *>(m_filePath.utf16())); + dirWritable = (attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_READONLY); + } +#endif + useDestinationDir = !dirWritable || (dirInfo.size() > 0 && fileInfo.exists() && !(fileInfo.isReadable() && fileInfo.isWritable())); } if (useDestinationDir) { |
