|
Packit |
1c1d7e |
/****************************************************************************
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Implementation of QDataStream class
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Created : 930831
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is part of the tools module of the Qt GUI Toolkit.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed under the terms of the Q Public License
|
|
Packit |
1c1d7e |
** as defined by Trolltech AS of Norway and appearing in the file
|
|
Packit |
1c1d7e |
** LICENSE.QPL included in the packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed and/or modified under the terms of the
|
|
Packit |
1c1d7e |
** GNU General Public License version 2 as published by the Free Software
|
|
Packit |
1c1d7e |
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
Packit |
1c1d7e |
** packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
|
|
Packit |
1c1d7e |
** licenses may use this file in accordance with the Qt Commercial License
|
|
Packit |
1c1d7e |
** Agreement provided with the Software.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
Packit |
1c1d7e |
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
|
Packit |
1c1d7e |
** information about Qt Commercial License Agreements.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Contact info@trolltech.com if any conditions of this licensing are
|
|
Packit |
1c1d7e |
** not clear to you.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**********************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qdatastream.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#ifndef QT_NO_DATASTREAM
|
|
Packit |
1c1d7e |
#include "qbuffer.h"
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include <ctype.h>
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// REVISED: warwick
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\class QDataStream qdatastream.h
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\brief The QDataStream class provides serialization of
|
|
Packit |
1c1d7e |
binary data to a QIODevice.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\ingroup io
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
A data stream is a binary stream of encoded information which is 100%
|
|
Packit |
1c1d7e |
independent of the host computer operation system, CPU or byte order. A
|
|
Packit |
1c1d7e |
stream that is written by a PC under DOS/Windows can be read by a
|
|
Packit |
1c1d7e |
Sun SPARC running Solaris.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The QDataStream class implements serialization of primitive types, like
|
|
Packit |
1c1d7e |
\c char, \c short, \c int, \c char* etc. Serialization of more complex
|
|
Packit |
1c1d7e |
data is accomplished by breaking up the data into primitive units.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The programmer can select which byte order to use when serializing data.
|
|
Packit |
1c1d7e |
The default setting is big endian (MSB first). Changing it to little
|
|
Packit |
1c1d7e |
endian breaks the portability (unless the reader also changes to little
|
|
Packit |
1c1d7e |
endian). We recommend keeping this setting unless you have
|
|
Packit |
1c1d7e |
special requirements.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
A data stream cooperates closely with a QIODevice. A QIODevice
|
|
Packit |
1c1d7e |
represents an input/output medium one can read data from and write data
|
|
Packit |
1c1d7e |
to. The QFile class is an example of an IO device.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example (write data to a stream):
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
QFile f( "file.dta" );
|
|
Packit |
1c1d7e |
f.open( IO_WriteOnly ); // open file for writing
|
|
Packit |
1c1d7e |
QDataStream s( &f ); // serialize using f
|
|
Packit |
1c1d7e |
s << "the answer is"; // serialize string
|
|
Packit |
1c1d7e |
s << (Q_INT32)42; // serialize integer
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example (read data from a stream):
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
QFile f( "file.dta" );
|
|
Packit |
1c1d7e |
f.open( IO_ReadOnly ); // open file for reading
|
|
Packit |
1c1d7e |
QDataStream s( &f ); // serialize using f
|
|
Packit |
1c1d7e |
char *str;
|
|
Packit |
1c1d7e |
Q_INT32 a;
|
|
Packit |
1c1d7e |
s >> str >> a; // "the answer is" and 42
|
|
Packit |
1c1d7e |
delete str; // delete string
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
In the last example, if you read into a QString instead of a \c char*
|
|
Packit |
1c1d7e |
you do not have to delete it.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Normally, each item written to the stream is written in a fixed binary
|
|
Packit |
1c1d7e |
format.
|
|
Packit |
1c1d7e |
For example, a \c char* is written as a 32-bit integer equal to the
|
|
Packit |
1c1d7e |
length of the string including the NUL byte, followed by all the
|
|
Packit |
1c1d7e |
characters of the string including the NUL byte. Similarly when
|
|
Packit |
1c1d7e |
reading a string, 4 bytes are read to create the 32-bit length value,
|
|
Packit |
1c1d7e |
then that many characters for the string including the NUL. For a complete
|
|
Packit |
1c1d7e |
description of all Qt types supporting data streaming see \link
|
|
Packit |
1c1d7e |
datastreamformat.html Format of the QDataStream operators \endlink .
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
If you want a "parsing" input stream, see QTextStream. If you just want the
|
|
Packit |
1c1d7e |
data to be human-readable to aid in debugging, you can set the data
|
|
Packit |
1c1d7e |
stream into printable data mode with setPrintableData(). The data is
|
|
Packit |
1c1d7e |
then written slower, in a human readable bloated form that is sufficient
|
|
Packit |
1c1d7e |
for debugging.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
If you are producing a new binary data format, such as a file format
|
|
Packit |
1c1d7e |
for documents created by your application, you could use a QDataStream
|
|
Packit |
1c1d7e |
to write the data in a portable format. Typically, you would write
|
|
Packit |
1c1d7e |
a brief header containing a magic string and a version number to give
|
|
Packit |
1c1d7e |
yourself room for future expansion. For example:
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
// Open the file.
|
|
Packit |
1c1d7e |
QFile f( "file.xxx" );
|
|
Packit |
1c1d7e |
f.open( IO_WriteOnly );
|
|
Packit |
1c1d7e |
QDataStream s( &f );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Write a header with a "magic number" and a version
|
|
Packit |
1c1d7e |
s << 0xa0b0c0d0;
|
|
Packit |
1c1d7e |
s << 123;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Write the data
|
|
Packit |
1c1d7e |
s << [lots of interesting data]
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Then read it in with:
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
// Open the file.
|
|
Packit |
1c1d7e |
QFile f( "file.xxx" );
|
|
Packit |
1c1d7e |
f.open( IO_ReadOnly );
|
|
Packit |
1c1d7e |
QDataStream s( &f );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Read and check the header
|
|
Packit |
1c1d7e |
Q_UINT32 magic;
|
|
Packit |
1c1d7e |
s >> magic;
|
|
Packit |
1c1d7e |
if ( magic != 0xa0b0c0d0 )
|
|
Packit |
1c1d7e |
return XXX_BAD_FILE_FORMAT;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Read the version
|
|
Packit |
1c1d7e |
Q_INT32 version;
|
|
Packit |
1c1d7e |
s >> version;
|
|
Packit |
1c1d7e |
if ( version < 100 )
|
|
Packit |
1c1d7e |
return XXX_BAD_FILE_TOO_OLD;
|
|
Packit |
1c1d7e |
if ( version > 123 )
|
|
Packit |
1c1d7e |
return XXX_BAD_FILE_TOO_NEW;
|
|
Packit |
1c1d7e |
if ( version <= 110 )
|
|
Packit |
1c1d7e |
s.setVersion(1);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Read the data
|
|
Packit |
1c1d7e |
s >> [lots of interesting data];
|
|
Packit |
1c1d7e |
if ( version > 120 )
|
|
Packit |
1c1d7e |
s >> [data new in XXX version 1.2];
|
|
Packit |
1c1d7e |
s >> [other interesting data];
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa QTextStream QVariant
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
QDataStream member functions
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
#undef CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
#define CHECK_STREAM_PRECOND if ( !dev ) { \
|
|
Packit |
1c1d7e |
qWarning( "QDataStream: No device" ); \
|
|
Packit |
1c1d7e |
return *this; }
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
#define CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int systemWordSize = 0;
|
|
Packit |
1c1d7e |
static bool systemBigEndian;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static const int DefaultStreamVersion = 3;
|
|
Packit |
1c1d7e |
// 3 is default in Qt 2.1
|
|
Packit |
1c1d7e |
// 2 is the Qt 2.0.x format
|
|
Packit |
1c1d7e |
// 1 is the Qt 1.x format
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Constructs a data stream that has no IO device.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa setDevice()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream::QDataStream()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( systemWordSize == 0 ) // get system features
|
|
Packit |
1c1d7e |
qSysInfo( &systemWordSize, &systemBigEndian );
|
|
Packit |
1c1d7e |
dev = 0; // no device set
|
|
Packit |
1c1d7e |
owndev = FALSE;
|
|
Packit |
1c1d7e |
byteorder = BigEndian; // default byte order
|
|
Packit |
1c1d7e |
printable = FALSE;
|
|
Packit |
1c1d7e |
ver = DefaultStreamVersion;
|
|
Packit |
1c1d7e |
noswap = systemBigEndian;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Constructs a data stream that uses the IO device \a d.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa setDevice(), device()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream::QDataStream( QIODevice *d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( systemWordSize == 0 ) // get system features
|
|
Packit |
1c1d7e |
qSysInfo( &systemWordSize, &systemBigEndian );
|
|
Packit |
1c1d7e |
dev = d; // set device
|
|
Packit |
1c1d7e |
owndev = FALSE;
|
|
Packit |
1c1d7e |
byteorder = BigEndian; // default byte order
|
|
Packit |
1c1d7e |
printable = FALSE;
|
|
Packit |
1c1d7e |
ver = DefaultStreamVersion;
|
|
Packit |
1c1d7e |
noswap = systemBigEndian;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Constructs a data stream that operates on a byte array through an
|
|
Packit |
1c1d7e |
internal QBuffer device.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
static char bindata[] = { 231, 1, 44, ... };
|
|
Packit |
1c1d7e |
QByteArray a;
|
|
Packit |
1c1d7e |
a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
|
|
Packit |
1c1d7e |
QDataStream s( a, IO_ReadOnly ); // open on a's data
|
|
Packit |
1c1d7e |
s >> [something]; // read raw bindata
|
|
Packit |
1c1d7e |
a.resetRawData( bindata, sizeof(bindata) ); // finished
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The QArray::setRawData() function is not for the inexperienced.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream::QDataStream( QByteArray a, int mode )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( systemWordSize == 0 ) // get system features
|
|
Packit |
1c1d7e |
qSysInfo( &systemWordSize, &systemBigEndian );
|
|
Packit |
1c1d7e |
dev = new QBuffer( a ); // create device
|
|
Packit |
1c1d7e |
((QBuffer *)dev)->open( mode ); // open device
|
|
Packit |
1c1d7e |
owndev = TRUE;
|
|
Packit |
1c1d7e |
byteorder = BigEndian; // default byte order
|
|
Packit |
1c1d7e |
printable = FALSE;
|
|
Packit |
1c1d7e |
ver = DefaultStreamVersion;
|
|
Packit |
1c1d7e |
noswap = systemBigEndian;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Destructs the data stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The destructor will not affect the current IO device, unless it
|
|
Packit |
1c1d7e |
is an internal IO device processing a QByteArray passed in the constructor.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream::~QDataStream()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( owndev )
|
|
Packit |
1c1d7e |
delete dev;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QIODevice *QDataStream::device() const
|
|
Packit |
1c1d7e |
Returns the IO device currently set.
|
|
Packit |
1c1d7e |
\sa setDevice(), unsetDevice()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
void QDataStream::setDevice(QIODevice *d )
|
|
Packit |
1c1d7e |
Sets the IO device to \a d.
|
|
Packit |
1c1d7e |
\sa device(), unsetDevice()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QDataStream::setDevice(QIODevice *d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( owndev ) {
|
|
Packit |
1c1d7e |
delete dev;
|
|
Packit |
1c1d7e |
owndev = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
dev = d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Unsets the IO device. This is the same as calling setDevice( 0 ).
|
|
Packit |
1c1d7e |
\sa device(), setDevice()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QDataStream::unsetDevice()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setDevice( 0 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn bool QDataStream::atEnd() const
|
|
Packit |
1c1d7e |
Returns TRUE if the IO device has reached the end position (end of
|
|
Packit |
1c1d7e |
stream or file) or if there is no IO device set.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns FALSE if the current position of the read/write head of the IO
|
|
Packit |
1c1d7e |
device is somewhere before the end position.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa QIODevice::atEnd()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!\fn bool QDataStream::eof() const
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\obsolete
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns TRUE if the IO device has reached the end position (end of
|
|
Packit |
1c1d7e |
stream or file) or if there is no IO device set.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns FALSE if the current position of the read/write head of the IO
|
|
Packit |
1c1d7e |
device is somewhere before the end position.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa QIODevice::atEnd()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn int QDataStream::byteOrder() const
|
|
Packit |
1c1d7e |
Returns the current byte order setting - either \c BigEndian or
|
|
Packit |
1c1d7e |
\c LittleEndian.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa setByteOrder()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Sets the serialization byte order to \a bo.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The \a bo parameter can be \c QDataStream::BigEndian or
|
|
Packit |
1c1d7e |
\c QDataStream::LittleEndian.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The default setting is big endian. We recommend leaving this setting unless
|
|
Packit |
1c1d7e |
you have special requirements.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa byteOrder()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QDataStream::setByteOrder( int bo )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
byteorder = bo;
|
|
Packit |
1c1d7e |
if ( systemBigEndian )
|
|
Packit |
1c1d7e |
noswap = byteorder == BigEndian;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
noswap = byteorder == LittleEndian;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn bool QDataStream::isPrintableData() const
|
|
Packit |
1c1d7e |
Returns TRUE if the printable data flag has been set.
|
|
Packit |
1c1d7e |
\sa setPrintableData()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn void QDataStream::setPrintableData( bool enable )
|
|
Packit |
1c1d7e |
Sets or clears the printable data flag.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
If this flag is set, the write functions will generate output that
|
|
Packit |
1c1d7e |
consists of printable characters (7 bit ASCII).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
We recommend enabling printable data only for debugging purposes
|
|
Packit |
1c1d7e |
(it is slower and creates larger output).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn int QDataStream::version() const
|
|
Packit |
1c1d7e |
Returns the version number of the data serialization format.
|
|
Packit |
1c1d7e |
In Qt 2.1, this number is by default 3.
|
|
Packit |
1c1d7e |
\sa setVersion()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn void QDataStream::setVersion( int v )
|
|
Packit |
1c1d7e |
Sets the version number of the data serialization format.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
In order to accommodate for new functionality, the datastream
|
|
Packit |
1c1d7e |
serialization format of some Qt classes has changed in some versions of
|
|
Packit |
1c1d7e |
Qt. If you want to read data that was created by an earlier version of
|
|
Packit |
1c1d7e |
Qt, or write data that can be read by a program that was compiled with
|
|
Packit |
1c1d7e |
an earlier version of Qt, use this function to modify the serialization
|
|
Packit |
1c1d7e |
format of QDataStream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
For Qt 1.x compatibility, use \a v == 1.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
For Qt 2.0.x compatibility, use \a v == 2 (Not required for reading in
|
|
Packit |
1c1d7e |
Qt 2.1).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa version()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
QDataStream read functions
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static Q_INT32 read_int_ascii( QDataStream *s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
register int n = 0;
|
|
Packit |
1c1d7e |
char buf[40];
|
|
Packit |
1c1d7e |
while ( TRUE ) {
|
|
Packit |
1c1d7e |
buf[n] = s->device()->getch();
|
|
Packit |
1c1d7e |
if ( buf[n] == '\n' || n > 38 ) // $-terminator
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
n++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
buf[n] = '\0';
|
|
Packit |
1c1d7e |
return (Q_INT32)atol( buf );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator>>( Q_UINT8 &i )
|
|
Packit |
1c1d7e |
Reads an unsigned byte from the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a signed byte from the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator>>( Q_INT8 &i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
i = (Q_INT8)dev->getch();
|
|
Packit |
1c1d7e |
if ( i == '\\' ) { // read octal code
|
|
Packit |
1c1d7e |
char buf[4];
|
|
Packit |
1c1d7e |
dev->readBlock( buf, 3 );
|
|
Packit |
1c1d7e |
i = (buf[2] & 0x07)+((buf[1] & 0x07) << 3)+((buf[0] & 0x07) << 6);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
} else { // data or text
|
|
Packit |
1c1d7e |
i = (Q_INT8)dev->getch();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator>>( Q_UINT16 &i )
|
|
Packit |
1c1d7e |
Reads an unsigned 16-bit integer from the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a signed 16-bit integer from the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator>>( Q_INT16 &i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
i = (Q_INT16)read_int_ascii( this );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->readBlock( (char *)&i, sizeof(Q_INT16) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&i);
|
|
Packit |
1c1d7e |
char b[2];
|
|
Packit |
1c1d7e |
dev->readBlock( b, 2 );
|
|
Packit |
1c1d7e |
*p++ = b[1];
|
|
Packit |
1c1d7e |
*p = b[0];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator>>( Q_UINT32 &i )
|
|
Packit |
1c1d7e |
Reads an unsigned 32-bit integer from the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a signed 32-bit integer from the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator>>( Q_INT32 &i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
i = read_int_ascii( this );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->readBlock( (char *)&i, sizeof(Q_INT32) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&i);
|
|
Packit |
1c1d7e |
char b[4];
|
|
Packit |
1c1d7e |
dev->readBlock( b, 4 );
|
|
Packit |
1c1d7e |
*p++ = b[3];
|
|
Packit |
1c1d7e |
*p++ = b[2];
|
|
Packit |
1c1d7e |
*p++ = b[1];
|
|
Packit |
1c1d7e |
*p = b[0];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator>>( Q_UINT64 &i )
|
|
Packit |
1c1d7e |
Reads an unsigned 64-bit integer from the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream, or uses the Q_UINT32 operator if 64 bit is not available.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a signed 64-bit integer from the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream, or uses the Q_UINT32 operator if 64 bit is not available.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator>>( Q_INT64 &i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
i = read_int_ascii( this );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->readBlock( (char *)&i, sizeof(Q_INT64) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&i);
|
|
Packit |
1c1d7e |
char b[sizeof(Q_INT64)];
|
|
Packit |
1c1d7e |
dev->readBlock( b, sizeof(Q_INT64) );
|
|
Packit |
1c1d7e |
if ( sizeof(Q_INT64) == 8 ) {
|
|
Packit |
1c1d7e |
*p++ = b[7];
|
|
Packit |
1c1d7e |
*p++ = b[6];
|
|
Packit |
1c1d7e |
*p++ = b[5];
|
|
Packit |
1c1d7e |
*p++ = b[4];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
*p++ = b[3];
|
|
Packit |
1c1d7e |
*p++ = b[2];
|
|
Packit |
1c1d7e |
*p++ = b[1];
|
|
Packit |
1c1d7e |
*p = b[0];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static double read_double_ascii( QDataStream *s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
register int n = 0;
|
|
Packit |
1c1d7e |
char buf[80];
|
|
Packit |
1c1d7e |
while ( TRUE ) {
|
|
Packit |
1c1d7e |
buf[n] = s->device()->getch();
|
|
Packit |
1c1d7e |
if ( buf[n] == '\n' || n > 78 ) // $-terminator
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
n++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
buf[n] = '\0';
|
|
Packit |
1c1d7e |
return atof( buf );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a 32-bit floating point number from the stream using the standard
|
|
Packit |
1c1d7e |
IEEE754 format. Returns a reference to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator>>( float &f )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
f = (float)read_double_ascii( this );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->readBlock( (char *)&f, sizeof(float) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&f);
|
|
Packit |
1c1d7e |
char b[4];
|
|
Packit |
1c1d7e |
dev->readBlock( b, 4 );
|
|
Packit |
1c1d7e |
*p++ = b[3];
|
|
Packit |
1c1d7e |
*p++ = b[2];
|
|
Packit |
1c1d7e |
*p++ = b[1];
|
|
Packit |
1c1d7e |
*p = b[0];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a 64-bit floating point number from the stream using the standard
|
|
Packit |
1c1d7e |
IEEE754 format. Returns a reference to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator>>( double &f )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
f = read_double_ascii( this );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->readBlock( (char *)&f, sizeof(double) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&f);
|
|
Packit |
1c1d7e |
char b[8];
|
|
Packit |
1c1d7e |
dev->readBlock( b, 8 );
|
|
Packit |
1c1d7e |
*p++ = b[7];
|
|
Packit |
1c1d7e |
*p++ = b[6];
|
|
Packit |
1c1d7e |
*p++ = b[5];
|
|
Packit |
1c1d7e |
*p++ = b[4];
|
|
Packit |
1c1d7e |
*p++ = b[3];
|
|
Packit |
1c1d7e |
*p++ = b[2];
|
|
Packit |
1c1d7e |
*p++ = b[1];
|
|
Packit |
1c1d7e |
*p = b[0];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads the '\0'-terminated string \a s from the stream and returns
|
|
Packit |
1c1d7e |
a reference to the stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Space for the string is allocated using \c new - the caller must
|
|
Packit |
1c1d7e |
eventually call delete[] on the value.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator>>( char *&s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
uint len = 0;
|
|
Packit |
1c1d7e |
return readBytes( s, len );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads the buffer \a s from the stream and returns a reference to the
|
|
Packit |
1c1d7e |
stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The buffer \a s is allocated using \c new. Destroy it with the \c delete[]
|
|
Packit |
1c1d7e |
operator. If the length is zero or \a s cannot be allocated, \a s is
|
|
Packit |
1c1d7e |
set to 0.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The \a l parameter will be set to the length of the buffer.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The serialization format is an Q_UINT32 length specifier first, then the
|
|
Packit |
1c1d7e |
data (\a l bytes).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa readRawBytes(), writeBytes()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::readBytes( char *&s, uint &l )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
Q_UINT32 len;
|
|
Packit |
1c1d7e |
*this >> len; // first read length spec
|
|
Packit |
1c1d7e |
l = (uint)len;
|
|
Packit |
1c1d7e |
if ( len == 0 || eof() ) {
|
|
Packit |
1c1d7e |
s = 0;
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
s = new char[len]; // create char array
|
|
Packit |
1c1d7e |
CHECK_PTR( s );
|
|
Packit |
1c1d7e |
if ( !s ) // no memory
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
return readRawBytes( s, (uint)len );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads \a len bytes from the stream into \a s and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The buffer \a s must be preallocated.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa readBytes(), QIODevice::readBlock(), writeRawBytes()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::readRawBytes( char *s, uint len )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
register Q_INT8 *p = (Q_INT8*)s;
|
|
Packit |
1c1d7e |
while ( len-- )
|
|
Packit |
1c1d7e |
*this >> *p++;
|
|
Packit |
1c1d7e |
} else { // read data char array
|
|
Packit |
1c1d7e |
dev->readBlock( s, len );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
QDataStream write functions
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator<<( Q_UINT8 i )
|
|
Packit |
1c1d7e |
Writes an unsigned byte to the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes a signed byte to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator<<( Q_INT8 i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable && (i == '\\' || !isprint(i)) ) {
|
|
Packit |
1c1d7e |
char buf[6]; // write octal code
|
|
Packit |
1c1d7e |
buf[0] = '\\';
|
|
Packit |
1c1d7e |
buf[1] = '0' + ((i >> 6) & 0x07);
|
|
Packit |
1c1d7e |
buf[2] = '0' + ((i >> 3) & 0x07);
|
|
Packit |
1c1d7e |
buf[3] = '0' + (i & 0x07);
|
|
Packit |
1c1d7e |
buf[4] = '\0';
|
|
Packit |
1c1d7e |
dev->writeBlock( buf, 4 );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
dev->putch( i );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator<<( Q_UINT16 i )
|
|
Packit |
1c1d7e |
Writes an unsigned 16-bit integer to the stream and returns a reference
|
|
Packit |
1c1d7e |
to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes a signed 16-bit integer to the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator<<( Q_INT16 i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
char buf[16];
|
|
Packit |
1c1d7e |
sprintf( buf, "%d\n", i );
|
|
Packit |
1c1d7e |
dev->writeBlock( buf, strlen(buf) );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->writeBlock( (char *)&i, sizeof(Q_INT16) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&i);
|
|
Packit |
1c1d7e |
char b[2];
|
|
Packit |
1c1d7e |
b[1] = *p++;
|
|
Packit |
1c1d7e |
b[0] = *p;
|
|
Packit |
1c1d7e |
dev->writeBlock( b, 2 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator<<( Q_UINT32 i )
|
|
Packit |
1c1d7e |
Writes an unsigned 32-bit integer to the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes a signed 32-bit integer to the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator<<( Q_INT32 i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
char buf[16];
|
|
Packit |
1c1d7e |
sprintf( buf, "%d\n", i );
|
|
Packit |
1c1d7e |
dev->writeBlock( buf, strlen(buf) );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->writeBlock( (char *)&i, sizeof(Q_INT32) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&i);
|
|
Packit |
1c1d7e |
char b[4];
|
|
Packit |
1c1d7e |
b[3] = *p++;
|
|
Packit |
1c1d7e |
b[2] = *p++;
|
|
Packit |
1c1d7e |
b[1] = *p++;
|
|
Packit |
1c1d7e |
b[0] = *p;
|
|
Packit |
1c1d7e |
dev->writeBlock( b, 4 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator<<( Q_UINT64 i )
|
|
Packit |
1c1d7e |
Writes an unsigned 64-bit integer to the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream, or uses the Q_UINT32-operator if 64 bit is not available.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes a signed 64-bit integer to the stream and returns a reference to
|
|
Packit |
1c1d7e |
the stream, or calls the Q_INT32-operator if 64 bit is not available.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator<<( Q_INT64 i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
char buf[20];
|
|
Packit |
1c1d7e |
sprintf( buf, "%ld\n", i );
|
|
Packit |
1c1d7e |
dev->writeBlock( buf, strlen(buf) );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->writeBlock( (char *)&i, sizeof(Q_INT64) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&i);
|
|
Packit |
1c1d7e |
char b[sizeof(Q_INT64)];
|
|
Packit |
1c1d7e |
if ( sizeof(Q_INT64) == 8 ) {
|
|
Packit |
1c1d7e |
b[7] = *p++;
|
|
Packit |
1c1d7e |
b[6] = *p++;
|
|
Packit |
1c1d7e |
b[5] = *p++;
|
|
Packit |
1c1d7e |
b[4] = *p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
b[3] = *p++;
|
|
Packit |
1c1d7e |
b[2] = *p++;
|
|
Packit |
1c1d7e |
b[1] = *p++;
|
|
Packit |
1c1d7e |
b[0] = *p;
|
|
Packit |
1c1d7e |
dev->writeBlock( b, sizeof(Q_INT64) );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator<<( uint i )
|
|
Packit |
1c1d7e |
Writes an unsigned integer to the stream as a 32-bit unsigned integer
|
|
Packit |
1c1d7e |
(Q_UINT32).
|
|
Packit |
1c1d7e |
Returns a reference to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QDataStream &QDataStream::operator<<( int i )
|
|
Packit |
1c1d7e |
Writes a signed integer to the stream as a 32-bit signed integer (Q_INT32).
|
|
Packit |
1c1d7e |
Returns a reference to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes a 32-bit floating point number to the stream using the standard
|
|
Packit |
1c1d7e |
IEEE754 format. Returns a reference to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator<<( float f )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
char buf[32];
|
|
Packit |
1c1d7e |
sprintf( buf, "%g\n", (double)f );
|
|
Packit |
1c1d7e |
dev->writeBlock( buf, strlen(buf) );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
float g = f; // fixes float-on-stack problem
|
|
Packit |
1c1d7e |
if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->writeBlock( (char *)&g, sizeof(float) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&g);
|
|
Packit |
1c1d7e |
char b[4];
|
|
Packit |
1c1d7e |
b[3] = *p++;
|
|
Packit |
1c1d7e |
b[2] = *p++;
|
|
Packit |
1c1d7e |
b[1] = *p++;
|
|
Packit |
1c1d7e |
b[0] = *p;
|
|
Packit |
1c1d7e |
dev->writeBlock( b, 4 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes a 64-bit floating point number to the stream using the standard
|
|
Packit |
1c1d7e |
IEEE754 format. Returns a reference to the stream.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator<<( double f )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // printable data
|
|
Packit |
1c1d7e |
char buf[32];
|
|
Packit |
1c1d7e |
sprintf( buf, "%g\n", f );
|
|
Packit |
1c1d7e |
dev->writeBlock( buf, strlen(buf) );
|
|
Packit |
1c1d7e |
} else if ( noswap ) { // no conversion needed
|
|
Packit |
1c1d7e |
dev->writeBlock( (char *)&f, sizeof(double) );
|
|
Packit |
1c1d7e |
} else { // swap bytes
|
|
Packit |
1c1d7e |
register uchar *p = (uchar *)(&f);
|
|
Packit |
1c1d7e |
char b[8];
|
|
Packit |
1c1d7e |
b[7] = *p++;
|
|
Packit |
1c1d7e |
b[6] = *p++;
|
|
Packit |
1c1d7e |
b[5] = *p++;
|
|
Packit |
1c1d7e |
b[4] = *p++;
|
|
Packit |
1c1d7e |
b[3] = *p++;
|
|
Packit |
1c1d7e |
b[2] = *p++;
|
|
Packit |
1c1d7e |
b[1] = *p++;
|
|
Packit |
1c1d7e |
b[0] = *p;
|
|
Packit |
1c1d7e |
dev->writeBlock( b, 8 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes the '\0'-terminated string \a s to the stream and returns
|
|
Packit |
1c1d7e |
a reference to the stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The string is serialized using writeBytes().
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::operator<<( const char *s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( !s ) {
|
|
Packit |
1c1d7e |
*this << (Q_UINT32)0;
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
uint len = qstrlen( s ) + 1; // also write null terminator
|
|
Packit |
1c1d7e |
*this << (Q_UINT32)len; // write length specifier
|
|
Packit |
1c1d7e |
return writeRawBytes( s, len );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes the length specifier \a len and the buffer \a s to the stream and
|
|
Packit |
1c1d7e |
returns a reference to the stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The \a len is serialized as an Q_UINT32, followed by \a len bytes from
|
|
Packit |
1c1d7e |
\a s.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa writeRawBytes(), readBytes()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::writeBytes(const char *s, uint len)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
*this << (Q_UINT32)len; // write length specifier
|
|
Packit |
1c1d7e |
if ( len )
|
|
Packit |
1c1d7e |
writeRawBytes( s, len );
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes \a len bytes from \a s to the stream and returns a reference to the
|
|
Packit |
1c1d7e |
stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa writeBytes(), QIODevice::writeBlock(), readRawBytes()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QDataStream::writeRawBytes( const char *s, uint len )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CHECK_STREAM_PRECOND
|
|
Packit |
1c1d7e |
if ( printable ) { // write printable
|
|
Packit |
1c1d7e |
register char *p = (char *)s;
|
|
Packit |
1c1d7e |
while ( len-- )
|
|
Packit |
1c1d7e |
*this << *p++;
|
|
Packit |
1c1d7e |
} else { // write data char array
|
|
Packit |
1c1d7e |
dev->writeBlock( s, len );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#endif // QT_NO_DATASTREAM
|