33 #include <config-kleopatra.h>
42 #include <gpgme++/key.h>
45 #include <KMessageBox>
47 #include <KPushButton>
48 #include <KStandardGuiItem>
49 #include <KGlobalSettings>
61 class DumpCertificateDialog :
public QDialog {
64 explicit DumpCertificateDialog(
QWidget * parent=0 )
71 void updateRequested();
74 void append(
const QString & line ) {
75 ui.logTextWidget.message( line );
78 ui.logTextWidget.clear();
84 KPushButton updateButton, closeButton;
88 explicit Ui( DumpCertificateDialog *
q )
90 updateButton( i18nc(
"@action:button Update the log text widget",
"&Update"), q ),
91 closeButton( KStandardGuiItem::close(), q ),
101 logTextWidget.setFont( KGlobalSettings::fixedFont() );
102 logTextWidget.setMinimumVisibleLines( 25 );
103 logTextWidget.setMinimumVisibleColumns( 80 );
105 vlay.addWidget( &logTextWidget, 1 );
106 vlay.addLayout( &hlay );
108 hlay.addWidget( &updateButton );
109 hlay.addStretch( 1 );
110 hlay.addWidget( &closeButton );
112 connect( &updateButton, SIGNAL(clicked()),
113 q, SIGNAL(updateRequested()) );
114 connect( &closeButton, SIGNAL(clicked()),
121 using namespace Kleo;
122 using namespace Kleo::Commands;
125 while ( ba.endsWith(
'\n' ) || ba.endsWith(
'\r' ) )
131 friend class ::Kleo::Commands::DumpCertificateCommand;
137 QString errorString()
const {
138 return QString::fromLocal8Bit( errorBuffer );
146 void slotProcessFinished(
int, QProcess::ExitStatus );
148 void slotProcessReadyReadStandardOutput() {
149 while (
process.canReadLine() ) {
150 const QString line = QString::fromUtf8(
chomped(
process.readLine() ) );
152 dialog->append( line );
153 outputBuffer.push_back( line );
157 void slotProcessReadyReadStandardError() {
158 errorBuffer +=
process.readAllStandardError();
161 void slotUpdateRequested() {
162 if (
process.state() == QProcess::NotRunning )
166 void slotDialogDestroyed() {
168 if (
process.state() != QProcess::NotRunning )
175 QPointer<DumpCertificateDialog> dialog;
177 QByteArray errorBuffer;
178 QStringList outputBuffer;
183 DumpCertificateCommand::Private * DumpCertificateCommand::d_func() {
return static_cast<Private*
>(
d.
get() ); }
184 const DumpCertificateCommand::Private * DumpCertificateCommand::d_func()
const {
return static_cast<const Private*
>(
d.
get() ); }
197 process.setOutputChannelMode( KProcess::SeparateChannels );
198 process.setReadChannel( KProcess::StandardOutput );
201 DumpCertificateCommand::Private::~Private() {
202 if ( dialog && !dialog->isVisible() )
207 :
Command( new Private( this, c ) )
213 :
Command( v, new Private( this, c ) )
219 :
Command( k, new Private( this, 0 ) )
224 void DumpCertificateCommand::Private::init() {
225 connect( &
process, SIGNAL(finished(
int,QProcess::ExitStatus)),
226 q, SLOT(slotProcessFinished(
int,QProcess::ExitStatus)) );
227 connect( &
process, SIGNAL(readyReadStandardError()),
228 q, SLOT(slotProcessReadyReadStandardError()) );
229 connect( &
process, SIGNAL(readyReadStandardOutput()),
230 q, SLOT(slotProcessReadyReadStandardOutput()) );
231 if ( !key().isNull() )
232 process <<
gpgSmPath() << QLatin1String(
"--dump-cert") << QLatin1String(key().primaryFingerprint());
246 return d->outputBuffer;
249 void DumpCertificateCommand::doStart() {
251 const std::vector<GpgME::Key> keys =
d->keys();
252 if ( keys.size() != 1 || keys.front().protocol() !=
GpgME::CMS ) {
257 if (
d->useDialog ) {
258 d->dialog =
new DumpCertificateDialog;
259 d->dialog->setAttribute( Qt::WA_DeleteOnClose );
260 d->dialog->setWindowTitle( i18n(
"Certificate Dump") );
262 connect(
d->dialog, SIGNAL(updateRequested()),
263 this, SLOT(slotUpdateRequested()) );
264 connect(
d->dialog, SIGNAL(destroyed()),
265 this, SLOT(slotDialogDestroyed()) );
271 void DumpCertificateCommand::Private::refreshView() {
276 outputBuffer.clear();
280 if (
process.waitForStarted() ) {
284 KMessageBox::error( dialog ? static_cast<QWidget*>( dialog ) : parentWidgetOrView(),
285 i18n(
"Unable to start process gpgsm. "
286 "Please check your installation." ),
287 i18n(
"Dump Certificate Error" ) );
292 void DumpCertificateCommand::doCancel() {
294 if (
d->process.state() != QProcess::NotRunning ) {
295 d->process.terminate();
303 void DumpCertificateCommand::Private::slotProcessFinished(
int code, QProcess::ExitStatus
status ) {
305 if ( status == QProcess::CrashExit )
306 KMessageBox::error( dialog,
307 i18n(
"The GpgSM process that tried to dump the certificate "
308 "ended prematurely because of an unexpected error. "
309 "Please check the output of gpgsm --dump-cert %1 for details.",
310 QLatin1String(key().primaryFingerprint()) ),
311 i18n(
"Dump Certificate Error" ) );
313 KMessageBox::error( dialog,
314 i18n(
"An error occurred while trying to dump the certificate. "
315 "The output from GpgSM was:\n%1", errorString() ),
316 i18n(
"Dump Certificate Error" ) );
319 slotDialogDestroyed();
325 #include "moc_dumpcertificatecommand.cpp"
326 #include "dumpcertificatecommand.moc"
DumpCertificateCommand(QAbstractItemView *view, KeyListController *parent)
A high-speed text display widget.
kdtools::pimpl_ptr< Private > d
VerifyChecksumsDialog::Status status
void setUseDialog(bool on)
static const int PROCESS_TERMINATE_TIMEOUT
static QString process(const Dir &dir, bool *fatal)
~DumpCertificateCommand()
QStringList output() const
static QByteArray chomped(QByteArray ba)