summaryrefslogtreecommitdiff
path: root/noncore/settings/sysinfo/storage.cpp
Side-by-side diff
Diffstat (limited to 'noncore/settings/sysinfo/storage.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/sysinfo/storage.cpp220
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
+}
+