summaryrefslogtreecommitdiffstats
path: root/src/corelib/codecs/qicucodec.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/qicucodec.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/qicucodec.cpp')
-rw-r--r--src/corelib/codecs/qicucodec.cpp54
1 files changed, 48 insertions, 6 deletions
diff --git a/src/corelib/codecs/qicucodec.cpp b/src/corelib/codecs/qicucodec.cpp
index 56efcad14e..221d130321 100644
--- a/src/corelib/codecs/qicucodec.cpp
+++ b/src/corelib/codecs/qicucodec.cpp
@@ -41,6 +41,10 @@
#include "qicucodec_p.h"
#include "qtextcodec_p.h"
+#include "qutfcodec_p.h"
+#include "qlatincodec_p.h"
+#include "qtsciicodec_p.h"
+#include "qisciicodec_p.h"
#include "private/qcoreglobaldata_p.h"
#include "qdebug.h"
@@ -55,6 +59,11 @@ static void qIcuCodecStateFree(QTextCodec::ConverterState *state)
ucnv_close(static_cast<UConverter *>(state->d));
}
+bool qTextCodecNameMatch(const char *n, const char *h)
+{
+ return ucnv_compareNames(n, h) == 0;
+}
+
/* The list below is generated from http://www.iana.org/assignments/character-sets/
using the snippet of code below:
@@ -341,6 +350,33 @@ static const char mibToNameTable[] =
"windows-1258\0"
"TIS-620\0";
+static QTextCodec *loadQtCodec(const char *name)
+{
+ if (!strcmp(name, "UTF-8"))
+ return new QUtf8Codec;
+ if (!strcmp(name, "UTF-16"))
+ return new QUtf16Codec;
+ if (!strcmp(name, "ISO-8859-1"))
+ return new QLatin1Codec;
+ if (!strcmp(name, "UTF-16BE"))
+ return new QUtf16BECodec;
+ if (!strcmp(name, "UTF-16LE"))
+ return new QUtf16LECodec;
+ if (!strcmp(name, "UTF-32"))
+ return new QUtf32Codec;
+ if (!strcmp(name, "UTF-32BE"))
+ return new QUtf32BECodec;
+ if (!strcmp(name, "UTF-32LE"))
+ return new QUtf32LECodec;
+ if (!strcmp(name, "TSCII"))
+ return new QTsciiCodec;
+ if (!qstrnicmp(name, "iscii", 5))
+ return QIsciiCodec::create(name);
+
+ return 0;
+}
+
+
QList<QByteArray> QIcuCodec::availableCodecs()
{
QList<QByteArray> codecs;
@@ -397,14 +433,16 @@ QTextCodec *QIcuCodec::defaultCodec()
if (c)
return c;
+#if defined(QT_LOCALE_IS_UTF8)
+ const char *name = "UTF-8";
+#else
const char *name = ucnv_getDefaultName();
+#endif
c = codecForName(name);
globalData->codecForLocale.storeRelease(c);
return c;
}
-static inline bool nameMatch(const QByteArray &a, const char *b)
-{ return a == b; }
QTextCodec *QIcuCodec::codecForName(const char *name)
{
@@ -449,20 +487,24 @@ QTextCodec *QIcuCodec::codecForName(const char *name)
for (int i = 0; i < globalData->allCodecs.size(); ++i) {
QTextCodec *cursor = globalData->allCodecs.at(i);
- if (nameMatch(cursor->name(), standardName)) {
+ if (qTextCodecNameMatch(cursor->name(), standardName)) {
if (cache)
cache->insert(standardName, cursor);
return cursor;
}
QList<QByteArray> aliases = cursor->aliases();
for (int y = 0; y < aliases.size(); ++y)
- if (nameMatch(aliases.at(y), standardName)) {
+ if (qTextCodecNameMatch(aliases.at(y), standardName)) {
if (cache)
cache->insert(standardName, cursor);
return cursor;
}
}
+ QTextCodec *c = loadQtCodec(standardName);
+ if (c)
+ return c;
+
if (qt_only)
return 0;
@@ -476,7 +518,7 @@ QTextCodec *QIcuCodec::codecForName(const char *name)
ucnv_close(conv);
- QTextCodec *c = new QIcuCodec(standardName);
+ c = new QIcuCodec(standardName);
if (cache)
cache->insert(standardName, c);
return c;
@@ -628,7 +670,7 @@ QList<QByteArray> QIcuCodec::aliases() const
int QIcuCodec::mibEnum() const
{
for (int i = 0; i < mibToNameSize; ++i) {
- if (m_name == (mibToNameTable + mibToName[i].index))
+ if (qTextCodecNameMatch(m_name, (mibToNameTable + mibToName[i].index)))
return mibToName[i].mib;
}