Update QFileSelector to use QSysInfo better

This reduces a bit of string duplication by relying on the constants
defined in qglobal.cpp and detection via uname(2), in addition to adding
the Linux distribution name as a selector.

Change-Id: I64a46a0fc552c399db787125b1b32aae5c50056f
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
This commit is contained in:
Thiago Macieira 2014-07-07 19:29:23 -07:00
parent 23f663cad6
commit bbded12df3
8 changed files with 51 additions and 31 deletions

View File

@ -145,7 +145,9 @@ QFileSelectorPrivate::QFileSelectorPrivate()
Selectors normally available are Selectors normally available are
\list \list
\li platform, any of the following strings which match the platform the application is running \li platform, any of the following strings which match the platform the application is running
on: android, blackberry, ios, osx, darwin, mac, linux, wince, unix, windows. on (list not exhaustive): android, blackberry, ios, osx, darwin, mac, linux, wince, unix,
windows. On Linux, if it can be determined, the name of the distribution too, like debian,
fedora or opensuse.
\li locale, same as QLocale::system().name(). \li locale, same as QLocale::system().name().
\endlist \endlist
@ -351,10 +353,10 @@ QStringList QFileSelectorPrivate::platformSelectors()
// similar, but not identical to QSysInfo::osType // similar, but not identical to QSysInfo::osType
QStringList ret; QStringList ret;
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
// can't fall back to QSysInfo because we need both "winphone" and "winrt" for the Windows Phone case
ret << QStringLiteral("windows"); ret << QStringLiteral("windows");
# if defined(Q_OS_WINCE) ret << QSysInfo::kernelType(); // "wince" and "winnt"
ret << QStringLiteral("wince"); # if defined(Q_OS_WINRT)
# elif defined(Q_OS_WINRT)
ret << QStringLiteral("winrt"); ret << QStringLiteral("winrt");
# if defined(Q_OS_WINPHONE) # if defined(Q_OS_WINPHONE)
ret << QStringLiteral("winphone"); ret << QStringLiteral("winphone");
@ -362,25 +364,16 @@ QStringList QFileSelectorPrivate::platformSelectors()
# endif # endif
#elif defined(Q_OS_UNIX) #elif defined(Q_OS_UNIX)
ret << QStringLiteral("unix"); ret << QStringLiteral("unix");
# if defined(Q_OS_ANDROID) # if !defined(Q_OS_ANDROID) && !defined(Q_OS_BLACKBERRY)
ret << QStringLiteral("android"); // we don't want "linux" for Android or "qnx" for Blackberry here
# elif defined(Q_OS_BLACKBERRY)
ret << QStringLiteral("blackberry");
# elif defined(Q_OS_QNX)
ret << QStringLiteral("qnx");
# elif defined(Q_OS_LINUX)
ret << QStringLiteral("linux");
# elif defined(Q_OS_DARWIN)
ret << QStringLiteral("darwin");
ret << QStringLiteral("mac"); // compatibility synonym
# if defined(Q_OS_IOS)
ret << QStringLiteral("ios");
# elif defined(Q_OS_OSX)
ret << QStringLiteral("osx");
# endif
# else
ret << QSysInfo::kernelType(); ret << QSysInfo::kernelType();
# ifdef Q_OS_MAC
ret << QStringLiteral("mac"); // compatibility, since kernelType() is "darwin"
# endif
# endif # endif
QString productName = QSysInfo::productType();
if (productName != QLatin1String("unknown"))
ret << productName; // "opensuse", "fedora", "osx", "ios", "blackberry", "android"
#endif #endif
return ret; return ret;
} }

View File

