summaryrefslogtreecommitdiffstats
path: root/src/corelib/codecs/qtextcodec.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2012-07-25 12:57:15 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-31 11:12:58 +0200
commit8a883d972da3b28d87689c4d4d9c9b5e5b1dcba1 (patch)
tree9af454a745561dcdc0d0478c410ef58b916ada49 /src/corelib/codecs/qtextcodec.cpp
parentbb3637d33c122a5add502239c57dff8afcc555c8 (diff)
Do not preload any codecs anymore when using ICU
When using ICU we can now avoid pre loading any codecs at startup. Instead QTextCodecs will always be created lazily when first asked for. Change-Id: Ic668f2824700896d2eca7d0de54f978404826163 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/codecs/qtextcodec.cpp')
-rw-r--r--src/corelib/codecs/qtextcodec.cpp49
1 files changed, 26 insertions, 23 deletions
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index 6fef7794e6..25d2d1f96f 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -95,20 +95,20 @@
QT_BEGIN_NAMESPACE
+Q_GLOBAL_STATIC_WITH_ARGS(QMutex, textCodecsMutex, (QMutex::Recursive));
+QMutex *qTextCodecsMutex() { return textCodecsMutex(); }
+
+#if !defined(QT_USE_ICU)
static char qtolower(register char c)
{ if (c >= 'A' && c <= 'Z') return c + 0x20; return c; }
static bool qisalnum(register char c)
{ return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'z'); }
-static bool nameMatch(const QByteArray &name, const QByteArray &test)
+bool qTextCodecNameMatch(const char *n, const char *h)
{
- // if they're the same, return a perfect score
- if (qstricmp(name.constData(), test.constData()) == 0)
+ if (qstricmp(n, h) == 0)
return true;
- const char *n = name.constData();
- const char *h = test.constData();
-
// if the letters and numbers are the same, we have a match
while (*n != '\0') {
if (qisalnum(*n)) {
@@ -130,6 +130,7 @@ static bool nameMatch(const QByteArray &name, const QByteArray &test)
return (*h == '\0');
}
+
#if !defined(Q_OS_WIN32) && !defined(Q_OS_WINCE)
static QTextCodec *checkForCodec(const QByteArray &name) {
QTextCodec *c = QTextCodec::codecForName(name);
@@ -143,9 +144,6 @@ static QTextCodec *checkForCodec(const QByteArray &name) {
}
#endif
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, textCodecsMutex, (QMutex::Recursive));
-QMutex *qTextCodecsMutex() { return textCodecsMutex(); }
-
static void setup();
// this returns the codec the method sets up as locale codec to
@@ -155,10 +153,7 @@ static QTextCodec *setupLocaleMapper()
{
QCoreGlobalData *globalData = QCoreGlobalData::instance();
- QTextCodec *locale = globalData->codecForLocale.loadAcquire();
- if (locale)
- // already setup
- return locale;
+ QTextCodec *locale = 0;
{
QMutexLocker locker(textCodecsMutex());
@@ -170,10 +165,8 @@ static QTextCodec *setupLocaleMapper()
QCoreApplicationPrivate::initLocale();
#endif
-#if defined(Q_OS_MAC) || defined(Q_OS_IOS) || defined(Q_OS_LINUX_ANDROID) || defined(Q_OS_QNX)
+#if defined(QT_LOCALE_IS_UTF8)
locale = QTextCodec::codecForName("UTF-8");
-#elif defined(QT_USE_ICU)
- locale = QIcuCodec::defaultCodec();
#elif defined(Q_OS_WIN) || defined(Q_OS_WINCE)
locale = QTextCodec::codecForName("System");
#else
@@ -263,14 +256,18 @@ static QTextCodec *setupLocaleMapper()
return locale;
}
+
// textCodecsMutex need to be locked to enter this function
static void setup()
{
+ QCoreGlobalData *globalData = QCoreGlobalData::instance();
+ if (!globalData->allCodecs.isEmpty())
+ return;
+
#if !defined(QT_NO_CODECS) && !defined(QT_BOOTSTRAPPED)
(void)new QTsciiCodec;
for (int i = 0; i < 9; ++i)
(void)new QIsciiCodec(i);
-#if !defined(QT_USE_ICU)
for (int i = 0; i < QSimpleTextCodec::numSimpleCodecs; ++i)
(void)new QSimpleTextCodec(i);
@@ -292,7 +289,6 @@ static void setup()
#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
(void) new QWindowsLocalCodec;
#endif // Q_OS_WIN32
-#endif // QT_USE_ICU
#endif // !QT_NO_CODECS && !QT_BOOTSTRAPPED
(void)new QUtf16Codec;
@@ -305,6 +301,9 @@ static void setup()
(void)new QLatin1Codec;
(void)new QUtf8Codec;
}
+#else
+static void setup() {}
+#endif // QT_USE_ICU
/*!
\enum QTextCodec::ConversionFlag
@@ -510,7 +509,6 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name)
QCoreGlobalData *globalData = QCoreGlobalData::instance();
if (!globalData)
return 0;
- if (globalData->allCodecs.isEmpty())
setup();
#ifndef QT_USE_ICU
@@ -524,14 +522,14 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name)
for (int i = 0; i < globalData->allCodecs.size(); ++i) {
QTextCodec *cursor = globalData->allCodecs.at(i);
- if (nameMatch(cursor->name(), name)) {
+ if (qTextCodecNameMatch(cursor->name(), name)) {
if (cache)
cache->insert(name, cursor);
return cursor;
}
QList<QByteArray> aliases = cursor->aliases();
for (int y = 0; y < aliases.size(); ++y)
- if (nameMatch(aliases.at(y), name)) {
+ if (qTextCodecNameMatch(aliases.at(y), name)) {
if (cache)
cache->insert(name, cursor);
return cursor;
@@ -677,8 +675,13 @@ QTextCodec* QTextCodec::codecForLocale()
return 0;
QTextCodec *codec = globalData->codecForLocale.loadAcquire();
- if (!codec)
+ if (!codec) {
+#ifdef QT_USE_ICU
+ codec = QIcuCodec::defaultCodec();
+#else
codec = setupLocaleMapper();
+#endif
+ }
return codec;
}
@@ -1062,7 +1065,7 @@ QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCo
*/
QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba)
{
- return codecForHtml(ba, QTextCodec::codecForMib(/*Latin 1*/ 4));
+ return codecForHtml(ba, QTextCodec::codecForName("ISO-8859-1"));
}
/*!