Blame qtools/qdir_win32.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2001 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Based on qdir_unix.cpp 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1992-2000 Trolltech AS.
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
#include "qglobal.h"
Packit 1c1d7e
Packit 1c1d7e
#include "qdir.h"
Packit 1c1d7e
#ifndef QT_NO_DIR
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
#include "qfileinfo.h"
Packit 1c1d7e
#include "qfiledefs_p.h"
Packit 1c1d7e
#include "qregexp.h"
Packit 1c1d7e
#include "qstringlist.h"
Packit 1c1d7e
#include <stdlib.h>
Packit 1c1d7e
#include <ctype.h>
Packit 1c1d7e
#if defined(_OS_WIN32_)
Packit 1c1d7e
#if defined(_CC_BOOL_DEF_)
Packit 1c1d7e
#undef  bool
Packit 1c1d7e
#include <windows.h>
Packit 1c1d7e
#define bool int
Packit 1c1d7e
#else
Packit 1c1d7e
#include <windows.h>
Packit 1c1d7e
#endif
Packit 1c1d7e
#endif
Packit 1c1d7e
#if defined(_OS_OS2EMX_)
Packit 1c1d7e
extern Q_UINT32 DosQueryCurrentDisk(Q_UINT32*,Q_UINT32*);
Packit 1c1d7e
#define NO_ERROR 0
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
extern QStringList qt_makeFilterList( const QString &filter );
Packit 1c1d7e
Packit 1c1d7e
extern int qt_cmp_si_sortSpec;
Packit 1c1d7e
Packit 1c1d7e
#if defined(Q_C_CALLBACKS)
Packit 1c1d7e
extern "C" {
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
extern int qt_cmp_si( const void *, const void * );
Packit 1c1d7e
Packit 1c1d7e
#if defined(Q_C_CALLBACKS)
Packit 1c1d7e
}
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
static QString p_getenv( QString name )
Packit 1c1d7e
{
Packit 1c1d7e
  DWORD len = GetEnvironmentVariableW( ( LPCWSTR ) qt_winTchar ( name, TRUE ), NULL, 0 );
Packit 1c1d7e
  if ( len == 0 )
Packit 1c1d7e
    return QString::null;
Packit 1c1d7e
  /* ansi: we allocate too much memory, but this shouldn't be the problem here ... */
Packit 1c1d7e
  LPWSTR buf = (LPWSTR)new WCHAR[ len ];
Packit 1c1d7e
  len = GetEnvironmentVariableW ( ( LPCWSTR ) qt_winTchar ( name, TRUE ), buf, len );
Packit 1c1d7e
  if ( len == 0 )
Packit 1c1d7e
  {
Packit 1c1d7e
    delete[] buf;
Packit 1c1d7e
    return QString::null;
Packit 1c1d7e
  }
Packit 1c1d7e
  QString ret = qt_winQString ( buf );
Packit 1c1d7e
  delete[] buf;
Packit 1c1d7e
  return ret;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void QDir::slashify( QString& n )
Packit 1c1d7e
{
Packit 1c1d7e
  for ( int i=0; i<(int)n.length(); i++ ) 
Packit 1c1d7e
  {
Packit 1c1d7e
     if ( n[i] == '\\' )
Packit 1c1d7e
          n[i] = '/';
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QString QDir::homeDirPath()
Packit 1c1d7e
{
Packit 1c1d7e
  QString d = p_getenv ( "HOME" );
Packit 1c1d7e
  if ( d.isNull () ) {
Packit 1c1d7e
    d = p_getenv ( "USERPROFILE" );
Packit 1c1d7e
    if ( d.isNull () ) {
Packit 1c1d7e
      QString homeDrive = p_getenv ( "HOMEDRIVE" );
Packit 1c1d7e
      QString homePath = p_getenv ( "HOMEPATH" );
Packit 1c1d7e
      if ( !homeDrive.isNull () && !homePath.isNull () ) {
Packit 1c1d7e
        d = homeDrive + homePath;
Packit 1c1d7e
      } else {
Packit 1c1d7e
        d = rootDirPath ();
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  slashify( d );
Packit 1c1d7e
  return d;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QString QDir::canonicalPath() const
Packit 1c1d7e
{
Packit 1c1d7e
    QString r;
Packit 1c1d7e
Packit 1c1d7e
    char cur[PATH_MAX];
Packit 1c1d7e
    char tmp[PATH_MAX];
Packit 1c1d7e
    GETCWD( cur, PATH_MAX );
Packit 1c1d7e
    if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
Packit 1c1d7e
	GETCWD( tmp, PATH_MAX );
Packit 1c1d7e
	r = QFile::decodeName(tmp);
Packit 1c1d7e
    }
Packit 1c1d7e
    CHDIR( cur );
Packit 1c1d7e
Packit 1c1d7e
    slashify( r );
Packit 1c1d7e
    return r;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool QDir::mkdir( const QString &dirName, bool acceptAbsPath ) const
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    return MKDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 ) == 0;
Packit 1c1d7e
#else
Packit 1c1d7e
    return _wmkdir( ( LPCWSTR ) filePath( dirName, acceptAbsPath ).ucs2() ) == 0;
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool QDir::rmdir( const QString &dirName, bool acceptAbsPath ) const
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    return RMDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
Packit 1c1d7e
#else
Packit 1c1d7e
    return _wrmdir( ( LPCWSTR ) filePath( dirName, acceptAbsPath ).ucs2() ) == 0;
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool QDir::isReadable() const
Packit 1c1d7e
{
Packit 1c1d7e
    QString path = dPath;
Packit 1c1d7e
    if ( ( path[ 0 ] == '\\' ) || ( path[ 0 ] == '/' ) )
Packit 1c1d7e
        path = rootDirPath() + path;
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    return ACCESS( QFile::encodeName(dPath), R_OK ) == 0;
Packit 1c1d7e
#else
Packit 1c1d7e
    return ( _waccess( (wchar_t*) path.ucs2(), R_OK ) == 0 );
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool QDir::isRoot() const
Packit 1c1d7e
{
Packit 1c1d7e
    QString path = dPath;
Packit 1c1d7e
    slashify( path );
Packit 1c1d7e
    return path == rootDirPath ();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool QDir::rename( const QString &name, const QString &newName,
Packit 1c1d7e
		   bool acceptAbsPaths	)
Packit 1c1d7e
{
Packit 1c1d7e
    if ( name.isEmpty() || newName.isEmpty() ) {
Packit 1c1d7e
#if defined(CHECK_NULL)
Packit 1c1d7e
	qWarning( "QDir::rename: Empty or null file name(s)" );
Packit 1c1d7e
#endif
Packit 1c1d7e
	return FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    QString fn1 = filePath( name, acceptAbsPaths );
Packit 1c1d7e
    QString fn2 = filePath( newName, acceptAbsPaths );
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    return ::rename( QFile::encodeName(fn1),
Packit 1c1d7e
		     QFile::encodeName(fn2) ) == 0;
Packit 1c1d7e
#else
Packit 1c1d7e
    return MoveFileW( ( LPCWSTR ) fn1.ucs2(), ( LPCWSTR ) fn2.ucs2() ) != 0;    
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool QDir::setCurrent( const QString &path )
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    int r;
Packit 1c1d7e
    r = CHDIR( QFile::encodeName(path) );
Packit 1c1d7e
    return r >= 0;
Packit 1c1d7e
#else
Packit 1c1d7e
    if ( !QDir( path ).exists() )
Packit 1c1d7e
        return false;
Packit 1c1d7e
    return ( SetCurrentDirectoryW( ( LPCWSTR ) path.ucs2() ) >= 0 );
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QString QDir::currentDirPath()
Packit 1c1d7e
{
Packit 1c1d7e
    QString result;
Packit 1c1d7e
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
Packit 1c1d7e
    STATBUF st;
Packit 1c1d7e
    if ( STAT( ".", &st ) == 0 ) {
Packit 1c1d7e
	char currentName[PATH_MAX];
Packit 1c1d7e
	if ( GETCWD( currentName, PATH_MAX ) != 0 )
Packit 1c1d7e
	    result = QFile::decodeName(currentName);
Packit 1c1d7e
#if defined(DEBUG)
Packit 1c1d7e
	if ( result.isNull() )
Packit 1c1d7e
	    qWarning( "QDir::currentDirPath: getcwd() failed" );
Packit 1c1d7e
#endif
Packit 1c1d7e
    } else {
Packit 1c1d7e
#if defined(DEBUG)
Packit 1c1d7e
	qWarning( "QDir::currentDirPath: stat(\".\") failed" );
Packit 1c1d7e
#endif
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
#else
Packit 1c1d7e
Packit 1c1d7e
    DWORD size = 0;
Packit 1c1d7e
    WCHAR currentName[ PATH_MAX ];
Packit 1c1d7e
    size = ::GetCurrentDirectoryW( PATH_MAX, currentName );
Packit 1c1d7e
    if ( size != 0 ) {
Packit 1c1d7e
      if ( size > PATH_MAX ) {
Packit 1c1d7e
        WCHAR * newCurrentName = new WCHAR[ size ];
Packit 1c1d7e
        if ( ::GetCurrentDirectoryW( PATH_MAX, newCurrentName ) != 0 )
Packit 1c1d7e
          result = QString::fromUcs2( ( ushort* ) newCurrentName );
Packit 1c1d7e
        delete [] newCurrentName;
Packit 1c1d7e
      } else {
Packit 1c1d7e
        result = QString::fromUcs2( ( ushort* ) currentName );
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if ( result.length() >= 2 && result[ 1 ] == ':' )
Packit 1c1d7e
          result[ 0 ] = result.at( 0 ).upper(); // Force uppercase drive letters.
Packit 1c1d7e
#endif
Packit 1c1d7e
    slashify( result );
Packit 1c1d7e
    return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QString QDir::rootDirPath()
Packit 1c1d7e
{
Packit 1c1d7e
  QString d = p_getenv ( "SystemDrive" );
Packit 1c1d7e
  if ( d.isNull () )
Packit 1c1d7e
    d = QString::fromLatin1( "c:" );  // not "c:\\" !
Packit 1c1d7e
  slashify ( d );
Packit 1c1d7e
  return d;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool QDir::isRelativePath( const QString &path )
Packit 1c1d7e
{
Packit 1c1d7e
  if ( path.isEmpty() )
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  int p = 0;
Packit 1c1d7e
  if ( path[ 0 ].isLetter() && path[ 1 ] == ':' )
Packit 1c1d7e
    p = 2; // we have checked the first 2.
Packit 1c1d7e
  return ( ( path[ p ] != '/' ) && ( path[ p ] != '\\' ) );
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
#undef  IS_SUBDIR
Packit 1c1d7e
#undef  IS_RDONLY
Packit 1c1d7e
#undef  IS_ARCH
Packit 1c1d7e
#undef  IS_HIDDEN
Packit 1c1d7e
#undef  IS_SYSTEM
Packit 1c1d7e
#undef  FF_GETFIRST
Packit 1c1d7e
#undef  FF_GETNEXT
Packit 1c1d7e
#undef  FF_ERROR
Packit 1c1d7e
Packit 1c1d7e
#if defined(_OS_WIN32_)
Packit 1c1d7e
#define IS_SUBDIR   FILE_ATTRIBUTE_DIRECTORY
Packit 1c1d7e
#define IS_RDONLY   FILE_ATTRIBUTE_READONLY
Packit 1c1d7e
#define IS_ARCH     FILE_ATTRIBUTE_ARCHIVE
Packit 1c1d7e
#define IS_HIDDEN   FILE_ATTRIBUTE_HIDDEN
Packit 1c1d7e
#define IS_SYSTEM   FILE_ATTRIBUTE_SYSTEM
Packit 1c1d7e
#define FF_GETFIRST FindFirstFile
Packit 1c1d7e
#define FF_GETNEXT  FindNextFile
Packit 1c1d7e
#define FF_ERROR    INVALID_HANDLE_VALUE
Packit 1c1d7e
#else
Packit 1c1d7e
#define IS_SUBDIR   _A_SUBDIR
Packit 1c1d7e
#define IS_RDONLY   _A_RDONLY
Packit 1c1d7e
#define IS_ARCH     _A_ARCH
Packit 1c1d7e
#define IS_HIDDEN   _A_HIDDEN
Packit 1c1d7e
#define IS_SYSTEM   _A_SYSTEM
Packit 1c1d7e
#define FF_GETFIRST _findfirst
Packit 1c1d7e
#define FF_GETNEXT  _findnext
Packit 1c1d7e
#define FF_ERROR    -1
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
bool QDir::readDirEntries( const QString &nameFilter,
Packit 1c1d7e
			   int filterSpec, int sortSpec )
Packit 1c1d7e
{
Packit 1c1d7e
    int i;
Packit 1c1d7e
    if ( !fList ) {
Packit 1c1d7e
	fList  = new QStringList;
Packit 1c1d7e
	CHECK_PTR( fList );
Packit 1c1d7e
	fiList = new QFileInfoList;
Packit 1c1d7e
	CHECK_PTR( fiList );
Packit 1c1d7e
	fiList->setAutoDelete( TRUE );
Packit 1c1d7e
    } else {
Packit 1c1d7e
	fList->clear();
Packit 1c1d7e
	fiList->clear();
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    QStringList filters = qt_makeFilterList( nameFilter );
Packit 1c1d7e
Packit 1c1d7e
    bool doDirs	    = (filterSpec & Dirs)	!= 0;
Packit 1c1d7e
    bool doFiles    = (filterSpec & Files)	!= 0;
Packit 1c1d7e
    bool noSymLinks = (filterSpec & NoSymLinks) != 0;
Packit 1c1d7e
    bool doReadable = (filterSpec & Readable)	!= 0;
Packit 1c1d7e
    bool doWritable = (filterSpec & Writable)	!= 0;
Packit 1c1d7e
    bool doExecable = (filterSpec & Executable) != 0;
Packit 1c1d7e
    bool doHidden   = (filterSpec & Hidden)	!= 0;
Packit 1c1d7e
    // show hidden files if the user asks explicitly for e.g. .*
Packit 1c1d7e
    if ( !doHidden && !nameFilter.isEmpty() && nameFilter[0] == '.' )
Packit 1c1d7e
         doHidden = TRUE;
Packit 1c1d7e
    bool doModified = (filterSpec & Modified)   != 0;
Packit 1c1d7e
    bool doSystem   = (filterSpec & System)     != 0;
Packit 1c1d7e
Packit 1c1d7e
    QRegExp   wc( nameFilter.data(), FALSE, TRUE );    // wild card, case insensitive
Packit 1c1d7e
    bool      first = TRUE;
Packit 1c1d7e
    QString   p = dPath.copy();
Packit 1c1d7e
    int       plen = p.length();
Packit 1c1d7e
#if defined(_OS_WIN32_)
Packit 1c1d7e
    HANDLE    ff;
Packit 1c1d7e
    WIN32_FIND_DATAW finfo;
Packit 1c1d7e
#else
Packit 1c1d7e
    long      ff;
Packit 1c1d7e
    _finddata_t finfo;
Packit 1c1d7e
#endif
Packit 1c1d7e
    QFileInfo fi;
Packit 1c1d7e
    if ( plen == 0 )
Packit 1c1d7e
    {
Packit 1c1d7e
#if defined(CHECK_NULL)
Packit 1c1d7e
      warning( "QDir::readDirEntries: No directory name specified" );
Packit 1c1d7e
#endif
Packit 1c1d7e
      return FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    if ( p.at(plen-1) != '/' && p.at(plen-1) != '\\' )
Packit 1c1d7e
          p += '/';
Packit 1c1d7e
    p += "*.*";
Packit 1c1d7e
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    ff = FF_GETFIRST( p.data(), &finfo );
Packit 1c1d7e
#else
Packit 1c1d7e
    ff = FindFirstFileW ( ( LPCWSTR ) p.ucs2(), &finfo );
Packit 1c1d7e
#endif
Packit 1c1d7e
    if ( ff == FF_ERROR ) 
Packit 1c1d7e
    {
Packit 1c1d7e
#if defined(DEBUG)
Packit 1c1d7e
      warning( "QDir::readDirEntries: Cannot read the directory: %s",
Packit 1c1d7e
                           (const char *)dPath.utf8() );
Packit 1c1d7e
#endif
Packit 1c1d7e
    return FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    
Packit 1c1d7e
    while ( TRUE ) 
Packit 1c1d7e
    {
Packit 1c1d7e
	if ( first )
Packit 1c1d7e
	    first = FALSE;
Packit 1c1d7e
	else 
Packit 1c1d7e
        {
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
	    if ( FF_GETNEXT(ff,&finfo) == -1 )
Packit 1c1d7e
		break;
Packit 1c1d7e
#else
Packit 1c1d7e
	    //if ( !FF_GETNEXT(ff,&finfo) )
Packit 1c1d7e
	    //	break;
Packit 1c1d7e
            if (!FindNextFileW(ff, &finfo ))
Packit 1c1d7e
                break;
Packit 1c1d7e
#endif
Packit 1c1d7e
	}
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
	int  attrib = finfo.attrib;
Packit 1c1d7e
#else
Packit 1c1d7e
	int  attrib = finfo.dwFileAttributes;
Packit 1c1d7e
#endif
Packit 1c1d7e
	bool isDir	= (attrib & IS_SUBDIR) != 0;
Packit 1c1d7e
	bool isFile	= !isDir;
Packit 1c1d7e
	bool isSymLink	= FALSE;
Packit 1c1d7e
	bool isReadable = TRUE;
Packit 1c1d7e
	bool isWritable = (attrib & IS_RDONLY) == 0;
Packit 1c1d7e
	bool isExecable = FALSE;
Packit 1c1d7e
	bool isModified = (attrib & IS_ARCH)   != 0;
Packit 1c1d7e
	bool isHidden	= (attrib & IS_HIDDEN) != 0;
Packit 1c1d7e
	bool isSystem	= (attrib & IS_SYSTEM) != 0;
Packit 1c1d7e
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
	const char *fname = finfo.name;
Packit 1c1d7e
#else
Packit 1c1d7e
	//const char *fname = finfo.cFileName;
Packit 1c1d7e
        QString fname = QString::fromUcs2( ( const unsigned short* ) finfo.cFileName);
Packit 1c1d7e
#endif
Packit 1c1d7e
	if ( wc.match(fname.utf8()) == -1 && !(allDirs && isDir) )
Packit 1c1d7e
	    continue;
Packit 1c1d7e
Packit 1c1d7e
	QString name = fname;
Packit 1c1d7e
	if ( doExecable ) 
Packit 1c1d7e
        {
Packit 1c1d7e
	    QString ext = name.right(4).lower();
Packit 1c1d7e
	    if ( ext == ".exe" || ext == ".com" || ext == ".bat" ||
Packit 1c1d7e
		 ext == ".pif" || ext == ".cmd" )
Packit 1c1d7e
		isExecable = TRUE;
Packit 1c1d7e
	}
Packit 1c1d7e
Packit 1c1d7e
	if  ( (doDirs && isDir) || (doFiles && isFile) ) 
Packit 1c1d7e
        {
Packit 1c1d7e
	    if ( noSymLinks && isSymLink )
Packit 1c1d7e
		continue;
Packit 1c1d7e
	    if ( (filterSpec & RWEMask) != 0 )
Packit 1c1d7e
		if ( (doReadable && !isReadable) ||
Packit 1c1d7e
		     (doWritable && !isWritable) ||
Packit 1c1d7e
		     (doExecable && !isExecable) )
Packit 1c1d7e
		    continue;
Packit 1c1d7e
	    if ( doModified && !isModified )
Packit 1c1d7e
		continue;
Packit 1c1d7e
	    if ( !doHidden && isHidden )
Packit 1c1d7e
		continue;
Packit 1c1d7e
	    if ( !doSystem && isSystem )
Packit 1c1d7e
		continue;
Packit 1c1d7e
	    fi.setFile( *this, name );
Packit 1c1d7e
	    fiList->append( new QFileInfo( fi ) );
Packit 1c1d7e
	}
Packit 1c1d7e
    }
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    _findclose( ff );
Packit 1c1d7e
#else
Packit 1c1d7e
    FindClose( ff );
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
    // Sort...
Packit 1c1d7e
    QDirSortItem* si= new QDirSortItem[fiList->count()];
Packit 1c1d7e
    QFileInfo* itm;
Packit 1c1d7e
    i=0;
Packit 1c1d7e
    for (itm = fiList->first(); itm; itm = fiList->next())
Packit 1c1d7e
	si[i++].item = itm;
Packit 1c1d7e
    qt_cmp_si_sortSpec = sortSpec;
Packit 1c1d7e
    qsort( si, i, sizeof(si[0]), qt_cmp_si );
Packit 1c1d7e
    // put them back in the list
Packit 1c1d7e
    fiList->setAutoDelete( FALSE );
Packit 1c1d7e
    fiList->clear();
Packit 1c1d7e
    int j;
Packit 1c1d7e
    for ( j=0; j
Packit 1c1d7e
	fiList->append( si[j].item );
Packit 1c1d7e
	fList->append( si[j].item->fileName() );
Packit 1c1d7e
    }
Packit 1c1d7e
    delete [] si;
Packit 1c1d7e
    fiList->setAutoDelete( TRUE );
Packit 1c1d7e
Packit 1c1d7e
    if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS &&
Packit 1c1d7e
	 nameFilter == nameFilt )
Packit 1c1d7e
	dirty = FALSE;
Packit 1c1d7e
    else
Packit 1c1d7e
	dirty = TRUE;
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
const QFileInfoList * QDir::drives()
Packit 1c1d7e
{
Packit 1c1d7e
    // at most one instance of QFileInfoList is leaked, and this variable
Packit 1c1d7e
    // points to that list
Packit 1c1d7e
    static QFileInfoList * knownMemoryLeak = 0;
Packit 1c1d7e
Packit 1c1d7e
    if ( !knownMemoryLeak ) {
Packit 1c1d7e
	knownMemoryLeak = new QFileInfoList;
Packit 1c1d7e
Packit 1c1d7e
#if defined(_OS_WIN32_)
Packit 1c1d7e
	Q_UINT32 driveBits = (Q_UINT32) GetLogicalDrives() & 0x3ffffff;
Packit 1c1d7e
#elif defined(_OS_OS2EMX_)
Packit 1c1d7e
	Q_UINT32 driveBits, cur;
Packit 1c1d7e
	if (DosQueryCurrentDisk(&cur,&driveBits) != NO_ERROR)
Packit 1c1d7e
	    exit(1);
Packit 1c1d7e
	driveBits &= 0x3ffffff;
Packit 1c1d7e
#endif
Packit 1c1d7e
	char driveName[4];
Packit 1c1d7e
	qstrcpy( driveName, "a:/" );
Packit 1c1d7e
	while( driveBits ) {
Packit 1c1d7e
	    if ( driveBits & 1 )
Packit 1c1d7e
		knownMemoryLeak->append( new QFileInfo( driveName ) );
Packit 1c1d7e
	    driveName[0]++;
Packit 1c1d7e
	    driveBits = driveBits >> 1;
Packit 1c1d7e
	}
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    return knownMemoryLeak;
Packit 1c1d7e
}
Packit 1c1d7e
#endif //QT_NO_DIR