@ -10,6 +10,8 @@
<file>extras/+custom3/+custom4/test</file> <file>extras/+custom3/+custom4/test</file>
<file>extras/+custom3/+custom5/test</file> <file>extras/+custom3/+custom5/test</file>
<file>extras/+custom5/+custom3/test</file> <file>extras/+custom5/+custom3/test</file>
<!-- platforms/test: deepest possible selection -->
<file>platforms/test</file> <file>platforms/test</file>
<file>platforms/+unix/+android/test</file> <file>platforms/+unix/+android/test</file>
<file>platforms/+unix/+blackberry/test</file> <file>platforms/+unix/+blackberry/test</file>
@ -17,18 +19,11 @@
<file>platforms/+unix/+darwin/+mac/+osx/test</file> <file>platforms/+unix/+darwin/+mac/+osx/test</file>
<file>platforms/+unix/+darwin/+mac/test</file> <file>platforms/+unix/+darwin/+mac/test</file>
<file>platforms/+unix/+darwin/test</file> <file>platforms/+unix/+darwin/test</file>
<file>platforms/+windows/+wince/test</file>
<file>platforms/+windows/test</file>
<file>platforms/+windows/test2</file>
<file>platforms/+unix/+linux/test</file> <file>platforms/+unix/+linux/test</file>
<file>platforms/+unix/test</file> <file>platforms/+unix/test</file>
<file>platforms/test2</file> <file>platforms/+windows/+wince/test</file>
<file>platforms/+android/test2</file> <file>platforms/+windows/+winnt/test</file>
<file>platforms/+blackberry/test2</file> <file>platforms/+windows/test</file>
<file>platforms/+ios/test2</file>
<file>platforms/+osx/test2</file>
<file>platforms/+linux/test2</file>
<file>platforms/+wince/test2</file>
<file>platforms/+android/test</file> <file>platforms/+android/test</file>
<file>platforms/+blackberry/test</file> <file>platforms/+blackberry/test</file>
<file>platforms/+ios/test</file> <file>platforms/+ios/test</file>
@ -37,5 +32,20 @@
<file>platforms/+mac/test</file> <file>platforms/+mac/test</file>
<file>platforms/+linux/test</file> <file>platforms/+linux/test</file>
<file>platforms/+wince/test</file> <file>platforms/+wince/test</file>
<!-- platforms/test2: shallow selection for the deepest selector -->
<file>platforms/test2</file>
<file>platforms/+android/test2</file>
<file>platforms/+blackberry/test2</file>
<file>platforms/+ios/test2</file>
<file>platforms/+osx/test2</file>
<file>platforms/+linux/test2</file>
<file>platforms/+wince/test2</file>
<file>platforms/+winnt/test2</file>
<!-- platforms/test3: selection for the family only -->
<file>platforms/test3</file>
<file>platforms/+windows/test3</file>
<file>platforms/+unix/test3</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -84,8 +84,10 @@ void tst_QFileSelector::basicTest_data()
QString test("/test");// '/' is here so dir string can also be selector string QString test("/test");// '/' is here so dir string can also be selector string
QString test2("/test2"); QString test2("/test2");
QString test3("/test3");
QString expectedPlatform1File(":/platforms"); QString expectedPlatform1File(":/platforms");
QString expectedPlatform2File(""); //Only the last selector QString expectedPlatform2File(""); //Only the last selector
QString expectedPlatform3File; // Only the first selector (the family)
#if defined(Q_OS_UNIX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_BLACKBERRY) && \ #if defined(Q_OS_UNIX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_BLACKBERRY) && \
!defined(Q_OS_DARWIN) && !defined(Q_OS_LINUX) !defined(Q_OS_DARWIN) && !defined(Q_OS_LINUX)
/* We are only aware of specific unixes, and do not have test files for any of the others. /* We are only aware of specific unixes, and do not have test files for any of the others.
@ -96,14 +98,26 @@ void tst_QFileSelector::basicTest_data()
+ QString("unix/test"); + QString("unix/test");
expectedPlatform2File = QString(":/platforms/test2"); expectedPlatform2File = QString(":/platforms/test2");
#else #else
QString distributionName;
# if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD)
distributionName = QSysInfo::productType();
# endif
foreach (const QString &selector, QFileSelectorPrivate::platformSelectors()) { foreach (const QString &selector, QFileSelectorPrivate::platformSelectors()) {
// skip the Linux distribution name (if any) since we don't have files for them
if (selector == distributionName)
continue;
expectedPlatform1File = expectedPlatform1File + QLatin1Char('/') + QLatin1Char(selectorIndicator) expectedPlatform1File = expectedPlatform1File + QLatin1Char('/') + QLatin1Char(selectorIndicator)
+ selector; + selector;
expectedPlatform2File = selector; expectedPlatform2File = selector;
if (expectedPlatform3File.isNull())
expectedPlatform3File = selector;
} }
expectedPlatform1File += test; expectedPlatform1File += test;
expectedPlatform2File = QLatin1String(":/platforms/") + QLatin1Char(selectorIndicator) expectedPlatform2File = QLatin1String(":/platforms/") + QLatin1Char(selectorIndicator)
+ expectedPlatform2File + test2; + expectedPlatform2File + test2;
expectedPlatform3File = QLatin1String(":/platforms/") + QLatin1Char(selectorIndicator)
+ expectedPlatform3File + test3;
#endif #endif
QTest::newRow("platform1") << QString(":/platforms/test") << QStringList() QTest::newRow("platform1") << QString(":/platforms/test") << QStringList()
@ -112,6 +126,9 @@ void tst_QFileSelector::basicTest_data()
QTest::newRow("platform2") << QString(":/platforms/test2") << QStringList() QTest::newRow("platform2") << QString(":/platforms/test2") << QStringList()
<< expectedPlatform2File; << expectedPlatform2File;
QTest::newRow("platform3") << QString(":/platforms/test3") << QStringList()
<< expectedPlatform3File;
QString resourceTestPath(":/extras/test"); QString resourceTestPath(":/extras/test");
QString custom1("custom1"); QString custom1("custom1");
QTest::newRow("custom1-noselector") << resourceTestPath << QStringList() QTest::newRow("custom1-noselector") << resourceTestPath << QStringList()