Diffstat (limited to 'noncore/settings/sysinfo/storage.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/settings/sysinfo/storage.cpp | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/noncore/settings/sysinfo/storage.cpp b/noncore/settings/sysinfo/storage.cpp new file mode 100644 index 0000000..4e81170 --- a/dev/null +++ b/noncore/settings/sysinfo/storage.cpp @@ -0,0 +1,220 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <qlabel.h> +#include <qlayout.h> +#include <qtimer.h> +#include <qlayout.h> +#include "graph.h" +#include "storage.h" + +#include <stdio.h> +#if defined(_OS_LINUX_) || defined(Q_OS_LINUX) +#include <sys/vfs.h> +#include <mntent.h> +#endif + +StorageInfo::StorageInfo( QWidget *parent, const char *name ) + : QWidget( parent, name ) +{ + vb = 0; + disks.setAutoDelete(TRUE); + lines.setAutoDelete(TRUE); + updateMounts(); + startTimer( 5000 ); +} + +void StorageInfo::timerEvent(QTimerEvent*) +{ + updateMounts(); +} + +static bool isCF(const QString& m) +{ + FILE* f = fopen("/var/run/stab", "r"); + if (!f) f = fopen("/var/state/pcmcia/stab", "r"); + if (!f) f = fopen("/var/lib/pcmcia/stab", "r"); + if ( f ) { + char line[1024]; + char devtype[80]; + char devname[80]; + while ( fgets( line, 1024, f ) ) { + // 0 ide ide-cs 0 hda 3 0 + if ( sscanf(line,"%*d %s %*s %*s %s", devtype, devname )==2 ) + { + if ( QString(devtype) == "ide" && m.find(devname)>0 ) { + fclose(f); + return TRUE; + } + } + } + fclose(f); + } + return FALSE; +} + +void StorageInfo::updateMounts() +{ +#if defined(_OS_LINUX_) || defined(Q_OS_LINUX) + struct mntent *me; + FILE *mntfp = setmntent( "/etc/mtab", "r" ); + QStringList curdisks; + QStringList curfs; + bool rebuild = FALSE; + int n=0; + if ( mntfp ) { + while ( (me = getmntent( mntfp )) != 0 ) { + QString fs = me->mnt_fsname; + if ( fs.left(7)=="/dev/hd" || fs.left(7)=="/dev/sd" + || fs.left(8)=="/dev/mtd" || fs.left(9) == "/dev/mmcd" ) + { + n++; + curdisks.append(fs); + QString d = me->mnt_dir; + curfs.append(d); + if ( !disks.find(d) ) + rebuild = TRUE; + } + } + endmntent( mntfp ); + } + if ( rebuild || n != (int)disks.count() ) { + disks.clear(); + lines.clear(); + delete vb; + vb = new QVBoxLayout( this, n > 3 ? 1 : 5 ); + bool frst=TRUE; + QStringList::ConstIterator it=curdisks.begin(); + QStringList::ConstIterator fsit=curfs.begin(); + for (; it!=curdisks.end(); ++it, ++fsit) { + if ( !frst ) { + QFrame *f = new QFrame( this ); + vb->addWidget(f); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + lines.append(f); + f->show(); + } frst=FALSE; + QString humanname=*it; + if ( isCF(humanname) ) + humanname = tr("CF Card"); + else if ( humanname == "/dev/hda1" ) + humanname = tr("Hard Disk"); + else if ( humanname.left(9) == "/dev/mmcd" ) + humanname = tr("SD Card"); + else if ( humanname.left(7) == "/dev/hd" ) + humanname = tr("Hard Disk") + " " + humanname.mid(7); + else if ( humanname.left(7) == "/dev/sd" ) + humanname = tr("SCSI Hard Disk") + " " + humanname.mid(7); + else if ( humanname == "/dev/mtdblock1" || humanname == "/dev/mtdblock/1" ) + humanname = tr("Internal Storage"); + else if ( humanname.left(14) == "/dev/mtdblock/" ) + humanname = tr("Internal Storage") + " " + humanname.mid(14); + else if ( humanname.left(13) == "/dev/mtdblock" ) + humanname = tr("Internal Storage") + " " + humanname.mid(13); + // etc. + MountInfo* mi = new MountInfo( *fsit, humanname, this ); + vb->addWidget(mi); + disks.insert(*fsit,mi); + mi->show(); + } + vb->addStretch(); + } else { + // just update them + for (QDictIterator<MountInfo> i(disks); i.current(); ++i) + i.current()->updateData(); + } +#endif +} + + +MountInfo::MountInfo( const QString &path, const QString &ttl, QWidget *parent, const char *name ) + : QWidget( parent, name ), title(ttl) +{ + fs = new FileSystem( path ); + QVBoxLayout *vb = new QVBoxLayout( this, 3 ); + + totalSize = new QLabel( this ); + vb->addWidget( totalSize ); + + data = new GraphData(); + graph = new BarGraph( this ); + graph->setFrameStyle( QFrame::Panel | QFrame::Sunken ); + vb->addWidget( graph, 1 ); + graph->setData( data ); + + legend = new GraphLegend( this ); + legend->setOrientation(Horizontal); + vb->addWidget( legend ); + legend->setData( data ); + + updateData(); +} + +MountInfo::~MountInfo() +{ + delete data; + delete fs; +} + +void MountInfo::updateData() +{ + fs->update(); + + long mult = fs->blockSize() / 1024; + long div = 1024 / fs->blockSize(); + if ( !mult ) mult = 1; + if ( !div ) div = 1; + long total = fs->totalBlocks() * mult / div; + long avail = fs->availBlocks() * mult / div; + long used = total - avail; + totalSize->setText( title + tr(" total: %1 kB").arg( total ) ); + data->clear(); + data->addItem( tr("Used (%1 kB)").arg(used), used ); + data->addItem( tr("Available (%1 kB)").arg(avail), avail ); + graph->repaint( FALSE ); + legend->update(); + graph->show(); + legend->show(); +} + +//--------------------------------------------------------------------------- + +FileSystem::FileSystem( const QString &p ) + : fspath( p ), blkSize(512), totalBlks(0), availBlks(0) +{ + update(); +} + +void FileSystem::update() +{ +#if defined(_OS_LINUX_) || defined(Q_OS_LINUX) + struct statfs fs; + if ( !statfs( fspath.latin1(), &fs ) ) { + blkSize = fs.f_bsize; + totalBlks = fs.f_blocks; + availBlks = fs.f_bavail; + } else { + blkSize = 0; + totalBlks = 0; + availBlks = 0; + } +#endif +} + |