00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef QDATASTREAM_H
00043 #define QDATASTREAM_H
00044
00045 #include <QtCore/qscopedpointer.h>
00046 #include <QtCore/qiodevice.h>
00047 #include <QtCore/qglobal.h>
00048
00049 #ifdef Status
00050 #error qdatastream.h must be included before any header file that defines Status
00051 #endif
00052
00053 QT_BEGIN_HEADER
00054
00055 QT_BEGIN_NAMESPACE
00056
00057 QT_MODULE(Core)
00058
00059 class QByteArray;
00060 class QIODevice;
00061
00062 template <typename T> class QList;
00063 template <typename T> class QLinkedList;
00064 template <typename T> class QVector;
00065 template <typename T> class QSet;
00066 template <class Key, class T> class QHash;
00067 template <class Key, class T> class QMap;
00068
00069 #if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
00070 class QDataStreamPrivate;
00071 class Q_CORE_EXPORT QDataStream
00072 {
00073 public:
00074 enum Version {
00075 Qt_1_0 = 1,
00076 Qt_2_0 = 2,
00077 Qt_2_1 = 3,
00078 Qt_3_0 = 4,
00079 Qt_3_1 = 5,
00080 Qt_3_3 = 6,
00081 Qt_4_0 = 7,
00082 Qt_4_1 = Qt_4_0,
00083 Qt_4_2 = 8,
00084 Qt_4_3 = 9,
00085 Qt_4_4 = 10,
00086 Qt_4_5 = 11,
00087 Qt_4_6 = 12,
00088 Qt_4_7 = Qt_4_6
00089 #if QT_VERSION >= 0x040800
00090 #error Add the datastream version for this Qt version
00091 Qt_4_8 = Qt_4_7
00092 #endif
00093 };
00094
00095 enum ByteOrder {
00096 BigEndian = QSysInfo::BigEndian,
00097 LittleEndian = QSysInfo::LittleEndian
00098 };
00099
00100 enum Status {
00101 Ok,
00102 ReadPastEnd,
00103 ReadCorruptData
00104 };
00105
00106 enum FloatingPointPrecision {
00107 SinglePrecision,
00108 DoublePrecision
00109 };
00110
00111 QDataStream();
00112 explicit QDataStream(QIODevice *);
00113 #ifdef QT3_SUPPORT
00114 QDataStream(QByteArray *, int mode);
00115 #endif
00116 QDataStream(QByteArray *, QIODevice::OpenMode flags);
00117 QDataStream(const QByteArray &);
00118 virtual ~QDataStream();
00119
00120 QIODevice *device() const;
00121 void setDevice(QIODevice *);
00122 void unsetDevice();
00123
00124 bool atEnd() const;
00125 #ifdef QT3_SUPPORT
00126 inline QT3_SUPPORT bool eof() const { return atEnd(); }
00127 #endif
00128
00129 Status status() const;
00130 void setStatus(Status status);
00131 void resetStatus();
00132
00133 FloatingPointPrecision floatingPointPrecision() const;
00134 void setFloatingPointPrecision(FloatingPointPrecision precision);
00135
00136 ByteOrder byteOrder() const;
00137 void setByteOrder(ByteOrder);
00138
00139 int version() const;
00140 void setVersion(int);
00141
00142 QDataStream &operator>>(qint8 &i);
00143 QDataStream &operator>>(quint8 &i);
00144 QDataStream &operator>>(qint16 &i);
00145 QDataStream &operator>>(quint16 &i);
00146 QDataStream &operator>>(qint32 &i);
00147 QDataStream &operator>>(quint32 &i);
00148 QDataStream &operator>>(qint64 &i);
00149 QDataStream &operator>>(quint64 &i);
00150
00151 QDataStream &operator>>(bool &i);
00152 QDataStream &operator>>(float &f);
00153 QDataStream &operator>>(double &f);
00154 QDataStream &operator>>(char *&str);
00155
00156 QDataStream &operator<<(qint8 i);
00157 QDataStream &operator<<(quint8 i);
00158 QDataStream &operator<<(qint16 i);
00159 QDataStream &operator<<(quint16 i);
00160 QDataStream &operator<<(qint32 i);
00161 QDataStream &operator<<(quint32 i);
00162 QDataStream &operator<<(qint64 i);
00163 QDataStream &operator<<(quint64 i);
00164 QDataStream &operator<<(bool i);
00165 QDataStream &operator<<(float f);
00166 QDataStream &operator<<(double f);
00167 QDataStream &operator<<(const char *str);
00168
00169 QDataStream &readBytes(char *&, uint &len);
00170 int readRawData(char *, int len);
00171
00172 QDataStream &writeBytes(const char *, uint len);
00173 int writeRawData(const char *, int len);
00174
00175 int skipRawData(int len);
00176
00177 #ifdef QT3_SUPPORT
00178 inline QT3_SUPPORT QDataStream &readRawBytes(char *str, uint len)
00179 { readRawData(str, static_cast<int>(len)); return *this; }
00180 inline QT3_SUPPORT QDataStream &writeRawBytes(const char *str, uint len)
00181 { writeRawData(str, static_cast<int>(len)); return *this; }
00182 inline QT3_SUPPORT bool isPrintableData() const { return false; }
00183 inline QT3_SUPPORT void setPrintableData(bool) {}
00184 #endif
00185
00186 private:
00187 Q_DISABLE_COPY(QDataStream)
00188
00189 QScopedPointer<QDataStreamPrivate> d;
00190
00191 QIODevice *dev;
00192 bool owndev;
00193 bool noswap;
00194 ByteOrder byteorder;
00195 int ver;
00196 Status q_status;
00197 };
00198
00199
00200
00201
00202
00203
00204 inline QIODevice *QDataStream::device() const
00205 { return dev; }
00206
00207 inline QDataStream::ByteOrder QDataStream::byteOrder() const
00208 { return byteorder; }
00209
00210 inline int QDataStream::version() const
00211 { return ver; }
00212
00213 inline void QDataStream::setVersion(int v)
00214 { ver = v; }
00215
00216 inline QDataStream &QDataStream::operator>>(quint8 &i)
00217 { return *this >> reinterpret_cast<qint8&>(i); }
00218
00219 inline QDataStream &QDataStream::operator>>(quint16 &i)
00220 { return *this >> reinterpret_cast<qint16&>(i); }
00221
00222 inline QDataStream &QDataStream::operator>>(quint32 &i)
00223 { return *this >> reinterpret_cast<qint32&>(i); }
00224
00225 inline QDataStream &QDataStream::operator>>(quint64 &i)
00226 { return *this >> reinterpret_cast<qint64&>(i); }
00227
00228 inline QDataStream &QDataStream::operator<<(quint8 i)
00229 { return *this << qint8(i); }
00230
00231 inline QDataStream &QDataStream::operator<<(quint16 i)
00232 { return *this << qint16(i); }
00233
00234 inline QDataStream &QDataStream::operator<<(quint32 i)
00235 { return *this << qint32(i); }
00236
00237 inline QDataStream &QDataStream::operator<<(quint64 i)
00238 { return *this << qint64(i); }
00239
00240 template <typename T>
00241 QDataStream& operator>>(QDataStream& s, QList<T>& l)
00242 {
00243 l.clear();
00244 quint32 c;
00245 s >> c;
00246 l.reserve(c);
00247 for(quint32 i = 0; i < c; ++i)
00248 {
00249 T t;
00250 s >> t;
00251 l.append(t);
00252 if (s.atEnd())
00253 break;
00254 }
00255 return s;
00256 }
00257
00258 template <typename T>
00259 QDataStream& operator<<(QDataStream& s, const QList<T>& l)
00260 {
00261 s << quint32(l.size());
00262 for (int i = 0; i < l.size(); ++i)
00263 s << l.at(i);
00264 return s;
00265 }
00266
00267 template <typename T>
00268 QDataStream& operator>>(QDataStream& s, QLinkedList<T>& l)
00269 {
00270 l.clear();
00271 quint32 c;
00272 s >> c;
00273 for(quint32 i = 0; i < c; ++i)
00274 {
00275 T t;
00276 s >> t;
00277 l.append(t);
00278 if (s.atEnd())
00279 break;
00280 }
00281 return s;
00282 }
00283
00284 template <typename T>
00285 QDataStream& operator<<(QDataStream& s, const QLinkedList<T>& l)
00286 {
00287 s << quint32(l.size());
00288 typename QLinkedList<T>::ConstIterator it = l.constBegin();
00289 for(; it != l.constEnd(); ++it)
00290 s << *it;
00291 return s;
00292 }
00293
00294 template<typename T>
00295 QDataStream& operator>>(QDataStream& s, QVector<T>& v)
00296 {
00297 v.clear();
00298 quint32 c;
00299 s >> c;
00300 v.resize(c);
00301 for(quint32 i = 0; i < c; ++i) {
00302 T t;
00303 s >> t;
00304 v[i] = t;
00305 }
00306 return s;
00307 }
00308
00309 template<typename T>
00310 QDataStream& operator<<(QDataStream& s, const QVector<T>& v)
00311 {
00312 s << quint32(v.size());
00313 for (typename QVector<T>::const_iterator it = v.begin(); it != v.end(); ++it)
00314 s << *it;
00315 return s;
00316 }
00317
00318 template <typename T>
00319 QDataStream &operator>>(QDataStream &in, QSet<T> &set)
00320 {
00321 set.clear();
00322 quint32 c;
00323 in >> c;
00324 for (quint32 i = 0; i < c; ++i) {
00325 T t;
00326 in >> t;
00327 set << t;
00328 if (in.atEnd())
00329 break;
00330 }
00331 return in;
00332 }
00333
00334 template <typename T>
00335 QDataStream& operator<<(QDataStream &out, const QSet<T> &set)
00336 {
00337 out << quint32(set.size());
00338 typename QSet<T>::const_iterator i = set.constBegin();
00339 while (i != set.constEnd()) {
00340 out << *i;
00341 ++i;
00342 }
00343 return out;
00344 }
00345
00346 template <class Key, class T>
00347 Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QHash<Key, T> &hash)
00348 {
00349 QDataStream::Status oldStatus = in.status();
00350 in.resetStatus();
00351 hash.clear();
00352
00353 quint32 n;
00354 in >> n;
00355
00356 for (quint32 i = 0; i < n; ++i) {
00357 if (in.status() != QDataStream::Ok)
00358 break;
00359
00360 Key k;
00361 T t;
00362 in >> k >> t;
00363 hash.insertMulti(k, t);
00364 }
00365
00366 if (in.status() != QDataStream::Ok)
00367 hash.clear();
00368 if (oldStatus != QDataStream::Ok)
00369 in.setStatus(oldStatus);
00370 return in;
00371 }
00372
00373 template <class Key, class T>
00374 Q_OUTOFLINE_TEMPLATE QDataStream &operator<<(QDataStream &out, const QHash<Key, T>& hash)
00375 {
00376 out << quint32(hash.size());
00377 typename QHash<Key, T>::ConstIterator it = hash.end();
00378 typename QHash<Key, T>::ConstIterator begin = hash.begin();
00379 while (it != begin) {
00380 --it;
00381 out << it.key() << it.value();
00382 }
00383 return out;
00384 }
00385 #ifdef qdoc
00386 template <class Key, class T>
00387 Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QMap<Key, T> &map)
00388 #else
00389 template <class aKey, class aT>
00390 Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QMap<aKey, aT> &map)
00391 #endif
00392 {
00393 QDataStream::Status oldStatus = in.status();
00394 in.resetStatus();
00395 map.clear();
00396
00397 quint32 n;
00398 in >> n;
00399
00400 map.detach();
00401 map.setInsertInOrder(true);
00402 for (quint32 i = 0; i < n; ++i) {
00403 if (in.status() != QDataStream::Ok)
00404 break;
00405
00406 aKey key;
00407 aT value;
00408 in >> key >> value;
00409 map.insertMulti(key, value);
00410 }
00411 map.setInsertInOrder(false);
00412 if (in.status() != QDataStream::Ok)
00413 map.clear();
00414 if (oldStatus != QDataStream::Ok)
00415 in.setStatus(oldStatus);
00416 return in;
00417 }
00418
00419 template <class Key, class T>
00420 Q_OUTOFLINE_TEMPLATE QDataStream &operator<<(QDataStream &out, const QMap<Key, T> &map)
00421 {
00422 out << quint32(map.size());
00423 typename QMap<Key, T>::ConstIterator it = map.end();
00424 typename QMap<Key, T>::ConstIterator begin = map.begin();
00425 while (it != begin) {
00426 --it;
00427 out << it.key() << it.value();
00428 }
00429 return out;
00430 }
00431
00432 #endif // QT_NO_DATASTREAM
00433
00434 QT_END_NAMESPACE
00435
00436 QT_END_HEADER
00437
00438 #endif // QDATASTREAM_H