• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

kleopatra

  • sources
  • kde-4.12
  • kdepim
  • kleopatra
  • crypto
decryptverifyfilescontroller.cpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset:4 -*-
2  decryptverifyfilescontroller.cpp
3 
4  This file is part of Kleopatra, the KDE keymanager
5  Copyright (c) 2008 Klarälvdalens Datakonsult AB
6 
7  Kleopatra is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11 
12  Kleopatra is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 
21  In addition, as a special exception, the copyright holders give
22  permission to link the code of this program with any edition of
23  the Qt library by Trolltech AS, Norway (or with modified versions
24  of Qt that use the same license as Qt), and distribute linked
25  combinations including the two. You must obey the GNU General
26  Public License in all respects for all of the code used other than
27  Qt. If you modify this file, you may extend this exception to
28  your version of the file, but you are not obligated to do so. If
29  you do not wish to do so, delete this exception statement from
30  your version.
31 */
32 
33 #include <config-kleopatra.h>
34 
35 #include "decryptverifyfilescontroller.h"
36 
37 #include <crypto/gui/decryptverifyoperationwidget.h>
38 #include <crypto/gui/decryptverifyfileswizard.h>
39 #include <crypto/decryptverifytask.h>
40 #include <crypto/taskcollection.h>
41 
42 #include <utils/classify.h>
43 #include <utils/gnupg-helper.h>
44 #include <utils/path-helper.h>
45 #include <utils/input.h>
46 #include <utils/output.h>
47 #include <utils/kleo_assert.h>
48 #include <utils/archivedefinition.h>
49 
50 #include <KDebug>
51 #include <KLocalizedString>
52 
53 #include <QDir>
54 #include <QFile>
55 #include <QFileInfo>
56 #include <QPointer>
57 #include <QTimer>
58 
59 #include <boost/shared_ptr.hpp>
60 
61 #include <memory>
62 #include <vector>
63 
64 using namespace boost;
65 using namespace GpgME;
66 using namespace Kleo;
67 using namespace Kleo::Crypto;
68 using namespace Kleo::Crypto::Gui;
69 
70 class DecryptVerifyFilesController::Private {
71  DecryptVerifyFilesController* const q;
72 public:
73 
74  static shared_ptr<AbstractDecryptVerifyTask> taskFromOperationWidget( const DecryptVerifyOperationWidget * w, const QString & fileName, const QDir & outDir, const shared_ptr<OverwritePolicy> & overwritePolicy );
75 
76  explicit Private( DecryptVerifyFilesController* qq );
77 
78  void slotWizardOperationPrepared();
79  void slotWizardCanceled();
80  void schedule();
81 
82  QStringList prepareWizardFromPassedFiles();
83  std::vector<shared_ptr<Task> > buildTasks( const QStringList &, const shared_ptr<OverwritePolicy> & );
84 
85  void ensureWizardCreated();
86  void ensureWizardVisible();
87  void reportError( int err, const QString & details ) {
88  q->setLastError( err, details );
89  q->emitDoneOrError();
90  }
91  void cancelAllTasks();
92 
93  QStringList m_passedFiles, m_filesAfterPreparation;
94  QPointer<DecryptVerifyFilesWizard> m_wizard;
95  std::vector<shared_ptr<const DecryptVerifyResult> > m_results;
96  std::vector<shared_ptr<Task> > m_runnableTasks, m_completedTasks;
97  shared_ptr<Task> m_runningTask;
98  bool m_errorDetected;
99  DecryptVerifyOperation m_operation;
100 };
101 
102 // static
103 shared_ptr<AbstractDecryptVerifyTask> DecryptVerifyFilesController::Private::taskFromOperationWidget( const DecryptVerifyOperationWidget * w, const QString & fileName, const QDir & outDir, const shared_ptr<OverwritePolicy> & overwritePolicy ) {
104 
105  kleo_assert( w );
106 
107  shared_ptr<AbstractDecryptVerifyTask> task;
108 
109  switch ( w->mode() ) {
110  case DecryptVerifyOperationWidget::VerifyDetachedWithSignature:
111  {
112 
113  shared_ptr<VerifyDetachedTask> t( new VerifyDetachedTask );
114  t->setInput( Input::createFromFile( fileName ) );
115  t->setSignedData( Input::createFromFile( w->signedDataFileName() ) );
116  task = t;
117 
118  kleo_assert( fileName == w->inputFileName() );
119  }
120  break;
121  case DecryptVerifyOperationWidget::VerifyDetachedWithSignedData:
122  {
123  shared_ptr<VerifyDetachedTask> t( new VerifyDetachedTask );
124  t->setInput( Input::createFromFile( w->inputFileName() ) );
125  t->setSignedData( Input::createFromFile( fileName ) );
126  task = t;
127 
128  kleo_assert( fileName == w->signedDataFileName() );
129  }
130  break;
131  case DecryptVerifyOperationWidget::DecryptVerifyOpaque:
132  {
133  const unsigned int classification = classify( fileName );
134  kDebug() << "classified" << fileName << "as" << printableClassification( classification );
135 
136  const shared_ptr<ArchiveDefinition> ad = w->selectedArchiveDefinition();
137 
138  const Protocol proto =
139  isOpenPGP( classification ) ? OpenPGP :
140  isCMS( classification ) ? CMS :
141  ad /* _needs_ the info */ ? throw Exception( gpg_error( GPG_ERR_CONFLICT ), i18n("Cannot determine whether input data is OpenPGP or CMS") ) :
142  /* else we don't care */ UnknownProtocol ;
143 
144  const shared_ptr<Input> input = Input::createFromFile( fileName );
145  const shared_ptr<Output> output =
146  ad ? ad->createOutputFromUnpackCommand( proto, fileName, outDir ) :
147  /*else*/ Output::createFromFile( outDir.absoluteFilePath( outputFileName( QFileInfo( fileName ).fileName() ) ), overwritePolicy );
148 
149  if ( mayBeCipherText( classification ) ) {
150  kDebug() << "creating a DecryptVerifyTask";
151  shared_ptr<DecryptVerifyTask> t( new DecryptVerifyTask );
152  t->setInput( input );
153  t->setOutput( output );
154  task = t;
155  } else {
156  kDebug() << "creating a VerifyOpaqueTask";
157  shared_ptr<VerifyOpaqueTask> t( new VerifyOpaqueTask );
158  t->setInput( input );
159  t->setOutput( output );
160  task = t;
161  }
162 
163  kleo_assert( fileName == w->inputFileName() );
164  }
165  break;
166  }
167 
168  task->autodetectProtocolFromInput();
169  return task;
170 }
171 
172 DecryptVerifyFilesController::Private::Private( DecryptVerifyFilesController* qq ) : q( qq ), m_errorDetected( false ), m_operation( DecryptVerify )
173 {
174  qRegisterMetaType<VerificationResult>();
175 }
176 
177 void DecryptVerifyFilesController::Private::slotWizardOperationPrepared()
178 {
179  try {
180  ensureWizardCreated();
181  std::vector<shared_ptr<Task> > tasks = buildTasks( m_filesAfterPreparation, shared_ptr<OverwritePolicy>( new OverwritePolicy( m_wizard ) ) );
182  kleo_assert( m_runnableTasks.empty() );
183  m_runnableTasks.swap( tasks );
184 
185  shared_ptr<TaskCollection> coll( new TaskCollection );
186  Q_FOREACH( const shared_ptr<Task> & i, m_runnableTasks )
187  q->connectTask( i );
188  coll->setTasks( m_runnableTasks );
189  m_wizard->setTaskCollection( coll );
190 
191  QTimer::singleShot( 0, q, SLOT(schedule()) );
192 
193  } catch ( const Kleo::Exception & e ) {
194  reportError( e.error().encodedError(), e.message() );
195  } catch ( const std::exception & e ) {
196  reportError( gpg_error( GPG_ERR_UNEXPECTED ),
197  i18n("Caught unexpected exception in DecryptVerifyFilesController::Private::slotWizardOperationPrepared: %1",
198  QString::fromLocal8Bit( e.what() ) ) );
199  } catch ( ... ) {
200  reportError( gpg_error( GPG_ERR_UNEXPECTED ),
201  i18n("Caught unknown exception in DecryptVerifyFilesController::Private::slotWizardOperationPrepared") );
202  }
203 }
204 
205 void DecryptVerifyFilesController::Private::slotWizardCanceled()
206 {
207  kDebug();
208  reportError( gpg_error( GPG_ERR_CANCELED ), i18n("User canceled") );
209 }
210 
211 void DecryptVerifyFilesController::doTaskDone( const Task* task, const shared_ptr<const Task::Result> & result )
212 {
213  assert( task );
214  assert( task == d->m_runningTask.get() );
215  Q_UNUSED( task );
216 
217  // We could just delete the tasks here, but we can't use
218  // Qt::QueuedConnection here (we need sender()) and other slots
219  // might not yet have executed. Therefore, we push completed tasks
220  // into a burial container
221 
222  d->m_completedTasks.push_back( d->m_runningTask );
223  d->m_runningTask.reset();
224 
225  if ( const shared_ptr<const DecryptVerifyResult> & dvr = boost::dynamic_pointer_cast<const DecryptVerifyResult>( result ) )
226  d->m_results.push_back( dvr );
227 
228  QTimer::singleShot( 0, this, SLOT(schedule()) );
229 }
230 
231 void DecryptVerifyFilesController::Private::schedule()
232 {
233  if ( !m_runningTask && !m_runnableTasks.empty() ) {
234  const shared_ptr<Task> t = m_runnableTasks.back();
235  m_runnableTasks.pop_back();
236  t->start();
237  m_runningTask = t;
238  }
239  if ( !m_runningTask ) {
240  kleo_assert( m_runnableTasks.empty() );
241  Q_FOREACH ( const shared_ptr<const DecryptVerifyResult> & i, m_results )
242  emit q->verificationResult( i->verificationResult() );
243  q->emitDoneOrError();
244  }
245 }
246 
247 void DecryptVerifyFilesController::Private::ensureWizardCreated()
248 {
249  if ( m_wizard )
250  return;
251 
252  std::auto_ptr<DecryptVerifyFilesWizard> w( new DecryptVerifyFilesWizard );
253  w->setWindowTitle( i18n( "Decrypt/Verify Files" ) );
254  w->setAttribute( Qt::WA_DeleteOnClose );
255 
256  connect( w.get(), SIGNAL(operationPrepared()), q, SLOT(slotWizardOperationPrepared()), Qt::QueuedConnection );
257  connect( w.get(), SIGNAL(canceled()), q, SLOT(slotWizardCanceled()), Qt::QueuedConnection );
258  m_wizard = w.release();
259 
260 }
261 
262 namespace {
263  struct FindExtension : std::unary_function<shared_ptr<ArchiveDefinition>,bool> {
264  const QString ext;
265  const Protocol proto;
266  FindExtension( const QString & ext, Protocol proto ) : ext( ext ), proto( proto ) {}
267  bool operator()( const shared_ptr<ArchiveDefinition> & ad ) const {
268  kDebug() << " considering" << ( ad ? ad->label() : QLatin1String( "<null>" ) ) << "for" << ext;
269  bool result;
270  if ( proto == UnknownProtocol )
271  result = ad && ( ad->extensions( OpenPGP ).contains( ext, Qt::CaseInsensitive ) || ad->extensions( CMS ).contains( ext, Qt::CaseInsensitive ) );
272  else
273  result = ad && ad->extensions( proto ).contains( ext, Qt::CaseInsensitive );
274  kDebug() << ( result ? " -> matches" : " -> doesn't match" );
275  return result;
276  }
277  };
278 }
279 
280 shared_ptr<ArchiveDefinition> pick_archive_definition( GpgME::Protocol proto, const std::vector< shared_ptr<ArchiveDefinition> > & ads, const QString & filename ) {
281  const QFileInfo fi( outputFileName( filename ) );
282  QString extension = fi.completeSuffix();
283 
284  if ( extension == QLatin1String("out") ) // added by outputFileName() -> useless
285  return shared_ptr<ArchiveDefinition>();
286 
287  if ( extension.endsWith( QLatin1String( ".out" ) ) ) // added by outputFileName() -> remove
288  extension.chop(4);
289 
290  for ( ;; ) {
291  const std::vector<shared_ptr<ArchiveDefinition> >::const_iterator it
292  = std::find_if( ads.begin(), ads.end(), FindExtension( extension, proto ) );
293  if ( it != ads.end() )
294  return *it;
295  const int idx = extension.indexOf( QLatin1Char('.') );
296  if ( idx < 0 )
297  return shared_ptr<ArchiveDefinition>();
298  extension = extension.mid( idx + 1 );
299  }
300 }
301 
302 
303 QStringList DecryptVerifyFilesController::Private::prepareWizardFromPassedFiles()
304 {
305  ensureWizardCreated();
306 
307  const std::vector< shared_ptr<ArchiveDefinition> > archiveDefinitions = ArchiveDefinition::getArchiveDefinitions();
308 
309  QStringList fileNames;
310  unsigned int counter = 0;
311  Q_FOREACH( const QString & fname, m_passedFiles ) {
312 
313  kleo_assert( !fname.isEmpty() );
314 
315  const unsigned int classification = classify( fname );
316  const Protocol proto = findProtocol( classification );
317 
318  if ( mayBeOpaqueSignature( classification ) || mayBeCipherText( classification ) || mayBeDetachedSignature( classification ) ) {
319 
320  DecryptVerifyOperationWidget * const op = m_wizard->operationWidget( counter++ );
321  kleo_assert( op != 0 );
322 
323  op->setArchiveDefinitions( archiveDefinitions );
324 
325  const QString signedDataFileName = findSignedData( fname );
326 
327  // this breaks opaque signatures whose source files still
328  // happen to exist in the same directory. Until we have
329  // content-based classification, this is the most unlikely
330  // case, so that's the case we break. ### FIXME remove when content-classify is done
331  if ( mayBeDetachedSignature( classification ) && !signedDataFileName.isEmpty() )
332  op->setMode( DecryptVerifyOperationWidget::VerifyDetachedWithSignature );
333  // ### end FIXME
334  else if ( mayBeOpaqueSignature( classification ) || mayBeCipherText( classification ) )
335  op->setMode( DecryptVerifyOperationWidget::DecryptVerifyOpaque, pick_archive_definition( proto, archiveDefinitions, fname ) );
336  else
337  op->setMode( DecryptVerifyOperationWidget::VerifyDetachedWithSignature );
338 
339  op->setInputFileName( fname );
340  op->setSignedDataFileName( signedDataFileName );
341 
342  fileNames.push_back( fname );
343 
344  } else {
345 
346  // probably the signed data file was selected:
347  const QStringList signatures = findSignatures( fname );
348 
349  if ( signatures.empty() ) {
350  // We are assuming this is a detached signature file, but
351  // there were no signature files for it. Let's guess it's encrypted after all.
352  // ### FIXME once we have a proper heuristic for this, this should move into
353  // classify() and/or classifyContent()
354  DecryptVerifyOperationWidget * const op = m_wizard->operationWidget( counter++ );
355  kleo_assert( op != 0 );
356  op->setArchiveDefinitions( archiveDefinitions );
357  op->setMode( DecryptVerifyOperationWidget::DecryptVerifyOpaque, pick_archive_definition( proto, archiveDefinitions, fname ) );
358  op->setInputFileName( fname );
359  fileNames.push_back( fname );
360  } else {
361 
362  Q_FOREACH( const QString & s, signatures ) {
363  DecryptVerifyOperationWidget * op = m_wizard->operationWidget( counter++ );
364  kleo_assert( op != 0 );
365 
366  op->setArchiveDefinitions( archiveDefinitions );
367  op->setMode( DecryptVerifyOperationWidget::VerifyDetachedWithSignedData );
368  op->setInputFileName( s );
369  op->setSignedDataFileName( fname );
370 
371  fileNames.push_back( fname );
372  }
373 
374  }
375  }
376  }
377 
378  kleo_assert( counter == static_cast<unsigned>( fileNames.size() ) );
379 
380  if ( !counter )
381  throw Kleo::Exception( makeGnuPGError( GPG_ERR_ASS_NO_INPUT ), i18n("No usable inputs found") );
382 
383  m_wizard->setOutputDirectory( heuristicBaseDirectory( m_passedFiles ) );
384  return fileNames;
385 }
386 
387 std::vector< shared_ptr<Task> > DecryptVerifyFilesController::Private::buildTasks( const QStringList & fileNames, const shared_ptr<OverwritePolicy> & overwritePolicy )
388 {
389  const bool useOutDir = m_wizard->useOutputDirectory();
390  const QFileInfo outDirInfo( m_wizard->outputDirectory() );
391 
392  kleo_assert( !useOutDir || outDirInfo.isDir() );
393 
394  const QDir outDir( outDirInfo.absoluteFilePath() );
395  kleo_assert( !useOutDir || outDir.exists() );
396 
397  std::vector<shared_ptr<Task> > tasks;
398  for ( unsigned int i = 0, end = fileNames.size() ; i != end ; ++i )
399  try {
400  const QDir fileDir = QFileInfo( fileNames[i] ).absoluteDir();
401  kleo_assert( fileDir.exists() );
402  tasks.push_back( taskFromOperationWidget( m_wizard->operationWidget( i ), fileNames[i], useOutDir ? outDir : fileDir, overwritePolicy ) );
403  } catch ( const GpgME::Exception & e ) {
404  tasks.push_back( Task::makeErrorTask( e.error().code(), QString::fromLocal8Bit( e.what() ), fileNames[i] ) );
405  }
406 
407  return tasks;
408 }
409 
410 void DecryptVerifyFilesController::setFiles( const QStringList & files )
411 {
412  d->m_passedFiles = files;
413 }
414 
415 void DecryptVerifyFilesController::Private::ensureWizardVisible()
416 {
417  ensureWizardCreated();
418  q->bringToForeground( m_wizard );
419 }
420 
421 DecryptVerifyFilesController::DecryptVerifyFilesController( QObject* parent ) : Controller( parent ), d( new Private( this ) )
422 {
423 }
424 
425 DecryptVerifyFilesController::DecryptVerifyFilesController( const shared_ptr<const ExecutionContext> & ctx, QObject* parent ) : Controller( ctx, parent ), d( new Private( this ) )
426 {
427 }
428 
429 
430 DecryptVerifyFilesController::~DecryptVerifyFilesController() { kDebug(); }
431 
432 void DecryptVerifyFilesController::start()
433 {
434  d->m_filesAfterPreparation = d->prepareWizardFromPassedFiles();
435  d->ensureWizardVisible();
436 }
437 
438 void DecryptVerifyFilesController::setOperation( DecryptVerifyOperation op )
439 {
440  d->m_operation = op;
441 }
442 
443 DecryptVerifyOperation DecryptVerifyFilesController::operation() const
444 {
445  return d->m_operation;
446 }
447 
448 void DecryptVerifyFilesController::Private::cancelAllTasks() {
449 
450  // we just kill all runnable tasks - this will not result in
451  // signal emissions.
452  m_runnableTasks.clear();
453 
454  // a cancel() will result in a call to
455  if ( m_runningTask )
456  m_runningTask->cancel();
457 }
458 
459 void DecryptVerifyFilesController::cancel()
460 {
461  kDebug();
462  try {
463  d->m_errorDetected = true;
464  if ( d->m_wizard )
465  d->m_wizard->close();
466  d->cancelAllTasks();
467  } catch ( const std::exception & e ) {
468  kDebug() << "Caught exception: " << e.what();
469  }
470 }
471 
472 #include "decryptverifyfilescontroller.moc"
Kleo::heuristicBaseDirectory
QString heuristicBaseDirectory(const QStringList &files)
Definition: path-helper.cpp:69
decryptverifyfileswizard.h
Kleo::Crypto::DecryptVerifyFilesController::operation
DecryptVerifyOperation operation() const
Definition: decryptverifyfilescontroller.cpp:443
output.h
input.h
Kleo::findSignedData
QString findSignedData(const QString &signatureFileName)
Definition: classify.cpp:249
path-helper.h
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::setSignedDataFileName
void setSignedDataFileName(const QString &name)
Definition: decryptverifyoperationwidget.cpp:239
decryptverifytask.h
Kleo::Crypto::DecryptVerifyFilesController::DecryptVerifyFilesController
DecryptVerifyFilesController(QObject *parent=0)
Definition: decryptverifyfilescontroller.cpp:421
Kleo::Crypto::Task
Definition: task.h:55
classify.h
Kleo::printableClassification
QString printableClassification(unsigned int classification)
Definition: classify.cpp:213
Kleo::Crypto::Gui::DecryptVerifyFilesWizard
Definition: decryptverifyfileswizard.h:51
decryptverifyfilescontroller.h
Kleo::Crypto::VerifyDetachedTask
Definition: decryptverifytask.h:130
decryptverifyoperationwidget.h
Kleo::DecryptVerify
Definition: types.h:48
Kleo::OverwritePolicy
Definition: output.h:50
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::setInputFileName
void setInputFileName(const QString &name)
Definition: decryptverifyoperationwidget.cpp:227
Kleo::Crypto::DecryptVerifyFilesController::~DecryptVerifyFilesController
~DecryptVerifyFilesController()
Definition: decryptverifyfilescontroller.cpp:430
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::setArchiveDefinitions
void setArchiveDefinitions(const std::vector< boost::shared_ptr< ArchiveDefinition > > &ads)
Definition: decryptverifyoperationwidget.cpp:177
Kleo::Crypto::DecryptVerifyFilesController::start
void start()
Definition: decryptverifyfilescontroller.cpp:432
kleo_assert.h
boost::shared_ptr
Definition: encryptemailcontroller.h:51
Kleo::Crypto::VerifyOpaqueTask
Definition: decryptverifytask.h:161
d
#define d
Definition: adduseridcommand.cpp:90
Kleo::Crypto::DecryptVerifyTask
Definition: decryptverifytask.h:192
Kleo::Class::OpenPGP
Definition: classify.h:49
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::mode
Mode mode
Definition: decryptverifyoperationwidget.h:58
Kleo::Crypto::DecryptVerifyFilesController::setOperation
void setOperation(DecryptVerifyOperation op)
Definition: decryptverifyfilescontroller.cpp:438
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::selectedArchiveDefinition
boost::shared_ptr< ArchiveDefinition > selectedArchiveDefinition() const
Definition: decryptverifyoperationwidget.cpp:251
Kleo::DecryptVerifyOperation
DecryptVerifyOperation
Definition: types.h:45
Kleo::Class::CMS
Definition: classify.h:48
Kleo::Crypto::DecryptVerifyFilesController::cancel
void cancel()
Definition: decryptverifyfilescontroller.cpp:459
gnupg-helper.h
archivedefinition.h
Kleo::outputFileName
QString outputFileName(const QString &input)
Definition: classify.cpp:277
Kleo::makeGnuPGError
int makeGnuPGError(int code)
Definition: gnupg-helper.cpp:69
kleo_assert
#define kleo_assert(cond)
Definition: kleo_assert.h:84
Kleo::Crypto::DecryptVerifyFilesController
Definition: decryptverifyfilescontroller.h:57
Kleo::findSignatures
QStringList findSignatures(const QString &signedDataFileName)
Definition: classify.cpp:262
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::signedDataFileName
QString signedDataFileName
Definition: decryptverifyoperationwidget.h:60
Kleo::classify
unsigned int classify(const QString &filename)
Definition: classify.cpp:154
Kleo::Crypto::TaskCollection
Definition: taskcollection.h:49
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::setMode
void setMode(Mode mode, const boost::shared_ptr< ArchiveDefinition > &ad)
Definition: decryptverifyoperationwidget.cpp:190
pick_archive_definition
shared_ptr< ArchiveDefinition > pick_archive_definition(GpgME::Protocol proto, const std::vector< shared_ptr< ArchiveDefinition > > &ads, const QString &filename)
Definition: decryptverifyfilescontroller.cpp:280
q
#define q
Definition: adduseridcommand.cpp:91
Kleo::Crypto::Gui::DecryptVerifyOperationWidget
Definition: decryptverifyoperationwidget.h:55
extension
static const char * extension(bool pgp, bool sign, bool encrypt, bool ascii, bool detached)
Definition: signencryptfilescontroller.cpp:285
Kleo::Crypto::Gui::DecryptVerifyOperationWidget::inputFileName
QString inputFileName
Definition: decryptverifyoperationwidget.h:59
Kleo::Crypto::Controller
Definition: controller.h:50
taskcollection.h
Kleo::findProtocol
ProtocolMask FormatMask TypeMask TypeMask TypeMask GpgME::Protocol findProtocol(const unsigned int classifcation)
Definition: classify.h:127
Kleo::ArchiveDefinition::getArchiveDefinitions
static std::vector< boost::shared_ptr< ArchiveDefinition > > getArchiveDefinitions()
Definition: archivedefinition.cpp:354
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:56:40 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kleopatra

Skip menu "kleopatra"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal