You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
k3b/libk3b/tools/k3bfilesysteminfo.cpp

142 lines
2.6 KiB

/*
*
* $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $
* Copyright (C) 2006 Sebastian Trueg <trueg@k3b.org>
*
* This file is part of the K3b project.
* Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* See the file "COPYING" for the exact licensing terms.
*/
#include <config.h>
#include "k3bfilesysteminfo.h"
#include <k3bglobals.h>
#include <tqfile.h>
#include <tqfileinfo.h>
#include <tqregexp.h>
#include <kdebug.h>
#ifdef Q_OS_FREEBSD
#include <sys/param.h>
#include <sys/mount.h>
#endif
#ifdef HAVE_SYS_STATVFS_H
# include <sys/statvfs.h>
# if defined(Q_OS_NETBSD)
# include <sys/param.h>
# if __NetBSD_Version__ > 299000000
# define statfs statvfs
# define f_type f_fsid
# endif
# endif
#endif
#ifdef HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#include <errno.h>
#include <string.h>
class K3bFileSystemInfo::Private
{
public:
Private()
: type(FS_UNKNOWN),
statDone(false) {
}
FileSystemType type;
TQString path;
bool statDone;
void stat() {
struct statfs fs;
if( !::statfs( TQFile::encodeName( TQFileInfo(path).dirPath( true ) ), &fs ) ) {
switch( fs.f_type ) {
case 0x4d44: // MS-DOS
type = FS_FAT;
default:
type = FS_UNKNOWN;
}
statDone = true;
}
else {
kdDebug() << "(K3bFileSystemInfo) statfs failed: " << ::strerror(errno) << endl;
}
}
};
K3bFileSystemInfo::K3bFileSystemInfo()
{
d = new Private;
}
K3bFileSystemInfo::K3bFileSystemInfo( const TQString& path )
{
d = new Private;
d->path = path;
}
K3bFileSystemInfo::K3bFileSystemInfo( const K3bFileSystemInfo& other )
{
d = new Private;
d->type = other.d->type;
d->path = other.d->path;
d->statDone = other.d->statDone;
}
K3bFileSystemInfo::~K3bFileSystemInfo()
{
delete d;
}
TQString K3bFileSystemInfo::path() const
{
return d->path;
}
void K3bFileSystemInfo::setPath( const TQString& path )
{
if( d->path != path ) {
d->path = path;
d->statDone = false;
}
}
K3bFileSystemInfo::FileSystemType K3bFileSystemInfo::type() const
{
if( !d->statDone )
d->stat();
return d->type;
}
TQString K3bFileSystemInfo::fixupPath( const TQString& path )
{
TQString s = K3b::fixupPath( path );
if( type() == K3bFileSystemInfo::FS_FAT )
return s.replace( TQRegExp("[\"\\?\\*/\\\\[\\]\\|\\=\\:;]"), "_" );
else
return s;
}