QString IrcDecoder::decode(const QByteArray& data) const
{
    // TODO: not thread safe
    static QByteArray pluginKey;
    static bool initialized = false;
    if (!initialized)
    {
        pluginKey = const_cast<IrcDecoder*>(this)->initialize();
        initialized = true;
    }

    QTextCodec* codec = 0;
    if (IsUTF8Text(data, data.length()))
    {
        codec = QTextCodec::codecForName("UTF-8");
    }
    else
    {
        QByteArray name = d.fallback->name();
        IrcCodecPlugin* plugin = irc_codec_plugins()->value(pluginKey);
        if (plugin)
            name = plugin->codecForData(data);
        codec = QTextCodec::codecForName(name);
    }

    if (!codec)
        codec = d.fallback;
    Q_ASSERT(codec);
    return codec->toUnicode(data);
}
Exemple #2
0
QString IrcMessageDecoder::decode(const QByteArray& data, const QByteArray& encoding) const
{
    QTextCodec* codec = 0;
    if (IsUTF8Text(data, data.length())) {
        codec = QTextCodec::codecForName("UTF-8");
    } else {
        QByteArray name = codecForData(data);
        codec = QTextCodec::codecForName(name);
    }

    if (!codec)
        codec = QTextCodec::codecForName(encoding);
    Q_ASSERT(codec);
    return codec->toUnicode(data);
}