mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-24 19:02:51 +00:00
99 lines
2.3 KiB
C++
99 lines
2.3 KiB
C++
#include <QString>
|
|
#include <QProcess>
|
|
#include <klocale.h>
|
|
|
|
#include "lsof.h"
|
|
|
|
struct KLsofWidgetPrivate
|
|
{
|
|
qlonglong pid;
|
|
QProcess *process;
|
|
};
|
|
|
|
KLsofWidget::KLsofWidget(QWidget *parent)
|
|
: QTreeWidget(parent), d(new KLsofWidgetPrivate())
|
|
{
|
|
d->pid = -1;
|
|
setColumnCount(3);
|
|
setUniformRowHeights(true);
|
|
setRootIsDecorated(false);
|
|
setItemsExpandable(false);
|
|
setSortingEnabled(true);
|
|
setAllColumnsShowFocus(true);
|
|
setHeaderLabels(QStringList() << i18nc("Short for File Descriptor", "FD") << i18n("Type") << i18n("Object"));
|
|
d->process = new QProcess(this);
|
|
connect(d->process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished(int,QProcess::ExitStatus)));
|
|
}
|
|
|
|
KLsofWidget::~KLsofWidget()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
qlonglong KLsofWidget::pid() const
|
|
{
|
|
return d->pid;
|
|
}
|
|
|
|
void KLsofWidget::setPid(qlonglong pid)
|
|
{
|
|
d->pid = pid;
|
|
update();
|
|
}
|
|
|
|
bool KLsofWidget::update()
|
|
{
|
|
clear();
|
|
QStringList args;
|
|
d->process->waitForFinished();
|
|
args << "-Fftn";
|
|
if (d->pid > 0) {
|
|
args << ("-p" + QString::number(d->pid));
|
|
}
|
|
d->process->start("lsof", args);
|
|
return true;
|
|
}
|
|
|
|
void KLsofWidget::finished(int exitCode, QProcess::ExitStatus exitStatus)
|
|
{
|
|
Q_UNUSED(exitCode);
|
|
Q_UNUSED(exitStatus);
|
|
|
|
char buf[1024];
|
|
QTreeWidgetItem *process = NULL;
|
|
while (true) {
|
|
::memset(buf, '\0', sizeof(buf) * sizeof(char));
|
|
qint64 lineLength = d->process->readLine(buf, sizeof(buf));
|
|
|
|
if (lineLength <= 0) {
|
|
break;
|
|
}
|
|
if (buf[lineLength-1] == '\n') {
|
|
lineLength--;
|
|
}
|
|
|
|
switch(buf[0]) {
|
|
/* Process related stuff */
|
|
case 'f': {
|
|
process = new QTreeWidgetItem(this);
|
|
process->setText(0,QString::fromUtf8(buf+1, lineLength - 1));
|
|
break;
|
|
}
|
|
case 't': {
|
|
if (process)
|
|
process->setText(1,QString::fromUtf8(buf+1, lineLength - 1));
|
|
break;
|
|
}
|
|
case 'n': {
|
|
if (process)
|
|
process->setText(2,QString::fromUtf8(buf+1, lineLength - 1));
|
|
break;
|
|
}
|
|
default: {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#include "moc_lsof.cpp"
|