Blame qtools/qdatastream.cpp

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