Add QFileInfo::isNativePath

This function returns true if the file path can be used directly with
native APIs, modulo encoding and path separator conversions. This is
important for applications that interface with other libraries or simply
need to use native APIs together with Qt.

Traditionally, this information was available in QAbstractFileEngine and
forced users to explicitly create an engine or use internal API such as
QFile::fileEngine to access the underlying engine and this piece of
information.

Given its usefulness, exposing the information in a more visible place
is more appropriate. This reduces the need for people to know or care
about implementation details, like file engines...

The existing isLocalFs test was updated and repurposed to use the new
API, instead of relying on file engines and internal implementation
details of QFileInfo.

Change-Id: I65f497bb25741f6f7ea4d2c3b3562c8c4aab8bea
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Reviewed-by: David Faure <faure@kde.org>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
João Abecasis 2012-02-08 11:28:30 +01:00 committed by Qt by Nokia
parent 3f74aea9bb
commit 5c637e9171
3 changed files with 36 additions and 11 deletions

View File

@ -917,6 +917,29 @@ bool QFileInfo::isHidden() const
return d->getFileFlags(QAbstractFileEngine::HiddenFlag);
}
/*!
\since 5.0
Returns true if the file path can be used directly with native APIs.
Returns false if the file is otherwise supported by a virtual file system
inside Qt, such as \l{the Qt Resource System}.
\bold{Note:} Native paths may still require conversion of path separators
and character encoding, depending on platform and input requirements of the
native API.
\sa QDir::toNativeSeparators(), QFile::encodeName(), filePath(),
absoluteFilePath(), canonicalFilePath()
*/
bool QFileInfo::isNativePath() const
{
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
if (d->fileEngine == 0)
return true;
return d->getFileFlags(QAbstractFileEngine::LocalDiskFlag);
}
/*!
Returns true if this object points to a file or to a symbolic
link to a file. Returns false if the

View File

@ -103,6 +103,7 @@ public:
bool isWritable() const;
bool isExecutable() const;
bool isHidden() const;
bool isNativePath() const;
bool isRelative() const;
inline bool isAbsolute() const { return !isRelative(); }

View File

@ -159,8 +159,8 @@ private slots:
void isBundle_data();
void isBundle();
void isLocalFs_data();
void isLocalFs();
void isNativePath_data();
void isNativePath();
void refresh();
@ -1222,10 +1222,13 @@ void tst_QFileInfo::isBundle()
QCOMPARE(fi.isBundle(), isBundle);
}
void tst_QFileInfo::isLocalFs_data()
void tst_QFileInfo::isNativePath_data()
{
QTest::addColumn<QString>("path");
QTest::addColumn<bool>("isLocalFs");
QTest::addColumn<bool>("isNativePath");
QTest::newRow("default-constructed") << QString() << false;
QTest::newRow("empty") << QString("") << true;
QTest::newRow("local root") << QString::fromLatin1("/") << true;
QTest::newRow("local non-existent file") << QString::fromLatin1("/abrakadabra.boo") << true;
@ -1233,17 +1236,15 @@ void tst_QFileInfo::isLocalFs_data()
QTest::newRow("qresource root") << QString::fromLatin1(":/") << false;
}
void tst_QFileInfo::isLocalFs()
void tst_QFileInfo::isNativePath()
{
QFETCH(QString, path);
QFETCH(bool, isLocalFs);
QFETCH(bool, isNativePath);
QFileInfo info(path);
QFileInfoPrivate *privateInfo = getPrivate(info);
QCOMPARE((privateInfo->fileEngine == 0), isLocalFs);
if (privateInfo->fileEngine)
QCOMPARE(bool(privateInfo->fileEngine->fileFlags(QAbstractFileEngine::LocalDiskFlag)
& QAbstractFileEngine::LocalDiskFlag), isLocalFs);
if (path.isNull())
info = QFileInfo();
QCOMPARE(info.isNativePath(), isNativePath);
}
void tst_QFileInfo::refresh()