1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| QDataStream &operator>>(QDataStream &in, QString &str)
{
#ifdef QT_QSTRING_UCS_4
#if defined(Q_CC_GNU)
#warning "operator>> not working properly"
#endif
#endif
if (in.version() == 1) {
QByteArray l;
in >> l;
str = QString::fromLatin1(l);
} else {
quint32 bytes = 0;
in >> bytes; // read size of string
if (bytes == 0xffffffff) { // null string
str.clear();
} else if (bytes > 0) { // not empty
if (bytes & 0x1) {
str.clear();
in.setStatus(QDataStream::ReadCorruptData);
return in;
}
const quint32 Step = 1024 * 1024;
quint32 len = bytes / 2;
quint32 allocated = 0;
while (allocated < len) {
int blockSize = qMin(Step, len - allocated);
str.resize(allocated + blockSize);
if (in.readRawData(reinterpret_cast<char *>(str.data()) + allocated * 2,
blockSize * 2) != blockSize * 2) {
str.clear();
in.setStatus(QDataStream::ReadPastEnd);
return in;
}
allocated += blockSize;
}
if ((in.byteOrder() == QDataStream::BigEndian)
!= (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
ushort *data = reinterpret_cast<ushort *>(str.data());
while (len--) {
*data = (*data >> 8) | (*data << 8);
++data;
}
}
} else {
str = QLatin1String("");
}
}
return in;
} |
Partager