src/corelib/codecs/qutfcodec.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtCore module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qutfcodec_p.h"
       
    43 #include "qlist.h"
       
    44 #include "qendian.h"
       
    45 #include "qchar.h"
       
    46 
       
    47 QT_BEGIN_NAMESPACE
       
    48 
       
    49 enum { Endian = 0, Data = 1 };
       
    50 
       
    51 QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::ConverterState *state)
       
    52 {
       
    53     uchar replacement = '?';
       
    54     int rlen = 3*len;
       
    55     int surrogate_high = -1;
       
    56     if (state) {
       
    57         if (state->flags & QTextCodec::ConvertInvalidToNull)
       
    58             replacement = 0;
       
    59         if (!(state->flags & QTextCodec::IgnoreHeader))
       
    60             rlen += 3;
       
    61         if (state->remainingChars)
       
    62             surrogate_high = state->state_data[0];
       
    63     }
       
    64 
       
    65     QByteArray rstr;
       
    66     rstr.resize(rlen);
       
    67     uchar* cursor = (uchar*)rstr.data();
       
    68     const QChar *ch = uc;
       
    69     int invalid = 0;
       
    70     if (state && !(state->flags & QTextCodec::IgnoreHeader)) {
       
    71         *cursor++ = 0xef;
       
    72         *cursor++ = 0xbb;
       
    73         *cursor++ = 0xbf;
       
    74     }
       
    75 
       
    76     const QChar *end = ch + len;
       
    77     while (ch < end) {
       
    78         uint u = ch->unicode();
       
    79         if (surrogate_high >= 0) {
       
    80             if (u >= 0xdc00 && u < 0xe000) {
       
    81                 u = (surrogate_high - 0xd800)*0x400 + (u - 0xdc00) + 0x10000;
       
    82                 surrogate_high = -1;
       
    83             } else {
       
    84                 // high surrogate without low
       
    85                 *cursor = replacement;
       
    86                 ++ch;
       
    87                 ++invalid;
       
    88                 surrogate_high = -1;
       
    89                 continue;
       
    90             }
       
    91         } else if (u >= 0xdc00 && u < 0xe000) {
       
    92             // low surrogate without high
       
    93             *cursor = replacement;
       
    94             ++ch;
       
    95             ++invalid;
       
    96             continue;
       
    97         } else if (u >= 0xd800 && u < 0xdc00) {
       
    98             surrogate_high = u;
       
    99             ++ch;
       
   100             continue;
       
   101         }
       
   102 
       
   103         if (u < 0x80) {
       
   104             *cursor++ = (uchar)u;
       
   105         } else {
       
   106             if (u < 0x0800) {
       
   107                 *cursor++ = 0xc0 | ((uchar) (u >> 6));
       
   108             } else {
       
   109                 if (u > 0xffff) {
       
   110                     // see QString::fromUtf8() and QString::utf8() for explanations
       
   111                     if (u > 0x10fe00 && u < 0x10ff00) {
       
   112                         *cursor++ = (u - 0x10fe00);
       
   113                         ++ch;
       
   114                         continue;
       
   115                     } else {
       
   116                         *cursor++ = 0xf0 | ((uchar) (u >> 18));
       
   117                         *cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f);
       
   118                     }
       
   119                 } else {
       
   120                     *cursor++ = 0xe0 | (((uchar) (u >> 12)) & 0x3f);
       
   121                 }
       
   122                 *cursor++ = 0x80 | (((uchar) (u >> 6)) & 0x3f);
       
   123             }
       
   124             *cursor++ = 0x80 | ((uchar) (u&0x3f));
       
   125         }
       
   126         ++ch;
       
   127     }
       
   128 
       
   129     rstr.resize(cursor - (const uchar*)rstr.constData());
       
   130     if (state) {
       
   131         state->invalidChars += invalid;
       
   132         state->flags |= QTextCodec::IgnoreHeader;
       
   133         state->remainingChars = 0;
       
   134         if (surrogate_high >= 0) {
       
   135             state->remainingChars = 1;
       
   136             state->state_data[0] = surrogate_high;
       
   137         }
       
   138     }
       
   139     return rstr;
       
   140 }
       
   141 
       
   142 QString QUtf8::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state)
       
   143 {
       
   144     bool headerdone = false;
       
   145     ushort replacement = QChar::ReplacementCharacter;
       
   146     int need = 0;
       
   147     int error = -1;
       
   148     uint uc = 0;
       
   149     uint min_uc = 0;
       
   150     if (state) {
       
   151         if (state->flags & QTextCodec::IgnoreHeader)
       
   152             headerdone = true;
       
   153         if (state->flags & QTextCodec::ConvertInvalidToNull)
       
   154             replacement = QChar::Null;
       
   155         need = state->remainingChars;
       
   156         if (need) {
       
   157             uc = state->state_data[0];
       
   158             min_uc = state->state_data[1];
       
   159         }
       
   160     }
       
   161     if (!headerdone && len > 3
       
   162         && (uchar)chars[0] == 0xef && (uchar)chars[1] == 0xbb && (uchar)chars[2] == 0xbf) {
       
   163         // starts with a byte order mark
       
   164         chars += 3;
       
   165         len -= 3;
       
   166         headerdone = true;
       
   167     }
       
   168 
       
   169     QString result(need + len + 1, Qt::Uninitialized); // worst case
       
   170     ushort *qch = (ushort *)result.unicode();
       
   171     uchar ch;
       
   172     int invalid = 0;
       
   173 
       
   174     for (int i = 0; i < len; ++i) {
       
   175         ch = chars[i];
       
   176         if (need) {
       
   177             if ((ch&0xc0) == 0x80) {
       
   178                 uc = (uc << 6) | (ch & 0x3f);
       
   179                 --need;
       
   180                 if (!need) {
       
   181                     // utf-8 bom composes into 0xfeff code point
       
   182                     if (!headerdone && uc == 0xfeff) {
       
   183                         // dont do anything, just skip the BOM
       
   184                     } else if (uc > 0xffff && uc < 0x110000) {
       
   185                         // surrogate pair
       
   186                         Q_ASSERT((qch - (ushort*)result.unicode()) + 2 < result.length());
       
   187                         *qch++ = QChar::highSurrogate(uc);
       
   188                         *qch++ = QChar::lowSurrogate(uc);
       
   189                     } else if ((uc < min_uc) || (uc >= 0xd800 && uc <= 0xdfff) || (uc >= 0xfffe)) {
       
   190                         // error: overlong sequence, UTF16 surrogate or BOM
       
   191                         *qch++ = replacement;
       
   192                         ++invalid;
       
   193                     } else {
       
   194                         *qch++ = uc;
       
   195                     }
       
   196                     headerdone = true;
       
   197                 }
       
   198             } else {
       
   199                 // error
       
   200                 i = error;
       
   201                 *qch++ = replacement;
       
   202                 ++invalid;
       
   203                 need = 0;
       
   204                 headerdone = true;
       
   205             }
       
   206         } else {
       
   207             if (ch < 128) {
       
   208                 *qch++ = ushort(ch);
       
   209                 headerdone = true;
       
   210             } else if ((ch & 0xe0) == 0xc0) {
       
   211                 uc = ch & 0x1f;
       
   212                 need = 1;
       
   213                 error = i;
       
   214                 min_uc = 0x80;
       
   215                 headerdone = true;
       
   216             } else if ((ch & 0xf0) == 0xe0) {
       
   217                 uc = ch & 0x0f;
       
   218                 need = 2;
       
   219                 error = i;
       
   220                 min_uc = 0x800;
       
   221             } else if ((ch&0xf8) == 0xf0) {
       
   222                 uc = ch & 0x07;
       
   223                 need = 3;
       
   224                 error = i;
       
   225                 min_uc = 0x10000;
       
   226                 headerdone = true;
       
   227             } else {
       
   228                 // error
       
   229                 *qch++ = replacement;
       
   230                 ++invalid;
       
   231                 headerdone = true;
       
   232             }
       
   233         }
       
   234     }
       
   235     if (!state && need > 0) {
       
   236         // unterminated UTF sequence
       
   237         for (int i = error; i < len; ++i) {
       
   238             *qch++ = replacement;
       
   239             ++invalid;
       
   240         }
       
   241     }
       
   242     result.truncate(qch - (ushort *)result.unicode());
       
   243     if (state) {
       
   244         state->invalidChars += invalid;
       
   245         state->remainingChars = need;
       
   246         if (headerdone)
       
   247             state->flags |= QTextCodec::IgnoreHeader;
       
   248         state->state_data[0] = need ? uc : 0;
       
   249         state->state_data[1] = need ? min_uc : 0;
       
   250     }
       
   251     return result;
       
   252 }
       
   253 
       
   254 QByteArray QUtf16::convertFromUnicode(const QChar *uc, int len, QTextCodec::ConverterState *state, DataEndianness e)
       
   255 {
       
   256     DataEndianness endian = e;
       
   257     int length =  2*len;
       
   258     if (!state || (!(state->flags & QTextCodec::IgnoreHeader))) {
       
   259         length += 2;
       
   260     }
       
   261     if (e == DetectEndianness) {
       
   262         endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
       
   263     }
       
   264 
       
   265     QByteArray d;
       
   266     d.resize(length);
       
   267     char *data = d.data();
       
   268     if (!state || !(state->flags & QTextCodec::IgnoreHeader)) {
       
   269         QChar bom(QChar::ByteOrderMark);
       
   270         if (endian == BigEndianness) {
       
   271             data[0] = bom.row();
       
   272             data[1] = bom.cell();
       
   273         } else {
       
   274             data[0] = bom.cell();
       
   275             data[1] = bom.row();
       
   276         }
       
   277         data += 2;
       
   278     }
       
   279     if (endian == BigEndianness) {
       
   280         for (int i = 0; i < len; ++i) {
       
   281             *(data++) = uc[i].row();
       
   282             *(data++) = uc[i].cell();
       
   283         }
       
   284     } else {
       
   285         for (int i = 0; i < len; ++i) {
       
   286             *(data++) = uc[i].cell();
       
   287             *(data++) = uc[i].row();
       
   288         }
       
   289     }
       
   290 
       
   291     if (state) {
       
   292         state->remainingChars = 0;
       
   293         state->flags |= QTextCodec::IgnoreHeader;
       
   294     }
       
   295     return d;
       
   296 }
       
   297 
       
   298 QString QUtf16::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state, DataEndianness e)
       
   299 {
       
   300     DataEndianness endian = e;
       
   301     bool half = false;
       
   302     uchar buf = 0;
       
   303     bool headerdone = false;
       
   304     if (state) {
       
   305         headerdone = state->flags & QTextCodec::IgnoreHeader;
       
   306         if (endian == DetectEndianness)
       
   307             endian = (DataEndianness)state->state_data[Endian];
       
   308         if (state->remainingChars) {
       
   309             half = true;
       
   310             buf = state->state_data[Data];
       
   311         }
       
   312     }
       
   313     if (headerdone && endian == DetectEndianness)
       
   314         endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
       
   315 
       
   316     QString result(len, Qt::Uninitialized); // worst case
       
   317     QChar *qch = (QChar *)result.unicode();
       
   318     while (len--) {
       
   319         if (half) {
       
   320             QChar ch;
       
   321             if (endian == LittleEndianness) {
       
   322                 ch.setRow(*chars++);
       
   323                 ch.setCell(buf);
       
   324             } else {
       
   325                 ch.setRow(buf);
       
   326                 ch.setCell(*chars++);
       
   327             }
       
   328             if (!headerdone) {
       
   329                 if (endian == DetectEndianness) {
       
   330                     if (ch == QChar::ByteOrderSwapped && endian != BigEndianness) {
       
   331                         endian = LittleEndianness;
       
   332                     } else if (ch == QChar::ByteOrderMark && endian != LittleEndianness) {
       
   333                         // ignore BOM
       
   334                         endian = BigEndianness;
       
   335                     } else {
       
   336                         if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
       
   337                             endian = BigEndianness;
       
   338                         } else {
       
   339                             endian = LittleEndianness;
       
   340                             ch = QChar((ch.unicode() >> 8) | ((ch.unicode() & 0xff) << 8));
       
   341                         }
       
   342                         *qch++ = ch;
       
   343                     }
       
   344                 } else if (ch != QChar::ByteOrderMark) {
       
   345                     *qch++ = ch;
       
   346                 }
       
   347                 headerdone = true;
       
   348             } else {
       
   349                 *qch++ = ch;
       
   350             }
       
   351             half = false;
       
   352         } else {
       
   353             buf = *chars++;
       
   354             half = true;
       
   355         }
       
   356     }
       
   357     result.truncate(qch - result.unicode());
       
   358 
       
   359     if (state) {
       
   360         if (headerdone)
       
   361             state->flags |= QTextCodec::IgnoreHeader;
       
   362         state->state_data[Endian] = endian;
       
   363         if (half) {
       
   364             state->remainingChars = 1;
       
   365             state->state_data[Data] = buf;
       
   366         } else {
       
   367             state->remainingChars = 0;
       
   368             state->state_data[Data] = 0;
       
   369         }
       
   370     }
       
   371     return result;
       
   372 }
       
   373 
       
   374 QByteArray QUtf32::convertFromUnicode(const QChar *uc, int len, QTextCodec::ConverterState *state, DataEndianness e)
       
   375 {
       
   376     DataEndianness endian = e;
       
   377     int length =  4*len;
       
   378     if (!state || (!(state->flags & QTextCodec::IgnoreHeader))) {
       
   379         length += 4;
       
   380     }
       
   381     if (e == DetectEndianness) {
       
   382         endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
       
   383     }
       
   384 
       
   385     QByteArray d(length, Qt::Uninitialized);
       
   386     char *data = d.data();
       
   387     if (!state || !(state->flags & QTextCodec::IgnoreHeader)) {
       
   388         if (endian == BigEndianness) {
       
   389             data[0] = 0;
       
   390             data[1] = 0;
       
   391             data[2] = (char)0xfe;
       
   392             data[3] = (char)0xff;
       
   393         } else {
       
   394             data[0] = (char)0xff;
       
   395             data[1] = (char)0xfe;
       
   396             data[2] = 0;
       
   397             data[3] = 0;
       
   398         }
       
   399         data += 4;
       
   400     }
       
   401     if (endian == BigEndianness) {
       
   402         for (int i = 0; i < len; ++i) {
       
   403             uint cp = uc[i].unicode();
       
   404             if (uc[i].isHighSurrogate() && i < len - 1)
       
   405                 cp = QChar::surrogateToUcs4(cp, uc[++i].unicode());
       
   406             *(data++) = cp >> 24;
       
   407             *(data++) = (cp >> 16) & 0xff;
       
   408             *(data++) = (cp >> 8) & 0xff;
       
   409             *(data++) = cp & 0xff;
       
   410         }
       
   411     } else {
       
   412         for (int i = 0; i < len; ++i) {
       
   413             uint cp = uc[i].unicode();
       
   414             if (uc[i].isHighSurrogate() && i < len - 1)
       
   415                 cp = QChar::surrogateToUcs4(cp, uc[++i].unicode());
       
   416             *(data++) = cp & 0xff;
       
   417             *(data++) = (cp >> 8) & 0xff;
       
   418             *(data++) = (cp >> 16) & 0xff;
       
   419             *(data++) = cp >> 24;
       
   420         }
       
   421     }
       
   422 
       
   423     if (state) {
       
   424         state->remainingChars = 0;
       
   425         state->flags |= QTextCodec::IgnoreHeader;
       
   426     }
       
   427     return d;
       
   428 }
       
   429 
       
   430 QString QUtf32::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state, DataEndianness e)
       
   431 {
       
   432     DataEndianness endian = e;
       
   433     uchar tuple[4];
       
   434     int num = 0;
       
   435     bool headerdone = false;
       
   436     if (state) {
       
   437         headerdone = state->flags & QTextCodec::IgnoreHeader;
       
   438         if (endian == DetectEndianness) {
       
   439             endian = (DataEndianness)state->state_data[Endian];
       
   440         }
       
   441         num = state->remainingChars;
       
   442         memcpy(tuple, &state->state_data[Data], 4);
       
   443     }
       
   444     if (headerdone && endian == DetectEndianness)
       
   445         endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? BigEndianness : LittleEndianness;
       
   446 
       
   447     QString result;
       
   448     result.resize((num + len) >> 2 << 1); // worst case
       
   449     QChar *qch = (QChar *)result.unicode();
       
   450 
       
   451     const char *end = chars + len;
       
   452     while (chars < end) {
       
   453         tuple[num++] = *chars++;
       
   454         if (num == 4) {
       
   455             if (!headerdone) {
       
   456                 if (endian == DetectEndianness) {
       
   457                     if (endian == DetectEndianness) {
       
   458                         if (tuple[0] == 0xff && tuple[1] == 0xfe && tuple[2] == 0 && tuple[3] == 0 && endian != BigEndianness) {
       
   459                             endian = LittleEndianness;
       
   460                             num = 0;
       
   461                             continue;
       
   462                         } else if (tuple[0] == 0 && tuple[1] == 0 && tuple[2] == 0xfe && tuple[3] == 0xff && endian != LittleEndianness) {
       
   463                             endian = BigEndianness;
       
   464                             num = 0;
       
   465                             continue;
       
   466                         } else if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
       
   467                             endian = BigEndianness;
       
   468                         } else {
       
   469                             endian = LittleEndianness;
       
   470                         }
       
   471                     }
       
   472                 } else if (((endian == BigEndianness) ? qFromBigEndian<quint32>(tuple) : qFromLittleEndian<quint32>(tuple)) == QChar::ByteOrderMark) {
       
   473                     num = 0;
       
   474                     continue;
       
   475                 }
       
   476             }
       
   477             uint code = (endian == BigEndianness) ? qFromBigEndian<quint32>(tuple) : qFromLittleEndian<quint32>(tuple);
       
   478             if (code >= 0x10000) {
       
   479                 *qch++ = QChar::highSurrogate(code);
       
   480                 *qch++ = QChar::lowSurrogate(code);
       
   481             } else {
       
   482                 *qch++ = code;
       
   483             }
       
   484             num = 0;
       
   485         }
       
   486     }
       
   487     result.truncate(qch - result.unicode());
       
   488 
       
   489     if (state) {
       
   490         if (headerdone)
       
   491             state->flags |= QTextCodec::IgnoreHeader;
       
   492         state->state_data[Endian] = endian;
       
   493         state->remainingChars = num;
       
   494         memcpy(&state->state_data[Data], tuple, 4);
       
   495     }
       
   496     return result;
       
   497 }
       
   498 
       
   499 
       
   500 #ifndef QT_NO_TEXTCODEC
       
   501 
       
   502 QUtf8Codec::~QUtf8Codec()
       
   503 {
       
   504 }
       
   505 
       
   506 QByteArray QUtf8Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
       
   507 {
       
   508     return QUtf8::convertFromUnicode(uc, len, state);
       
   509 }
       
   510 
       
   511 void QUtf8Codec::convertToUnicode(QString *target, const char *chars, int len, ConverterState *state) const
       
   512 {
       
   513     *target += QUtf8::convertToUnicode(chars, len, state);
       
   514 }
       
   515 
       
   516 QString QUtf8Codec::convertToUnicode(const char *chars, int len, ConverterState *state) const
       
   517 {
       
   518     return QUtf8::convertToUnicode(chars, len, state);
       
   519 }
       
   520 
       
   521 QByteArray QUtf8Codec::name() const
       
   522 {
       
   523     return "UTF-8";
       
   524 }
       
   525 
       
   526 int QUtf8Codec::mibEnum() const
       
   527 {
       
   528     return 106;
       
   529 }
       
   530 
       
   531 QUtf16Codec::~QUtf16Codec()
       
   532 {
       
   533 }
       
   534 
       
   535 QByteArray QUtf16Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
       
   536 {
       
   537     return QUtf16::convertFromUnicode(uc, len, state, e);
       
   538 }
       
   539 
       
   540 QString QUtf16Codec::convertToUnicode(const char *chars, int len, ConverterState *state) const
       
   541 {
       
   542     return QUtf16::convertToUnicode(chars, len, state, e);
       
   543 }
       
   544 
       
   545 int QUtf16Codec::mibEnum() const
       
   546 {
       
   547     return 1015;
       
   548 }
       
   549 
       
   550 QByteArray QUtf16Codec::name() const
       
   551 {
       
   552     return "UTF-16";
       
   553 }
       
   554 
       
   555 QList<QByteArray> QUtf16Codec::aliases() const
       
   556 {
       
   557     return QList<QByteArray>();
       
   558 }
       
   559 
       
   560 int QUtf16BECodec::mibEnum() const
       
   561 {
       
   562     return 1013;
       
   563 }
       
   564 
       
   565 QByteArray QUtf16BECodec::name() const
       
   566 {
       
   567     return "UTF-16BE";
       
   568 }
       
   569 
       
   570 QList<QByteArray> QUtf16BECodec::aliases() const
       
   571 {
       
   572     QList<QByteArray> list;
       
   573     return list;
       
   574 }
       
   575 
       
   576 int QUtf16LECodec::mibEnum() const
       
   577 {
       
   578     return 1014;
       
   579 }
       
   580 
       
   581 QByteArray QUtf16LECodec::name() const
       
   582 {
       
   583     return "UTF-16LE";
       
   584 }
       
   585 
       
   586 QList<QByteArray> QUtf16LECodec::aliases() const
       
   587 {
       
   588     QList<QByteArray> list;
       
   589     return list;
       
   590 }
       
   591 
       
   592 QUtf32Codec::~QUtf32Codec()
       
   593 {
       
   594 }
       
   595 
       
   596 QByteArray QUtf32Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
       
   597 {
       
   598     return QUtf32::convertFromUnicode(uc, len, state, e);
       
   599 }
       
   600 
       
   601 QString QUtf32Codec::convertToUnicode(const char *chars, int len, ConverterState *state) const
       
   602 {
       
   603     return QUtf32::convertToUnicode(chars, len, state, e);
       
   604 }
       
   605 
       
   606 int QUtf32Codec::mibEnum() const
       
   607 {
       
   608     return 1017;
       
   609 }
       
   610 
       
   611 QByteArray QUtf32Codec::name() const
       
   612 {
       
   613     return "UTF-32";
       
   614 }
       
   615 
       
   616 QList<QByteArray> QUtf32Codec::aliases() const
       
   617 {
       
   618     QList<QByteArray> list;
       
   619     return list;
       
   620 }
       
   621 
       
   622 int QUtf32BECodec::mibEnum() const
       
   623 {
       
   624     return 1018;
       
   625 }
       
   626 
       
   627 QByteArray QUtf32BECodec::name() const
       
   628 {
       
   629     return "UTF-32BE";
       
   630 }
       
   631 
       
   632 QList<QByteArray> QUtf32BECodec::aliases() const
       
   633 {
       
   634     QList<QByteArray> list;
       
   635     return list;
       
   636 }
       
   637 
       
   638 int QUtf32LECodec::mibEnum() const
       
   639 {
       
   640     return 1019;
       
   641 }
       
   642 
       
   643 QByteArray QUtf32LECodec::name() const
       
   644 {
       
   645     return "UTF-32LE";
       
   646 }
       
   647 
       
   648 QList<QByteArray> QUtf32LECodec::aliases() const
       
   649 {
       
   650     QList<QByteArray> list;
       
   651     return list;
       
   652 }
       
   653 
       
   654 #endif //QT_NO_TEXTCODEC
       
   655 
       
   656 QT_END_NAMESPACE