Blame qtools/qfile.cpp

Packit 1c1d7e
/****************************************************************************
Packit 1c1d7e
** 
Packit 1c1d7e
**
Packit 1c1d7e
** Implementation of QFile class
Packit 1c1d7e
**
Packit 1c1d7e
** Created : 930812
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 "qglobal.h"
Packit 1c1d7e
#if defined(_OS_WIN32_)
Packit 1c1d7e
#ifdef UNICODE
Packit 1c1d7e
#ifndef _UNICODE
Packit 1c1d7e
#define _UNICODE
Packit 1c1d7e
#endif
Packit 1c1d7e
#endif
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
#include "qfile.h"
Packit 1c1d7e
#include "qfiledefs_p.h"
Packit 1c1d7e
Packit 1c1d7e
extern bool qt_file_access( const QString& fn, int t );
Packit 1c1d7e
Packit 1c1d7e
// NOT REVISED
Packit 1c1d7e
/*!
Packit 1c1d7e
  \class QFile qfile.h
Packit 1c1d7e
  \brief The QFile class is an I/O device that operates on files.
Packit 1c1d7e
Packit 1c1d7e
  \ingroup io
Packit 1c1d7e
Packit 1c1d7e
  QFile is an I/O device for reading and writing binary and text files.	A
Packit 1c1d7e
  QFile may be used by itself (readBlock and writeBlock) or by more
Packit 1c1d7e
  conveniently using QDataStream or QTextStream.
Packit 1c1d7e
Packit 1c1d7e
  Here is a code fragment that uses QTextStream to read a text
Packit 1c1d7e
  file line by line. It prints each line with a line number.
Packit 1c1d7e
  \code
Packit 1c1d7e
    QFile f("file.txt");
Packit 1c1d7e
    if ( f.open(IO_ReadOnly) ) {    // file opened successfully
Packit 1c1d7e
	QTextStream t( &f );	    // use a text stream
Packit 1c1d7e
	QString s;
Packit 1c1d7e
	int n = 1;
Packit 1c1d7e
	while ( !t.eof() ) {	    // until end of file...
Packit 1c1d7e
	    s = t.readLine();	    // line of text excluding '\n'
Packit 1c1d7e
	    printf( "%3d: %s\n", n++, (const char *)s );
Packit 1c1d7e
	}
Packit 1c1d7e
	f.close();
Packit 1c1d7e
    }
Packit 1c1d7e
  \endcode
Packit 1c1d7e
Packit 1c1d7e
  The QFileInfo class holds detailed information about a file, such as
Packit 1c1d7e
  access permissions, file dates and file types.
Packit 1c1d7e
Packit 1c1d7e
  The QDir class manages directories and lists of file names.
Packit 1c1d7e
Packit 1c1d7e
  \sa QDataStream, QTextStream
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Constructs a QFile with no name.
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QFile::QFile()
Packit 1c1d7e
{
Packit 1c1d7e
    init();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Constructs a QFile with a file name \e name.
Packit 1c1d7e
  \sa setName()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QFile::QFile( const QString &name )
Packit 1c1d7e
    : fn(name)
Packit 1c1d7e
{
Packit 1c1d7e
    init();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Destructs a QFile.  Calls close().
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QFile::~QFile()
Packit 1c1d7e
{
Packit 1c1d7e
    close();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  \internal
Packit 1c1d7e
  Initialize internal data.
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
void QFile::init()
Packit 1c1d7e
{
Packit 1c1d7e
    setFlags( IO_Direct );
Packit 1c1d7e
    setStatus( IO_Ok );
Packit 1c1d7e
    fh	   = 0;
Packit 1c1d7e
    fd	   = 0;
Packit 1c1d7e
    length = 0;
Packit 1c1d7e
    ioIndex = 0;
Packit 1c1d7e
    ext_f  = FALSE;				// not an external file handle
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  \fn QString QFile::name() const
Packit 1c1d7e
  Returns the name set by setName().
Packit 1c1d7e
  \sa setName(), QFileInfo::fileName()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Sets the name of the file. The name can include an absolute directory
Packit 1c1d7e
  path or it can be a name or a path relative to the current directory.
Packit 1c1d7e
Packit 1c1d7e
  Do not call this function if the file has already been opened.
Packit 1c1d7e
Packit 1c1d7e
  Note that if the name is relative QFile does not associate it with the
Packit 1c1d7e
  current directory.  If you change directory before calling open(), open
Packit 1c1d7e
  uses the new current directory.
Packit 1c1d7e
Packit 1c1d7e
  Example:
Packit 1c1d7e
  \code
Packit 1c1d7e
     QFile f;
Packit 1c1d7e
     QDir::setCurrent( "/tmp" );
Packit 1c1d7e
     f.setName( "readme.txt" );
Packit 1c1d7e
     QDir::setCurrent( "/home" );
Packit 1c1d7e
     f.open( IO_ReadOnly );	   // opens "/home/readme.txt" under UNIX
Packit 1c1d7e
  \endcode
Packit 1c1d7e
Packit 1c1d7e
  Also note that the directory separator '/' works for all operating
Packit 1c1d7e
  systems supported by Qt.
Packit 1c1d7e
Packit 1c1d7e
  \sa name(), QFileInfo, QDir
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
void QFile::setName( const QString &name )
Packit 1c1d7e
{
Packit 1c1d7e
    if ( isOpen() ) {
Packit 1c1d7e
#if defined(CHECK_STATE)
Packit 1c1d7e
	qWarning( "QFile::setName: File is open" );
Packit 1c1d7e
#endif
Packit 1c1d7e
	close();
Packit 1c1d7e
    }
Packit 1c1d7e
    fn = name;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns TRUE if this file exists, otherwise FALSE.
Packit 1c1d7e
  \sa name()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
bool QFile::exists() const
Packit 1c1d7e
{
Packit 1c1d7e
    return qt_file_access( fn, F_OK );
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns TRUE if the file given by \e fileName exists, otherwise FALSE.
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
bool QFile::exists( const QString &fileName )
Packit 1c1d7e
{
Packit 1c1d7e
    return qt_file_access( fileName, F_OK );
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Removes the file specified by the file name currently set.
Packit 1c1d7e
  Returns TRUE if successful, otherwise FALSE.
Packit 1c1d7e
Packit 1c1d7e
  The file is closed before it is removed.
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
bool QFile::remove()
Packit 1c1d7e
{
Packit 1c1d7e
    close();
Packit 1c1d7e
    return remove( fn );
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_) || defined(_OS_CYGWIN_)
Packit 1c1d7e
# define HAS_TEXT_FILEMODE			// has translate/text filemode
Packit 1c1d7e
#endif
Packit 1c1d7e
#if defined(O_NONBLOCK)
Packit 1c1d7e
# define HAS_ASYNC_FILEMODE
Packit 1c1d7e
# define OPEN_ASYNC O_NONBLOCK
Packit 1c1d7e
#elif defined(O_NDELAY)
Packit 1c1d7e
# define HAS_ASYNC_FILEMODE
Packit 1c1d7e
# define OPEN_ASYNC O_NDELAY
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Flushes the file buffer to the disk.
Packit 1c1d7e
Packit 1c1d7e
  close() also flushes the file buffer.
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
void QFile::flush()
Packit 1c1d7e
{
Packit 1c1d7e
    if ( isOpen() && fh )			// can only flush open/buffered
Packit 1c1d7e
	fflush( fh );				//   file
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns TRUE if the end of file has been reached, otherwise FALSE.
Packit 1c1d7e
  \sa size()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
bool QFile::atEnd() const
Packit 1c1d7e
{
Packit 1c1d7e
    if ( !isOpen() ) {
Packit 1c1d7e
#if defined(CHECK_STATE)
Packit 1c1d7e
	qWarning( "QFile::atEnd: File is not open" );
Packit 1c1d7e
#endif
Packit 1c1d7e
	return FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    if ( isDirectAccess() && !isTranslated() ) {
Packit 1c1d7e
	if ( at() < length )
Packit 1c1d7e
	    return FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    return QIODevice::atEnd();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Reads a line of text.
Packit 1c1d7e
Packit 1c1d7e
  Reads bytes from the file until end-of-line is reached, or up to \a
Packit 1c1d7e
  maxlen bytes, and returns the number of bytes read, or -1 in case of
Packit 1c1d7e
  error.  The terminating newline is not stripped.
Packit 1c1d7e
Packit 1c1d7e
  This function is efficient only for buffered files.  Avoid
Packit 1c1d7e
  readLine() for files that have been opened with the \c IO_Raw
Packit 1c1d7e
  flag.
Packit 1c1d7e
Packit 1c1d7e
  \sa readBlock(), QTextStream::readLine()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
int QFile::readLine( char *p, uint maxlen )
Packit 1c1d7e
{
Packit 1c1d7e
    if ( maxlen == 0 )				// application bug?
Packit 1c1d7e
	return 0;
Packit 1c1d7e
#if defined(CHECK_STATE)
Packit 1c1d7e
    CHECK_PTR( p );
Packit 1c1d7e
    if ( !isOpen() ) {				// file not open
Packit 1c1d7e
	qWarning( "QFile::readLine: File not open" );
Packit 1c1d7e
	return -1;
Packit 1c1d7e
    }
Packit 1c1d7e
    if ( !isReadable() ) {			// reading not permitted
Packit 1c1d7e
	qWarning( "QFile::readLine: Read operation not permitted" );
Packit 1c1d7e
	return -1;
Packit 1c1d7e
    }
Packit 1c1d7e
#endif
Packit 1c1d7e
    int nread;					// number of bytes read
Packit 1c1d7e
    if ( isRaw() ) {				// raw file
Packit 1c1d7e
	nread = QIODevice::readLine( p, maxlen );
Packit 1c1d7e
    } else {					// buffered file
Packit 1c1d7e
	p = fgets( p, maxlen, fh );
Packit 1c1d7e
	if ( p ) {
Packit 1c1d7e
	    nread = qstrlen( p );
Packit 1c1d7e
	    ioIndex += nread;
Packit 1c1d7e
	} else {
Packit 1c1d7e
	    nread = -1;
Packit 1c1d7e
	    setStatus(IO_ReadError);
Packit 1c1d7e
	}
Packit 1c1d7e
    }
Packit 1c1d7e
    return nread;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Reads a line of text.
Packit 1c1d7e
Packit 1c1d7e
  Reads bytes from the file until end-of-line is reached, or up to \a
Packit 1c1d7e
  maxlen bytes, and returns the number of bytes read, or -1 in case of
Packit 1c1d7e
  error.  The terminating newline is not stripped.
Packit 1c1d7e
Packit 1c1d7e
  This function is efficient only for buffered files.  Avoid
Packit 1c1d7e
  readLine() for files that have been opened with the \c IO_Raw
Packit 1c1d7e
  flag.
Packit 1c1d7e
Packit 1c1d7e
  Note that the string is read as plain Latin1 bytes, not Unicode.
Packit 1c1d7e
Packit 1c1d7e
  \sa readBlock(), QTextStream::readLine()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
int QFile::readLine( QString& s, uint maxlen )
Packit 1c1d7e
{
Packit 1c1d7e
    QByteArray ba(maxlen);
Packit 1c1d7e
    int l = readLine(ba.data(),maxlen);
Packit 1c1d7e
    if ( l >= 0 ) {
Packit 1c1d7e
	ba.truncate(l);
Packit 1c1d7e
	s = QString(ba);
Packit 1c1d7e
    }
Packit 1c1d7e
    return l;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Reads a single byte/character from the file.
Packit 1c1d7e
Packit 1c1d7e
  Returns the byte/character read, or -1 if the end of the file has been
Packit 1c1d7e
  reached.
Packit 1c1d7e
Packit 1c1d7e
  \sa putch(), ungetch()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
int QFile::getch()
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(CHECK_STATE)
Packit 1c1d7e
    if ( !isOpen() ) {				// file not open
Packit 1c1d7e
	qWarning( "QFile::getch: File not open" );
Packit 1c1d7e
	return EOF;
Packit 1c1d7e
    }
Packit 1c1d7e
    if ( !isReadable() ) {			// reading not permitted
Packit 1c1d7e
	qWarning( "QFile::getch: Read operation not permitted" );
Packit 1c1d7e
	return EOF;
Packit 1c1d7e
    }
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
    int ch;
Packit 1c1d7e
Packit 1c1d7e
    if ( !ungetchBuffer.isEmpty() ) {
Packit 1c1d7e
	int len = ungetchBuffer.length();
Packit 1c1d7e
	ch = ungetchBuffer[ len-1 ];
Packit 1c1d7e
	ungetchBuffer.truncate( len - 1 );
Packit 1c1d7e
	return ch;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if ( isRaw() ) {				// raw file (inefficient)
Packit 1c1d7e
	char buf[1];
Packit 1c1d7e
	ch = readBlock( buf, 1 ) == 1 ? buf[0] : EOF;
Packit 1c1d7e
    } else {					// buffered file
Packit 1c1d7e
	if ( (ch = getc( fh )) != EOF )
Packit 1c1d7e
	    ioIndex++;
Packit 1c1d7e
	else
Packit 1c1d7e
	    setStatus(IO_ReadError);
Packit 1c1d7e
    }
Packit 1c1d7e
    return ch;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  \fn int QFile::writeBlock( const QByteArray& data )
Packit 1c1d7e
  \reimp
Packit 1c1d7e
  \internal
Packit 1c1d7e
  Should be removed in 3.0
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Writes the character \e ch to the file.
Packit 1c1d7e
Packit 1c1d7e
  Returns \e ch, or -1 if some error occurred.
Packit 1c1d7e
Packit 1c1d7e
  \sa getch(), ungetch()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
int QFile::putch( int ch )
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(CHECK_STATE)
Packit 1c1d7e
    if ( !isOpen() ) {				// file not open
Packit 1c1d7e
	qWarning( "QFile::putch: File not open" );
Packit 1c1d7e
	return EOF;
Packit 1c1d7e
    }
Packit 1c1d7e
    if ( !isWritable() ) {			// writing not permitted
Packit 1c1d7e
	qWarning( "QFile::putch: Write operation not permitted" );
Packit 1c1d7e
	return EOF;
Packit 1c1d7e
    }
Packit 1c1d7e
#endif
Packit 1c1d7e
    if ( isRaw() ) {				// raw file (inefficient)
Packit 1c1d7e
	char buf[1];
Packit 1c1d7e
	buf[0] = ch;
Packit 1c1d7e
	ch = writeBlock( buf, 1 ) == 1 ? ch : EOF;
Packit 1c1d7e
    } else {					// buffered file
Packit 1c1d7e
	if ( (ch = putc( ch, fh )) != EOF ) {
Packit 1c1d7e
	    ioIndex++;
Packit 1c1d7e
	    if ( ioIndex > length )		// update file length
Packit 1c1d7e
		length = ioIndex;
Packit 1c1d7e
	} else {
Packit 1c1d7e
	    setStatus(IO_WriteError);
Packit 1c1d7e
	}
Packit 1c1d7e
    }
Packit 1c1d7e
    return ch;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Puts the character \e ch back into the file and decrements the index if it
Packit 1c1d7e
  is not zero.
Packit 1c1d7e
Packit 1c1d7e
  This function is normally called to "undo" a getch() operation.
Packit 1c1d7e
Packit 1c1d7e
  Returns \e ch, or -1 if some error occurred.
Packit 1c1d7e
Packit 1c1d7e
  \sa getch(), putch()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
int QFile::ungetch( int ch )
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(CHECK_STATE)
Packit 1c1d7e
    if ( !isOpen() ) {				// file not open
Packit 1c1d7e
	qWarning( "QFile::ungetch: File not open" );
Packit 1c1d7e
	return EOF;
Packit 1c1d7e
    }
Packit 1c1d7e
    if ( !isReadable() ) {			// reading not permitted
Packit 1c1d7e
	qWarning( "QFile::ungetch: Read operation not permitted" );
Packit 1c1d7e
	return EOF;
Packit 1c1d7e
    }
Packit 1c1d7e
#endif
Packit 1c1d7e
    if ( ch == EOF )				// cannot unget EOF
Packit 1c1d7e
	return ch;
Packit 1c1d7e
Packit 1c1d7e
    if ( isSequentialAccess() && !fh) {
Packit 1c1d7e
	// pipe or similar => we cannot ungetch, so do it manually
Packit 1c1d7e
	ungetchBuffer +=ch;
Packit 1c1d7e
	return ch;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if ( isRaw() ) {				// raw file (very inefficient)
Packit 1c1d7e
	char buf[1];
Packit 1c1d7e
	at( ioIndex-1 );
Packit 1c1d7e
	buf[0] = ch;
Packit 1c1d7e
	if ( writeBlock(buf, 1) == 1 )
Packit 1c1d7e
	    at ( ioIndex-1 );
Packit 1c1d7e
	else
Packit 1c1d7e
	    ch = EOF;
Packit 1c1d7e
    } else {					// buffered file
Packit 1c1d7e
	if ( (ch = ungetc(ch, fh)) != EOF )
Packit 1c1d7e
	    ioIndex--;
Packit 1c1d7e
	else
Packit 1c1d7e
	    setStatus( IO_ReadError );
Packit 1c1d7e
    }
Packit 1c1d7e
    return ch;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static QCString locale_encoder( const QString &fileName )
Packit 1c1d7e
{
Packit 1c1d7e
    return fileName.local8Bit();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static QFile::EncoderFn encoder = locale_encoder;
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  When you use QFile, QFileInfo, and QDir to access the filesystem
Packit 1c1d7e
  with Qt, you can use Unicode filenames.  On Unix, these filenames
Packit 1c1d7e
  are converted to an 8-bit encoding.  If you want to do your own
Packit 1c1d7e
  file I/O on Unix, you should convert the filename using this
Packit 1c1d7e
  function.  On Windows NT, Unicode filenames are supported directly
Packit 1c1d7e
  in the filesystem and this function should be avoided. On Windows 95,
Packit 1c1d7e
  non-Latin1 locales are not supported at this time.
Packit 1c1d7e
Packit 1c1d7e
  By default, this function converts to the local 8-bit encoding
Packit 1c1d7e
  determined by the user's locale.  This is sufficient for
Packit 1c1d7e
  filenames that the user chooses.  Filenames hard-coded into the
Packit 1c1d7e
  application should only use 7-bit ASCII filename characters.
Packit 1c1d7e
Packit 1c1d7e
  The conversion scheme can be changed using setEncodingFunction().
Packit 1c1d7e
  This might be useful if you wish to give the user an option to
Packit 1c1d7e
  store in filenames in UTF-8, etc., but beware that such filenames
Packit 1c1d7e
  would probably then be unrecognizable when seen by other programs.
Packit 1c1d7e
Packit 1c1d7e
  \sa decodeName()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QCString QFile::encodeName( const QString &fileName )
Packit 1c1d7e
{
Packit 1c1d7e
    return (*encoder)(fileName);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  \enum QFile::EncoderFn
Packit 1c1d7e
Packit 1c1d7e
  This is used by QFile::setEncodingFunction().
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Sets the function for encoding Unicode filenames.
Packit 1c1d7e
  The default encodes in the locale-specific 8-bit encoding.
Packit 1c1d7e
Packit 1c1d7e
  \sa encodeName()
Packit 1c1d7e
*/
Packit 1c1d7e
void QFile::setEncodingFunction( EncoderFn f )
Packit 1c1d7e
{
Packit 1c1d7e
    encoder = f;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static
Packit 1c1d7e
QString locale_decoder( const QCString &localFileName )
Packit 1c1d7e
{
Packit 1c1d7e
    return QString::fromLocal8Bit(localFileName);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QFile::DecoderFn decoder = locale_decoder;
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  This does the reverse of QFile::encodeName().
Packit 1c1d7e
Packit 1c1d7e
  \sa setDecodingFunction()
Packit 1c1d7e
*/
Packit 1c1d7e
QString QFile::decodeName( const QCString &localFileName )
Packit 1c1d7e
{
Packit 1c1d7e
    return (*decoder)(localFileName);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  \enum QFile::DecoderFn
Packit 1c1d7e
Packit 1c1d7e
  This is used by QFile::setDecodingFunction().
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Sets the function for decoding 8-bit filenames.
Packit 1c1d7e
  The default uses the locale-specific 8-bit encoding.
Packit 1c1d7e
Packit 1c1d7e
  \sa encodeName(), decodeName()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
void QFile::setDecodingFunction( DecoderFn f )
Packit 1c1d7e
{
Packit 1c1d7e
    decoder = f;
Packit 1c1d7e
}