/* * * $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 <tdelocale.h> #include <tdemessagebox.h> #include <tqpushbutton.h> #include <sys/types.h> #include <signal.h> static TQString joinProcessNames( const TQValueList<K3bLsofWrapper::Process>& apps ) { TQStringList l; for( TQValueList<K3bLsofWrapper::Process>::const_iterator it = apps.begin(); it != apps.end(); ++it ) l.append( (*it).name ); return l.join( ", " ); } K3bLsofWrapperDialog::K3bLsofWrapperDialog( TQWidget* 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, TQT_SIGNAL(user1Clicked()), TQT_SLOT(slotQuitOtherApps()) ); connect( this, TQT_SIGNAL(user2Clicked()), TQT_SLOT(slotCheckDevice()) ); } K3bLsofWrapperDialog::~K3bLsofWrapperDialog() { } bool K3bLsofWrapperDialog::slotCheckDevice() { K3bLsofWrapper lsof; if( lsof.checkDevice( m_device ) ) { const TQValueList<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 TQValueList<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( TQValueList<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, TQWidget* parent ) { K3bLsofWrapperDialog dlg( parent ); dlg.m_device = dev; if( dlg.slotCheckDevice() ) dlg.exec(); } #include "k3blsofwrapperdialog.moc"