summaryrefslogtreecommitdiff
path: root/noncore/settings/sysinfo/modulesinfo.cpp
blob: a0d26c739c226348a2f494b10a344a0e7d42c83a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**********************************************************************
** ModulesInfo
**
** Display Modules information
**
** Copyright (C) 2002, Michael Lauer
**                    mickey@tm.informatik.uni-frankfurt.de
**                    http://www.Vanille.de
**
** Based on ProcessInfo by Dan Williams <williamsdr@acm.org>
**
** 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.
**
**********************************************************************/

#include <qpe/qpeapplication.h>

#include <qfile.h>
#include <qheader.h>
#include <qlayout.h>
#include <qlistview.h>
#include <qtimer.h>
#include <qwhatsthis.h>

#include "modulesinfo.h"

ModulesInfo::ModulesInfo( QWidget* parent,  const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    QVBoxLayout *layout = new QVBoxLayout( this, 5 );

    ModulesView = new QListView( this, "ModulesView" );
    int colnum = ModulesView->addColumn( tr( "Module" ) );
    colnum = ModulesView->addColumn( tr( "Size" ) );
    ModulesView->setColumnAlignment( colnum, Qt::AlignRight );
    colnum = ModulesView->addColumn( tr( "Use#" ) );
    ModulesView->setColumnAlignment( colnum, Qt::AlignRight );
    colnum = ModulesView->addColumn( tr( "Used By" ) );
    ModulesView->setAllColumnsShowFocus( TRUE );
    QPEApplication::setStylusOperation( ModulesView->viewport(), QPEApplication::RightOnHold );
    connect( ModulesView, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int ) ),
            this, SLOT( viewModules( QListViewItem * ) ) );
    layout->addWidget( ModulesView );
    QWhatsThis::add( ModulesView, tr( "This is a list of all the kernel modules currently loaded on this handheld device.\n\nClick and hold on a module to see additional information about the module, or to unload it." ) );

    QTimer *t = new QTimer( this );
    connect( t, SIGNAL( timeout() ), this, SLOT( updateData() ) );
    t->start( 5000 );

    updateData();
    
    ModulesDtl = new ModulesDetail( 0, 0, 0 );
    ModulesDtl->ModulesView->setTextFormat( PlainText );
}

ModulesInfo::~ModulesInfo()
{
}

void ModulesInfo::updateData()
{
    char modname[64];
    char usage[200];
    int modsize, usecount;
    
    ModulesView->clear();

    FILE *procfile = fopen( ( QString ) ( "/proc/modules"), "r");

    if ( procfile )
    {
        while ( true ) {                    
            int success = fscanf( procfile, "%s%d%d%[^\n]", modname, &modsize, &usecount, usage );
           
            if ( success == EOF )
                break;

            QString qmodname = QString( modname );
            QString qmodsize = QString::number( modsize ).rightJustify( 6, ' ' );
            QString qusecount = QString::number( usecount ).rightJustify( 2, ' ' );
            QString qusage = QString( usage );
            
            ( void ) new QListViewItem( ModulesView, qmodname, qmodsize, qusecount, qusage );
        }
                
        fclose( procfile );
    }
}

void ModulesInfo::viewModules( QListViewItem *modules )
{
    QString modname = modules->text( 0 );   
    ModulesDtl->setCaption( QString( "Module: " ) + modname );
    ModulesDtl->modname = modname;
    QString command = QString( "/sbin/modinfo " ) + modules->text( 0 );
    
    FILE* modinfo = popen( command, "r" );
    
    if ( modinfo )
    {
        char line[200];
        ModulesDtl->ModulesView->setText( " Details:\n------------\n" );
        
        while( true )
        {        
            int success = fscanf( modinfo, "%[^\n]\n", line );
            if ( success == EOF )
                break;         
            ModulesDtl->ModulesView->append( line );
        }
        
        pclose( modinfo );
    }

    ModulesDtl->showMaximized();
}