Blame qtools/qfileinfo_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 qfileinfo_unix.cpp 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1992-2000 Trolltech AS.
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include "qglobal.h"
Packit 1c1d7e
Packit 1c1d7e
#include "qfileinfo.h"
Packit 1c1d7e
#include "qfiledefs_p.h"
Packit 1c1d7e
#include "qdatetime.h"
Packit 1c1d7e
#include "qdir.h"
Packit 1c1d7e
Packit 1c1d7e
static void reslashify( 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
void QFileInfo::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
void QFileInfo::makeAbs( QString & )
Packit 1c1d7e
{
Packit 1c1d7e
  // TODO: what to do here?
Packit 1c1d7e
  return;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
extern bool qt_file_access( const QString& fn, int t );
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns TRUE if we are pointing to a real file.
Packit 1c1d7e
  \sa isDir(), isSymLink()
Packit 1c1d7e
*/
Packit 1c1d7e
bool QFileInfo::isFile() const
Packit 1c1d7e
{
Packit 1c1d7e
    if ( !fic || !cache )
Packit 1c1d7e
	doStat();
Packit 1c1d7e
    return fic ? (fic->st.st_mode & STAT_MASK) == STAT_REG : FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns TRUE if we are pointing to a directory or a symbolic link to
Packit 1c1d7e
  a directory.
Packit 1c1d7e
  \sa isFile(), isSymLink()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
bool QFileInfo::isDir() const
Packit 1c1d7e
{
Packit 1c1d7e
    if ( !fic || !cache )
Packit 1c1d7e
	doStat();
Packit 1c1d7e
    return fic ? (fic->st.st_mode & STAT_MASK) == STAT_DIR : FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns TRUE if we are pointing to a symbolic link.
Packit 1c1d7e
  \sa isFile(), isDir(), readLink()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
bool QFileInfo::isSymLink() const
Packit 1c1d7e
{
Packit 1c1d7e
    if ( !fic || !cache )
Packit 1c1d7e
	doStat();
Packit 1c1d7e
    return fic ? fic->isSymLink : FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the name a symlink points to, or a null QString if the
Packit 1c1d7e
  object does not refer to a symbolic link.
Packit 1c1d7e
Packit 1c1d7e
  This name may not represent an existing file; it is only a string.
Packit 1c1d7e
  QFileInfo::exists() returns TRUE if the symlink points to an
Packit 1c1d7e
  existing file.
Packit 1c1d7e
Packit 1c1d7e
  \sa exists(), isSymLink(), isDir(), isFile()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QString QFileInfo::readLink() const
Packit 1c1d7e
{
Packit 1c1d7e
    QString r;
Packit 1c1d7e
    return r;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static const uint nobodyID = (uint) -2;
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the owner of the file.
Packit 1c1d7e
Packit 1c1d7e
  On systems where files do not have owners this function returns 
Packit 1c1d7e
  a null string.
Packit 1c1d7e
Packit 1c1d7e
  Note that this function can be time-consuming under UNIX. (in the order
Packit 1c1d7e
  of milliseconds on a 486 DX2/66 running Linux).
Packit 1c1d7e
Packit 1c1d7e
  \sa ownerId(), group(), groupId()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QString QFileInfo::owner() const
Packit 1c1d7e
{
Packit 1c1d7e
    return QString::null;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the id of the owner of the file.
Packit 1c1d7e
Packit 1c1d7e
  On systems where files do not have owners this function returns ((uint) -2).
Packit 1c1d7e
Packit 1c1d7e
  \sa owner(), group(), groupId()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
uint QFileInfo::ownerId() const
Packit 1c1d7e
{
Packit 1c1d7e
    return (uint)-2;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the group the file belongs to.
Packit 1c1d7e
Packit 1c1d7e
  On systems where files do not have groups this function always
Packit 1c1d7e
  returns 0.
Packit 1c1d7e
Packit 1c1d7e
  Note that this function can be time-consuming under UNIX (in the order of
Packit 1c1d7e
  milliseconds on a 486 DX2/66 running Linux).
Packit 1c1d7e
Packit 1c1d7e
  \sa groupId(), owner(), ownerId()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QString QFileInfo::group() const
Packit 1c1d7e
{
Packit 1c1d7e
    return QString::null;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the id of the group the file belongs to.
Packit 1c1d7e
Packit 1c1d7e
  On systems where files do not have groups this function always
Packit 1c1d7e
  returns ((uind) -2).
Packit 1c1d7e
Packit 1c1d7e
  \sa group(), owner(), ownerId()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
uint QFileInfo::groupId() const
Packit 1c1d7e
{
Packit 1c1d7e
    return (uint)-2;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  \fn bool QFileInfo::permission( int permissionSpec ) const
Packit 1c1d7e
Packit 1c1d7e
  Tests for file permissions.  The \e permissionSpec argument can be several
Packit 1c1d7e
  flags of type PermissionSpec or'ed together to check for permission
Packit 1c1d7e
  combinations.
Packit 1c1d7e
Packit 1c1d7e
  On systems where files do not have permissions this function always
Packit 1c1d7e
  returns TRUE.
Packit 1c1d7e
Packit 1c1d7e
  Example:
Packit 1c1d7e
  \code
Packit 1c1d7e
    QFileInfo fi( "/tmp/tonsils" );
Packit 1c1d7e
    if ( fi.permission( QFileInfo::WriteUser | QFileInfo::ReadGroup ) )
Packit 1c1d7e
	qWarning( "Tonsils can be changed by me, and the group can read them.");
Packit 1c1d7e
    if ( fi.permission( QFileInfo::WriteGroup | QFileInfo::WriteOther ) )
Packit 1c1d7e
	qWarning( "Danger! Tonsils can be changed by the group or others!" );
Packit 1c1d7e
  \endcode
Packit 1c1d7e
Packit 1c1d7e
  \sa isReadable(), isWritable(), isExecutable()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
bool QFileInfo::permission( int permissionSpec ) const
Packit 1c1d7e
{
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the file size in bytes, or 0 if the file does not exist if the size
Packit 1c1d7e
  cannot be fetched.
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
uint QFileInfo::size() const
Packit 1c1d7e
{
Packit 1c1d7e
    if ( !fic || !cache )
Packit 1c1d7e
	doStat();
Packit 1c1d7e
    if ( fic )
Packit 1c1d7e
	return (uint)fic->st.st_size;
Packit 1c1d7e
    else
Packit 1c1d7e
	return 0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the date and time when the file was last modified.
Packit 1c1d7e
  \sa lastRead()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QDateTime QFileInfo::lastModified() const
Packit 1c1d7e
{
Packit 1c1d7e
    QDateTime dt;
Packit 1c1d7e
    if ( !fic || !cache )
Packit 1c1d7e
	doStat();
Packit 1c1d7e
    if ( fic )
Packit 1c1d7e
	dt.setTime_t( fic->st.st_mtime );
Packit 1c1d7e
    return dt;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the date and time when the file was last read (accessed).
Packit 1c1d7e
Packit 1c1d7e
  On systems that do not support last read times, the modification time is
Packit 1c1d7e
  returned.
Packit 1c1d7e
Packit 1c1d7e
  \sa lastModified()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QDateTime QFileInfo::lastRead() const
Packit 1c1d7e
{
Packit 1c1d7e
    QDateTime dt;
Packit 1c1d7e
    if ( !fic || !cache )
Packit 1c1d7e
	doStat();
Packit 1c1d7e
    if ( fic )
Packit 1c1d7e
	dt.setTime_t( fic->st.st_atime );
Packit 1c1d7e
    return dt;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void QFileInfo::doStat() const
Packit 1c1d7e
{
Packit 1c1d7e
    QFileInfo *that = ((QFileInfo*)this);	// mutable function
Packit 1c1d7e
    if ( !that->fic )
Packit 1c1d7e
	that->fic = new QFileInfoCache;
Packit 1c1d7e
    STATBUF *b = &that->fic->st;
Packit 1c1d7e
    that->fic->isSymLink = FALSE;
Packit 1c1d7e
Packit 1c1d7e
#if defined(__CYGWIN32_)
Packit 1c1d7e
    int r;
Packit 1c1d7e
Packit 1c1d7e
    r = STAT( QFile::encodeName(fn), b );
Packit 1c1d7e
Packit 1c1d7e
    if ( r != 0 ) {
Packit 1c1d7e
	delete that->fic;
Packit 1c1d7e
	that->fic = 0;
Packit 1c1d7e
    }
Packit 1c1d7e
#else
Packit 1c1d7e
    QString file = fn;
Packit 1c1d7e
    file = QDir::cleanDirPath(file);
Packit 1c1d7e
    reslashify(file);
Packit 1c1d7e
#ifdef QT_LARGEFILE_SUPPORT
Packit 1c1d7e
    if ( _wstati64( (wchar_t*) file.ucs2(), b ) == -1 ) {
Packit 1c1d7e
#else
Packit 1c1d7e
    if ( _wstat( (wchar_t*) file.ucs2(), b ) == -1 ) {
Packit 1c1d7e
#endif
Packit 1c1d7e
      delete that->fic;
Packit 1c1d7e
      that->fic = 0;
Packit 1c1d7e
    }
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the directory path of the file.
Packit 1c1d7e
Packit 1c1d7e
  If \e absPath is TRUE an absolute path is always returned.
Packit 1c1d7e
Packit 1c1d7e
  \sa dir(), filePath(), fileName(), isRelative()
Packit 1c1d7e
*/
Packit 1c1d7e
#ifndef QT_NO_DIR
Packit 1c1d7e
QString QFileInfo::dirPath( bool absPath ) const
Packit 1c1d7e
{
Packit 1c1d7e
    QString s;
Packit 1c1d7e
    if ( absPath )
Packit 1c1d7e
	s = absFilePath();
Packit 1c1d7e
    else
Packit 1c1d7e
	s = fn;
Packit 1c1d7e
    int pos = s.findRev( '/' );
Packit 1c1d7e
    if ( pos == -1 ) {
Packit 1c1d7e
	return QString::fromLatin1(".");
Packit 1c1d7e
    } else {
Packit 1c1d7e
	if ( pos == 0 )
Packit 1c1d7e
	    return QString::fromLatin1( "/" );
Packit 1c1d7e
	return s.left( pos );
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
#endif
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the name of the file, the file path is not included.
Packit 1c1d7e
Packit 1c1d7e
  Example:
Packit 1c1d7e
  \code
Packit 1c1d7e
     QFileInfo fi( "/tmp/abdomen.lower" );
Packit 1c1d7e
     QString name = fi.fileName();		// name = "abdomen.lower"
Packit 1c1d7e
  \endcode
Packit 1c1d7e
Packit 1c1d7e
  \sa isRelative(), filePath(), baseName(), extension()
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
QString QFileInfo::fileName() const
Packit 1c1d7e
{
Packit 1c1d7e
    int p = fn.findRev( '/' );
Packit 1c1d7e
    if ( p == -1 ) {
Packit 1c1d7e
	return fn;
Packit 1c1d7e
    } else {
Packit 1c1d7e
	return fn.mid(p+1);
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*!
Packit 1c1d7e
  Returns the absolute path name.
Packit 1c1d7e
Packit 1c1d7e
  The absolute path name is the file name including the absolute path. If
Packit 1c1d7e
  the QFileInfo is absolute (i.e. not relative) this function will return
Packit 1c1d7e
  the same string as filePath().
Packit 1c1d7e
Packit 1c1d7e
  Note that this function can be time-consuming under UNIX. (in the order
Packit 1c1d7e
  of milliseconds on a 486 DX2/66 running Linux).
Packit 1c1d7e
Packit 1c1d7e
  \sa isRelative(), filePath()
Packit 1c1d7e
*/
Packit 1c1d7e
#ifndef QT_NO_DIR
Packit 1c1d7e
QString QFileInfo::absFilePath() const
Packit 1c1d7e
{
Packit 1c1d7e
    if ( QDir::isRelativePath(fn) ) {
Packit 1c1d7e
	QString tmp = QDir::currentDirPath();
Packit 1c1d7e
	tmp += '/';
Packit 1c1d7e
	tmp += fn;
Packit 1c1d7e
	makeAbs( tmp );
Packit 1c1d7e
	return QDir::cleanDirPath( tmp );
Packit 1c1d7e
    } else {
Packit 1c1d7e
	QString tmp = fn;
Packit 1c1d7e
	makeAbs( tmp );
Packit 1c1d7e
	return QDir::cleanDirPath( tmp );
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
#endif