1
/****************************************************************************
3
** Copyright (C) 1992-2005 Trolltech AS. All rights reserved.
5
** This file is part of the core module of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
32
#include "QtCore/qiodevice.h"
33
#include "QtCore/qglobal.h"
38
template <typename T> class QList;
39
template <typename T> class QLinkedList;
40
template <typename T> class QVector;
41
template <typename T> class QSet;
42
template <class Key, class T> class QHash;
43
template <class Key, class T> class QMap;
45
class QDataStreamPrivate;
47
#ifndef QT_NO_DATASTREAM
48
class Q_CORE_EXPORT QDataStream
59
#if QT_VERSION >= 0x040100
60
#error "Add Qt_4_1 = Qt_4_0"
65
BigEndian = QSysInfo::BigEndian,
66
LittleEndian = QSysInfo::LittleEndian
70
#error This file has to be included after any system files that define Status
79
explicit QDataStream(QIODevice *);
81
QDataStream(QByteArray *, int mode);
83
QDataStream(QByteArray *, QIODevice::OpenMode flags);
84
QDataStream(const QByteArray &);
85
virtual ~QDataStream();
87
QIODevice *device() const;
88
void setDevice(QIODevice *);
93
inline QT3_SUPPORT bool eof() const { return atEnd(); }
96
Status status() const;
97
void setStatus(Status status);
100
ByteOrder byteOrder() const;
101
void setByteOrder(ByteOrder);
104
void setVersion(int);
106
QDataStream &operator>>(qint8 &i);
107
QDataStream &operator>>(quint8 &i);
108
QDataStream &operator>>(qint16 &i);
109
QDataStream &operator>>(quint16 &i);
110
QDataStream &operator>>(qint32 &i);
111
QDataStream &operator>>(quint32 &i);
112
QDataStream &operator>>(qint64 &i);
113
QDataStream &operator>>(quint64 &i);
115
QDataStream &operator>>(bool &i);
116
QDataStream &operator>>(float &f);
117
QDataStream &operator>>(double &f);
118
QDataStream &operator>>(char *&str);
120
QDataStream &operator<<(qint8 i);
121
QDataStream &operator<<(quint8 i);
122
QDataStream &operator<<(qint16 i);
123
QDataStream &operator<<(quint16 i);
124
QDataStream &operator<<(qint32 i);
125
QDataStream &operator<<(quint32 i);
126
QDataStream &operator<<(qint64 i);
127
QDataStream &operator<<(quint64 i);
128
QDataStream &operator<<(bool i);
129
QDataStream &operator<<(float f);
130
QDataStream &operator<<(double f);
131
QDataStream &operator<<(const char *str);
133
QDataStream &readBytes(char *&, uint &len);
134
int readRawData(char *, int len);
136
QDataStream &writeBytes(const char *, uint len);
137
int writeRawData(const char *, int len);
140
inline QT3_SUPPORT QDataStream &readRawBytes(char *str, uint len)
141
{ readRawData(str, (int)len); return *this; }
142
inline QT3_SUPPORT QDataStream &writeRawBytes(const char *str, uint len)
143
{ writeRawData(str, (int)len); return *this; }
144
inline QT3_SUPPORT bool isPrintableData() const { return false; }
145
inline QT3_SUPPORT void setPrintableData(bool) {}
149
Q_DISABLE_COPY(QDataStream)
151
QDataStreamPrivate *d;
162
/*****************************************************************************
163
QDataStream inline functions
164
*****************************************************************************/
166
inline QIODevice *QDataStream::device() const
169
inline QDataStream::ByteOrder QDataStream::byteOrder() const
170
{ return byteorder; }
172
inline int QDataStream::version() const
175
inline void QDataStream::setVersion(int v)
178
inline QDataStream &QDataStream::operator>>(quint8 &i)
179
{ return *this >> reinterpret_cast<qint8&>(i); }
181
inline QDataStream &QDataStream::operator>>(quint16 &i)
182
{ return *this >> reinterpret_cast<qint16&>(i); }
184
inline QDataStream &QDataStream::operator>>(quint32 &i)
185
{ return *this >> reinterpret_cast<qint32&>(i); }
187
inline QDataStream &QDataStream::operator>>(quint64 &i)
188
{ return *this >> reinterpret_cast<qint64&>(i); }
190
inline QDataStream &QDataStream::operator<<(quint8 i)
191
{ return *this << qint8(i); }
193
inline QDataStream &QDataStream::operator<<(quint16 i)
194
{ return *this << qint16(i); }
196
inline QDataStream &QDataStream::operator<<(quint32 i)
197
{ return *this << qint32(i); }
199
inline QDataStream &QDataStream::operator<<(quint64 i)
200
{ return *this << qint64(i); }
202
template <typename T>
203
QDataStream& operator>>(QDataStream& s, QList<T>& l)
208
for(quint32 i = 0; i < c; ++i)
219
template <typename T>
220
QDataStream& operator<<(QDataStream& s, const QList<T>& l)
222
s << quint32(l.size());
223
for (int i = 0; i < l.size(); ++i)
228
template <typename T>
229
QDataStream& operator>>(QDataStream& s, QLinkedList<T>& l)
234
for(quint32 i = 0; i < c; ++i)
245
template <typename T>
246
QDataStream& operator<<(QDataStream& s, const QLinkedList<T>& l)
248
s << quint32(l.size());
249
typename QLinkedList<T>::ConstIterator it = l.constBegin();
250
for(; it != l.constEnd(); ++it)
256
QDataStream& operator>>(QDataStream& s, QVector<T>& v)
262
for(quint32 i = 0; i < c; ++i) {
271
QDataStream& operator<<(QDataStream& s, const QVector<T>& v)
273
s << quint32(v.size());
274
const T* it = v.begin();
275
for(; it != v.end(); ++it)
280
template <typename T>
281
QDataStream &operator>>(QDataStream &in, QSet<T> &set)
286
for (quint32 i = 0; i < c; ++i) {
296
template <typename T>
297
QDataStream& operator<<(QDataStream &out, const QSet<T> &set)
299
out << quint32(set.size());
300
typename QSet<T>::const_iterator i = set.constBegin();
301
while (i != set.constEnd()) {
308
template <class Key, class T>
309
Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QHash<Key, T> &hash)
311
QDataStream::Status oldStatus = in.status();
318
for (quint32 i = 0; i < n; ++i) {
319
if (in.status() != QDataStream::Ok)
328
if (in.status() != QDataStream::Ok)
330
if (oldStatus != QDataStream::Ok)
331
in.setStatus(oldStatus);
335
template <class Key, class T>
336
Q_OUTOFLINE_TEMPLATE QDataStream &operator<<(QDataStream &out, const QHash<Key, T>& hash)
338
out << quint32(hash.size());
339
typename QHash<Key, T>::ConstIterator it = hash.begin();
340
while (it != hash.end()) {
341
out << it.key() << it.value();
347
template <class Key, class T>
348
Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QMap<Key, T> &map)
350
template <class aKey, class aT>
351
Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QMap<aKey, aT> &map)
354
QDataStream::Status oldStatus = in.status();
362
#if !defined(Q_CC_BOR)
363
map.d->insertInOrder = true;
365
for (quint32 i = 0; i < n; ++i) {
366
if (in.status() != QDataStream::Ok)
372
map.insert(key, value);
374
#if !defined(Q_CC_BOR)
375
map.d->insertInOrder = false;
377
if (in.status() != QDataStream::Ok)
379
if (oldStatus != QDataStream::Ok)
380
in.setStatus(oldStatus);
384
template <class Key, class T>
385
Q_OUTOFLINE_TEMPLATE QDataStream &operator<<(QDataStream &out, const QMap<Key, T> &map)
387
out << quint32(map.size());
388
typename QMap<Key, T>::ConstIterator it = map.begin();
389
while (it != map.end()) {
390
out << it.key() << it.value();
396
#endif // QT_NO_DATASTREAM
398
#endif // QDATASTREAM_H