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
123
124
125
126
127
|
/*
*
* $Id: k3bapplication.cpp 567271 2006-07-28 13:19:18Z 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 "k3blsofwrapperdialog.h"
#include "k3blsofwrapper.h"
#include <k3brichtextlabel.h>
#include <k3bdevice.h>
#include <kdebug.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <qpushbutton.h>
#include <sys/types.h>
#include <signal.h>
static QString joinProcessNames( const QValueList<K3bLsofWrapper::Process>& apps )
{
QStringList l;
for( QValueList<K3bLsofWrapper::Process>::const_iterator it = apps.begin();
it != apps.end(); ++it )
l.append( (*it).name );
return l.join( ", " );
}
K3bLsofWrapperDialog::K3bLsofWrapperDialog( QWidget* parent )
: KDialogBase( KDialogBase::Swallow,
i18n("Device in use"),
Close|User1|User2,
Close,
parent,
0,
true,
true,
KGuiItem( i18n("Quit the other applications") ),
KGuiItem( i18n("Check again") ) )
{
setButtonText( Close, i18n("Continue") );
m_label = new K3bRichTextLabel( this );
setMainWidget( m_label );
connect( this, SIGNAL(user1Clicked()), SLOT(slotQuitOtherApps()) );
connect( this, SIGNAL(user2Clicked()), SLOT(slotCheckDevice()) );
}
K3bLsofWrapperDialog::~K3bLsofWrapperDialog()
{
}
bool K3bLsofWrapperDialog::slotCheckDevice()
{
K3bLsofWrapper lsof;
if( lsof.checkDevice( m_device ) ) {
const QValueList<K3bLsofWrapper::Process>& apps = lsof.usingApplications();
if( apps.count() > 0 ) {
m_label->setText( i18n("<p>Device <b>'%1'</b> is already in use by other applications "
"(<em>%2</em>)."
"<p>It is highly recommended to quit those before continuing. "
"Otherwise K3b might not be able to fully access the device."
"<p><em>Hint: Sometimes shutting down an application does not "
"happen instantly. In that case you might have to use the '%3' "
"button.")
.arg( m_device->vendor() + " - " + m_device->description() )
.arg( joinProcessNames(apps) )
.arg( actionButton( User2 )->text() ) );
return true;
}
}
// once no apps are running we can close the dialog
close();
return false;
}
void K3bLsofWrapperDialog::slotQuitOtherApps()
{
K3bLsofWrapper lsof;
if( lsof.checkDevice( m_device ) ) {
const QValueList<K3bLsofWrapper::Process>& apps = lsof.usingApplications();
if( apps.count() > 0 ) {
if( KMessageBox::warningYesNo( this,
i18n("<p>Do you really want K3b to kill the following processes: <em>")
+ joinProcessNames(apps) ) == KMessageBox::Yes ) {
for( QValueList<K3bLsofWrapper::Process>::const_iterator it = apps.begin();
it != apps.end(); ++it )
::kill( (*it).pid, SIGTERM );
}
else
return;
}
}
// after quitting the other applications recheck for running ones
slotCheckDevice();
}
void K3bLsofWrapperDialog::checkDevice( K3bDevice::Device* dev, QWidget* parent )
{
K3bLsofWrapperDialog dlg( parent );
dlg.m_device = dev;
if( dlg.slotCheckDevice() )
dlg.exec();
}
#include "k3blsofwrapperdialog.moc"
|