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