• 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
verifychecksumscontroller.cpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset:4 -*-
2  crypto/verifychecksumscontroller.cpp
3 
4  This file is part of Kleopatra, the KDE keymanager
5  Copyright (c) 2010 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 "verifychecksumscontroller.h"
36 
37 #ifndef QT_NO_DIRMODEL
38 
39 #include <crypto/gui/verifychecksumsdialog.h>
40 
41 #include <utils/input.h>
42 #include <utils/output.h>
43 #include <utils/classify.h>
44 #include <utils/kleo_assert.h>
45 
46 #include <kleo/stl_util.h>
47 #include <kleo/checksumdefinition.h>
48 
49 #include <KLocale>
50 #include <KDebug>
51 #include <KSaveFile>
52 #include <KGlobal>
53 #include <KConfigGroup>
54 
55 #include <QPointer>
56 #include <QFileInfo>
57 #include <QThread>
58 #include <QMutex>
59 #include <QProgressDialog>
60 #include <QDir>
61 #include <QProcess>
62 
63 #include <boost/bind.hpp>
64 #include <boost/function.hpp>
65 
66 #include <gpg-error.h>
67 
68 #include <deque>
69 #include <limits>
70 #include <set>
71 
72 using namespace Kleo;
73 using namespace Kleo::Crypto;
74 using namespace Kleo::Crypto::Gui;
75 using namespace boost;
76 
77 #ifdef Q_OS_UNIX
78 static const bool HAVE_UNIX = true;
79 #else
80 static const bool HAVE_UNIX = false;
81 #endif
82 
83 static const QLatin1String CHECKSUM_DEFINITION_ID_ENTRY( "checksum-definition-id" );
84 
85 static const Qt::CaseSensitivity fs_cs = HAVE_UNIX ? Qt::CaseSensitive : Qt::CaseInsensitive ; // can we use QAbstractFileEngine::caseSensitive()?
86 
87 #if 0
88 static QStringList fs_sort( QStringList l ) {
89  int (*QString_compare)(const QString&,const QString&,Qt::CaseSensitivity) = &QString::compare;
90  kdtools::sort( l, boost::bind( QString_compare, _1, _2, fs_cs ) < 0 );
91  return l;
92 }
93 
94 static QStringList fs_intersect( QStringList l1, QStringList l2 ) {
95  int (*QString_compare)(const QString&,const QString&,Qt::CaseSensitivity) = &QString::compare;
96  fs_sort( l1 );
97  fs_sort( l2 );
98  QStringList result;
99  std::set_intersection( l1.begin(), l1.end(),
100  l2.begin(), l2.end(),
101  std::back_inserter( result ),
102  boost::bind( QString_compare, _1, _2, fs_cs ) < 0 );
103  return result;
104 }
105 #endif
106 
107 static QList<QRegExp> get_patterns( const std::vector< shared_ptr<ChecksumDefinition> > & checksumDefinitions )
108 {
109  QList<QRegExp> result;
110  Q_FOREACH( const shared_ptr<ChecksumDefinition> & cd, checksumDefinitions )
111  if ( cd )
112  Q_FOREACH( const QString & pattern, cd->patterns() )
113  result.push_back( QRegExp( pattern, fs_cs ) );
114  return result;
115 }
116 
117 namespace {
118  struct matches_any : std::unary_function<QString,bool> {
119  const QList<QRegExp> m_regexps;
120  explicit matches_any( const QList<QRegExp> & regexps ) : m_regexps( regexps ) {}
121  bool operator()( const QString & s ) const {
122  return kdtools::any( m_regexps, boost::bind( &QRegExp::exactMatch, _1, s ) );
123  }
124  };
125  struct matches_none_of : std::unary_function<QString,bool> {
126  const QList<QRegExp> m_regexps;
127  explicit matches_none_of( const QList<QRegExp> & regexps ) : m_regexps( regexps ) {}
128  bool operator()( const QString & s ) const {
129  return kdtools::none_of( m_regexps, boost::bind( &QRegExp::exactMatch, _1, s ) );
130  }
131  };
132 }
133 
134 class VerifyChecksumsController::Private : public QThread {
135  Q_OBJECT
136  friend class ::Kleo::Crypto::VerifyChecksumsController;
137  VerifyChecksumsController * const q;
138 public:
139  explicit Private( VerifyChecksumsController * qq );
140  ~Private();
141 
142 Q_SIGNALS:
143  void baseDirectories( const QStringList & );
144  void progress( int, int, const QString & );
145  void status( const QString & file, Kleo::Crypto::Gui::VerifyChecksumsDialog::Status );
146 
147 private:
148  void slotOperationFinished() {
149  if ( dialog ) {
150  dialog->setProgress( 100, 100 );
151  dialog->setErrors( errors );
152  }
153 
154  if ( !errors.empty() )
155  q->setLastError( gpg_error( GPG_ERR_GENERAL ),
156  errors.join( QLatin1String("\n") ) );
157  q->emitDoneOrError();
158  }
159 
160 private:
161  /* reimp */ void run();
162 
163 private:
164  QPointer<VerifyChecksumsDialog> dialog;
165  mutable QMutex mutex;
166  const std::vector< shared_ptr<ChecksumDefinition> > checksumDefinitions;
167  QStringList files;
168  QStringList errors;
169  volatile bool canceled;
170 };
171 
172 VerifyChecksumsController::Private::Private( VerifyChecksumsController * qq )
173  : q( qq ),
174  dialog(),
175  mutex(),
176  checksumDefinitions( ChecksumDefinition::getChecksumDefinitions() ),
177  files(),
178  errors(),
179  canceled( false )
180 {
181  connect( this, SIGNAL(progress(int,int,QString)),
182  q, SIGNAL(progress(int,int,QString)) );
183  connect( this, SIGNAL(finished()),
184  q, SLOT(slotOperationFinished()) );
185 }
186 
187 VerifyChecksumsController::Private::~Private() { kDebug(); }
188 
189 VerifyChecksumsController::VerifyChecksumsController( QObject * p )
190  : Controller( p ), d( new Private( this ) )
191 {
192 
193 }
194 
195 VerifyChecksumsController::VerifyChecksumsController( const shared_ptr<const ExecutionContext> & ctx, QObject * p )
196  : Controller( ctx, p ), d( new Private( this ) )
197 {
198 
199 }
200 
201 VerifyChecksumsController::~VerifyChecksumsController() {
202  kDebug();
203 }
204 
205 void VerifyChecksumsController::setFiles( const QStringList & files ) {
206  kleo_assert( !d->isRunning() );
207  kleo_assert( !files.empty() );
208  const QMutexLocker locker( &d->mutex );
209  d->files = files;
210 }
211 
212 
213 void VerifyChecksumsController::start() {
214 
215  {
216  const QMutexLocker locker( &d->mutex );
217 
218  d->dialog = new VerifyChecksumsDialog;
219  d->dialog->setAttribute( Qt::WA_DeleteOnClose );
220  d->dialog->setWindowTitle( i18nc("@title:window","Verify Checksum Results") );
221 
222  connect( d->dialog, SIGNAL(canceled()),
223  this, SLOT(cancel()) );
224  connect( d.get(), SIGNAL(baseDirectories(QStringList)),
225  d->dialog, SLOT(setBaseDirectories(QStringList)) );
226  connect( d.get(), SIGNAL(progress(int,int,QString)),
227  d->dialog, SLOT(setProgress(int,int)) );
228  connect( d.get(), SIGNAL(status(QString,Kleo::Crypto::Gui::VerifyChecksumsDialog::Status)),
229  d->dialog, SLOT(setStatus(QString,Kleo::Crypto::Gui::VerifyChecksumsDialog::Status)) );
230 
231  d->canceled = false;
232  d->errors.clear();
233  }
234 
235  d->start();
236 
237  d->dialog->show();
238 
239 }
240 
241 void VerifyChecksumsController::cancel() {
242  kDebug();
243  const QMutexLocker locker( &d->mutex );
244  d->canceled = true;
245 }
246 
247 namespace {
248 
249  struct SumFile {
250  QDir dir;
251  QString sumFile;
252  quint64 totalSize;
253  shared_ptr<ChecksumDefinition> checksumDefinition;
254  };
255 
256 }
257 
258 static QStringList filter_checksum_files( QStringList l, const QList<QRegExp> & rxs ) {
259  l.erase( std::remove_if( l.begin(), l.end(),
260  matches_none_of( rxs ) ),
261  l.end() );
262  return l;
263 }
264 
265 
266 namespace {
267  struct File {
268  QString name;
269  QByteArray checksum;
270  bool binary;
271  };
272 }
273 
274 static QString decode( const QString & encoded ) {
275  QString decoded;
276  decoded.reserve( encoded.size() );
277  bool shift = false;
278  Q_FOREACH( const QChar ch, encoded )
279  if ( shift ) {
280  switch ( ch.toLatin1() ) {
281  case '\\': decoded += QLatin1Char( '\\' ); break;
282  case 'n': decoded += QLatin1Char( '\n' ); break;
283  default:
284  kDebug() << "invalid escape sequence" << '\\' << ch << "(interpreted as '" << ch << "')";
285  decoded += ch;
286  break;
287  }
288  shift = false;
289  } else {
290  if ( ch == QLatin1Char( '\\' ) )
291  shift = true;
292  else
293  decoded += ch;
294  }
295  return decoded;
296 }
297 
298 static std::vector<File> parse_sum_file( const QString & fileName ) {
299  std::vector<File> files;
300  QFile f( fileName );
301  if ( f.open( QIODevice::ReadOnly ) ) {
302  QTextStream s( &f );
303  QRegExp rx( QLatin1String("(\\?)([a-f0-9A-F]+) ([ *])([^\n]+)\n*") );
304  while ( !s.atEnd() ) {
305  const QString line = s.readLine();
306  if ( rx.exactMatch( line ) ) {
307  assert( !rx.cap(4).endsWith( QLatin1Char('\n') ) );
308  const File file = {
309  rx.cap( 1 ) == QLatin1String("\\") ? decode( rx.cap( 4 ) ) : rx.cap( 4 ),
310  rx.cap( 2 ).toLatin1(),
311  rx.cap( 3 ) == QLatin1String("*"),
312  };
313  files.push_back( file );
314  }
315  }
316  }
317  return files;
318 }
319 
320 static quint64 aggregate_size( const QDir & dir, const QStringList & files ) {
321  quint64 n = 0;
322  Q_FOREACH( const QString & file, files )
323  n += QFileInfo( dir.absoluteFilePath( file ) ).size();
324  return n;
325 }
326 
327 static shared_ptr<ChecksumDefinition> filename2definition( const QString & fileName,
328  const std::vector< shared_ptr<ChecksumDefinition> > & checksumDefinitions )
329 {
330  Q_FOREACH( const shared_ptr<ChecksumDefinition> & cd, checksumDefinitions )
331  if ( cd )
332  Q_FOREACH( const QString & pattern, cd->patterns() )
333  if ( QRegExp( pattern, fs_cs ).exactMatch( fileName ) )
334  return cd;
335  return shared_ptr<ChecksumDefinition>();
336 }
337 
338 namespace {
339  struct less_dir : std::binary_function<QDir,QDir,bool> {
340  bool operator()( const QDir & lhs, const QDir & rhs ) const {
341  return QString::compare( lhs.absolutePath(), rhs.absolutePath(), fs_cs ) < 0 ;
342  }
343  };
344  struct less_file : std::binary_function<QString,QString,bool> {
345  bool operator()( const QString & lhs, const QString & rhs ) const {
346  return QString::compare( lhs, rhs, fs_cs ) < 0 ;
347  }
348  };
349  struct sumfile_contains_file : std::unary_function<QString,bool> {
350  const QDir dir;
351  const QString fileName;
352  sumfile_contains_file( const QDir & dir_, const QString & fileName_ )
353  : dir( dir_ ), fileName( fileName_ ) {}
354  bool operator()( const QString & sumFile ) const {
355  const std::vector<File> files = parse_sum_file( dir.absoluteFilePath( sumFile ) );
356  kDebug() << "find_sums_by_input_files: found " << files.size()
357  << " files listed in " << qPrintable( dir.absoluteFilePath( sumFile ) );
358  Q_FOREACH( const File & file, files ) {
359  const bool isSameFileName = ( QString::compare( file.name, fileName, fs_cs ) == 0 );
360  kDebug() << "find_sums_by_input_files: "
361  << qPrintable( file.name ) << " == "
362  << qPrintable( fileName ) << " ? "
363  << isSameFileName;
364  if ( isSameFileName )
365  return true;
366  }
367  return false;
368  }
369  };
370 
371 }
372 
373 // IF is_dir(file)
374 // add all sumfiles \in dir(file)
375 // inputs.prepend( all dirs \in dir(file) )
376 // ELSE IF is_sum_file(file)
377 // add
378 // ELSE IF \exists sumfile in dir(file) \where sumfile \contains file
379 // add sumfile
380 // ELSE
381 // error: no checksum found for "file"
382 
383 static QStringList find_base_directiories( const QStringList & files ) {
384 
385  // Step 1: find base dirs:
386 
387  std::set<QDir,less_dir> dirs;
388  Q_FOREACH( const QString & file, files ) {
389  const QFileInfo fi( file );
390  const QDir dir = fi.isDir() ? QDir( file ) : fi.dir() ;
391  dirs.insert( dir );
392  }
393 
394  // Step 1a: collapse direct child directories
395 
396  bool changed;
397  do {
398  changed = false;
399  std::set<QDir,less_dir>::iterator it = dirs.begin();
400  while ( it != dirs.end() ) {
401  QDir dir = *it;
402  if ( dir.cdUp() && dirs.count( dir ) ) {
403  dirs.erase( it++ );
404  changed = true;
405  } else {
406  ++it;
407  }
408  }
409  } while ( changed );
410 
411  return kdtools::transform<QStringList>( dirs, mem_fn( &QDir::absolutePath ) );
412 }
413 
414 static std::vector<SumFile> find_sums_by_input_files( const QStringList & files, QStringList & errors,
415  const function<void(int)> & progress,
416  const std::vector< shared_ptr<ChecksumDefinition> > & checksumDefinitions )
417 {
418  const QList<QRegExp> patterns = get_patterns( checksumDefinitions );
419 
420  const matches_any is_sum_file( patterns );
421 
422  std::map<QDir,std::set<QString,less_file>,less_dir> dirs2sums;
423 
424  // Step 1: find the sumfiles we need to check:
425 
426  std::deque<QString> inputs( files.begin(), files.end() );
427 
428  int i = 0;
429  while ( !inputs.empty() ) {
430  const QString file = inputs.front();
431  kDebug() << "find_sums_by_input_files: considering " << qPrintable( file );
432  inputs.pop_front();
433  const QFileInfo fi( file );
434  const QString fileName = fi.fileName();
435  if ( fi.isDir() ) {
436  kDebug() << "find_sums_by_input_files: it's a directory";
437  QDir dir( file );
438  const QStringList sumfiles = filter_checksum_files( dir.entryList( QDir::Files ), patterns );
439  kDebug() << "find_sums_by_input_files: found " << sumfiles.size()
440  << " sum files: " << qPrintable( sumfiles.join(QLatin1String(", ")) );
441  dirs2sums[ dir ].insert( sumfiles.begin(), sumfiles.end() );
442  const QStringList dirs = dir.entryList( QDir::Dirs|QDir::NoDotAndDotDot );
443  kDebug() << "find_sums_by_input_files: found " << dirs.size()
444  << " subdirs, prepending";
445  kdtools::transform( dirs,
446  std::inserter( inputs, inputs.begin() ),
447  boost::bind( &QDir::absoluteFilePath, cref(dir), _1 ) );
448  } else if ( is_sum_file( fileName ) ) {
449  kDebug() << "find_sums_by_input_files: it's a sum file";
450  dirs2sums[fi.dir()].insert( fileName );
451  } else {
452  kDebug() << "find_sums_by_input_files: it's something else; checking whether we'll find a sumfile for it...";
453  const QDir dir = fi.dir();
454  const QStringList sumfiles = filter_checksum_files( dir.entryList( QDir::Files ), patterns );
455  kDebug() << "find_sums_by_input_files: found " << sumfiles.size()
456  << " potential sumfiles: " << qPrintable( sumfiles.join(QLatin1String(", ")) );
457  const QStringList::const_iterator it = kdtools::find_if( sumfiles, sumfile_contains_file( dir, fileName ) );
458  if ( it == sumfiles.end() )
459  errors.push_back( i18n( "Cannot find checksums file for file %1", file ) );
460  else
461  dirs2sums[dir].insert( *it );
462  }
463  if ( !progress.empty() )
464  progress( ++i );
465  }
466 
467  // Step 2: convert into vector<SumFile>:
468 
469  std::vector<SumFile> sumfiles;
470  sumfiles.reserve( dirs2sums.size() );
471 
472  for ( std::map<QDir,std::set<QString,less_file>,less_dir>::const_iterator it = dirs2sums.begin(), end = dirs2sums.end() ; it != end ; ++it ) {
473 
474  if ( it->second.empty() )
475  continue;
476 
477  const QDir & dir = it->first;
478 
479  Q_FOREACH( const QString & sumFileName, it->second ) {
480 
481  const std::vector<File> summedfiles = parse_sum_file( dir.absoluteFilePath( sumFileName ) );
482 
483  const SumFile sumFile = {
484  it->first,
485  sumFileName,
486  aggregate_size( it->first, kdtools::transform<QStringList>( summedfiles, mem_fn( &File::name ) ) ),
487  filename2definition( sumFileName, checksumDefinitions ),
488  };
489  sumfiles.push_back( sumFile );
490 
491  }
492 
493  if ( !progress.empty() )
494  progress( ++i );
495 
496  }
497  return sumfiles;
498 }
499 
500 static QStringList c_lang_environment() {
501  QStringList env = QProcess::systemEnvironment();
502  env.erase( std::remove_if( env.begin(), env.end(),
503  boost::bind( &QRegExp::exactMatch,
504  QRegExp( QLatin1String("^LANG=.*"), fs_cs ), _1 ) ),
505  env.end() );
506  env.push_back( QLatin1String("LANG=C") );
507  return env;
508 }
509 
510 static const struct {
511  const char * string;
512  VerifyChecksumsDialog::Status status;
513 } statusStrings[] = {
514  { "OK", VerifyChecksumsDialog::OK },
515  { "FAILED", VerifyChecksumsDialog::Failed },
516 };
517 static const size_t numStatusStrings = sizeof statusStrings / sizeof *statusStrings ;
518 
519 static VerifyChecksumsDialog::Status string2status( const QByteArray & str ) {
520  for ( unsigned int i = 0 ; i < numStatusStrings ; ++i )
521  if ( str == statusStrings[i].string )
522  return statusStrings[i].status;
523  return VerifyChecksumsDialog::Unknown;
524 }
525 
526 static QString process( const SumFile & sumFile, bool * fatal, const QStringList & env,
527  const function<void(const QString&,VerifyChecksumsDialog::Status)> & status )
528 {
529  QProcess p;
530  p.setEnvironment( env );
531  p.setWorkingDirectory( sumFile.dir.absolutePath() );
532  p.setReadChannel( QProcess::StandardOutput );
533 
534  const QString absFilePath = sumFile.dir.absoluteFilePath( sumFile.sumFile );
535 
536  const QString program = sumFile.checksumDefinition->verifyCommand();
537  sumFile.checksumDefinition->startVerifyCommand( &p, QStringList( absFilePath ) );
538 
539  QByteArray remainder; // used for filenames with newlines in them
540  while ( p.state() != QProcess::NotRunning ) {
541  p.waitForReadyRead();
542  while ( p.canReadLine() ) {
543  const QByteArray line = p.readLine();
544  const int colonIdx = line.lastIndexOf( ':' );
545  if ( colonIdx < 0 ) {
546  remainder += line; // no colon -> probably filename with a newline
547  continue;
548  }
549  const QString file = QFile::decodeName( remainder + line.left( colonIdx ) );
550  remainder.clear();
551  const VerifyChecksumsDialog::Status result = string2status( line.mid( colonIdx+1 ).trimmed() );
552  status( sumFile.dir.absoluteFilePath( file ), result );
553  }
554  }
555  kDebug() << "[" << &p << "] Exit code " << p.exitCode();
556 
557  if ( p.exitStatus() != QProcess::NormalExit || p.exitCode() != 0 ) {
558  if ( fatal && p.error() == QProcess::FailedToStart )
559  *fatal = true;
560  if ( p.error() == QProcess::UnknownError )
561  return i18n( "Error while running %1: %2", program,
562  QString::fromLocal8Bit( p.readAllStandardError().trimmed().constData() ) );
563  else
564  return i18n( "Failed to execute %1: %2", program, p.errorString() );
565  }
566 
567  return QString();
568 }
569 
570 namespace {
571  static QDebug operator<<( QDebug s, const SumFile & sum ) {
572  return s << "SumFile(" << sum.dir << "->" << sum.sumFile << "<-(" << sum.totalSize << ')' << ")\n";
573  }
574 }
575 
576 void VerifyChecksumsController::Private::run() {
577 
578  QMutexLocker locker( &mutex );
579 
580  const QStringList files = this->files;
581  const std::vector< shared_ptr<ChecksumDefinition> > checksumDefinitions = this->checksumDefinitions;
582 
583  locker.unlock();
584 
585  QStringList errors;
586 
587  //
588  // Step 0: find base directories:
589  //
590 
591  emit baseDirectories( find_base_directiories( files ) );
592 
593  //
594  // Step 1: build a list of work to do (no progress):
595  //
596 
597  const QString scanning = i18n("Scanning directories...");
598  emit progress( 0, 0, scanning );
599 
600  const function<void(int)> progressCb = boost::bind( &Private::progress, this, _1, 0, scanning );
601  const function<void(const QString&,VerifyChecksumsDialog::Status)>
602  statusCb = boost::bind( &Private::status, this, _1, _2 );
603  const std::vector<SumFile> sumfiles = find_sums_by_input_files( files, errors, progressCb, checksumDefinitions );
604 
605  Q_FOREACH( const SumFile & sumfile, sumfiles )
606  kDebug() << sumfile;
607 
608  if ( !canceled ) {
609 
610  emit progress( 0, 0, i18n("Calculating total size...") );
611 
612  const quint64 total
613  = kdtools::accumulate_transform( sumfiles, mem_fn( &SumFile::totalSize ), Q_UINT64_C(0) );
614 
615  if ( !canceled ) {
616 
617  //
618  // Step 2: perform work (with progress reporting):
619  //
620 
621  const QStringList env = c_lang_environment();
622 
623  // re-scale 'total' to fit into ints (wish QProgressDialog would use quint64...)
624  const quint64 factor = total / std::numeric_limits<int>::max() + 1 ;
625 
626  quint64 done = 0;
627  Q_FOREACH( const SumFile & sumFile, sumfiles ) {
628  emit progress( done/factor, total/factor,
629  i18n("Verifying checksums (%2) in %1", sumFile.checksumDefinition->label(), sumFile.dir.path() ) );
630  bool fatal = false;
631  const QString error = process( sumFile, &fatal, env, statusCb );
632  if ( !error.isEmpty() )
633  errors.push_back( error );
634  done += sumFile.totalSize;
635  if ( fatal || canceled )
636  break;
637  }
638  emit progress( done/factor, total/factor, i18n("Done.") );
639 
640  }
641  }
642 
643  locker.relock();
644 
645  this->errors = errors;
646 
647  // mutex unlocked by QMutexLocker
648 
649 }
650 
651 #include "moc_verifychecksumscontroller.cpp"
652 #include "verifychecksumscontroller.moc"
653 
654 #endif // QT_NO_DIRMODEL
Failed
Definition: setinitialpindialog.cpp:60
statusStrings
static const struct @2 statusStrings[]
fs_sort
static QStringList fs_sort(QStringList l)
Definition: createchecksumscontroller.cpp:143
Unknown
Definition: setinitialpindialog.cpp:55
sum
int sum(const std::vector< ImportResult > &res, int(ImportResult::*fun)() const )
Definition: importcertificatescommand.cpp:225
output.h
c_lang_environment
static QStringList c_lang_environment()
Definition: verifychecksumscontroller.cpp:500
input.h
get_patterns
static QList< QRegExp > get_patterns(const std::vector< shared_ptr< ChecksumDefinition > > &checksumDefinitions)
Definition: verifychecksumscontroller.cpp:107
Kleo::Crypto::Gui::VerifyChecksumsDialog
Definition: verifychecksumsdialog.h:47
classify.h
fs_intersect
static QStringList fs_intersect(QStringList l1, QStringList l2)
Definition: createchecksumscontroller.cpp:149
fs_cs
static const Qt::CaseSensitivity fs_cs
Definition: verifychecksumscontroller.cpp:85
numStatusStrings
static const size_t numStatusStrings
Definition: verifychecksumscontroller.cpp:517
verifychecksumscontroller.h
filename2definition
static shared_ptr< ChecksumDefinition > filename2definition(const QString &fileName, const std::vector< shared_ptr< ChecksumDefinition > > &checksumDefinitions)
Definition: verifychecksumscontroller.cpp:327
process
static QString process(const SumFile &sumFile, bool *fatal, const QStringList &env, const function< void(const QString &, VerifyChecksumsDialog::Status)> &status)
Definition: verifychecksumscontroller.cpp:526
status
VerifyChecksumsDialog::Status status
Definition: verifychecksumscontroller.cpp:512
kleo_assert.h
Kleo::Crypto::VerifyChecksumsController
Definition: verifychecksumscontroller.h:52
boost::shared_ptr< ChecksumDefinition >
d
#define d
Definition: adduseridcommand.cpp:90
verifychecksumsdialog.h
CHECKSUM_DEFINITION_ID_ENTRY
static const QLatin1String CHECKSUM_DEFINITION_ID_ENTRY("checksum-definition-id")
decode
static QString decode(const QString &encoded)
Definition: verifychecksumscontroller.cpp:274
Kleo::Crypto::VerifyChecksumsController::~VerifyChecksumsController
~VerifyChecksumsController()
Definition: verifychecksumscontroller.cpp:201
operator<<
QDebug operator<<(QDebug debug, const std::vector< T, A > &v)
Definition: headerview.cpp:78
kdtools::pimpl_ptr::get
T * get()
Definition: pimpl_ptr.h:39
HAVE_UNIX
static const bool HAVE_UNIX
Definition: verifychecksumscontroller.cpp:80
mutex
static QMutex mutex
Definition: sessiondata.cpp:48
aggregate_size
static quint64 aggregate_size(const QDir &dir, const QStringList &files)
Definition: verifychecksumscontroller.cpp:320
Kleo::Crypto::Controller::progress
void progress(int current, int total, const QString &what)
Kleo::Crypto::VerifyChecksumsController::cancel
void cancel()
Definition: verifychecksumscontroller.cpp:241
kleo_assert
#define kleo_assert(cond)
Definition: kleo_assert.h:84
dir
static QString dir(const QString &id)
Definition: filedialog.cpp:53
string
const char * string
Definition: verifychecksumscontroller.cpp:511
filter_checksum_files
static QStringList filter_checksum_files(QStringList l, const QList< QRegExp > &rxs)
Definition: verifychecksumscontroller.cpp:258
q
#define q
Definition: adduseridcommand.cpp:91
Kleo::Crypto::Gui::VerifyChecksumsDialog::Status
Status
Definition: verifychecksumsdialog.h:54
Kleo::Crypto::VerifyChecksumsController::VerifyChecksumsController
VerifyChecksumsController(QObject *parent=0)
Definition: verifychecksumscontroller.cpp:189
name
const char * name
Definition: uiserver/selectcertificatecommand.cpp:114
Kleo::Crypto::VerifyChecksumsController::setFiles
void setFiles(const QStringList &files)
Definition: verifychecksumscontroller.cpp:205
string2status
static VerifyChecksumsDialog::Status string2status(const QByteArray &str)
Definition: verifychecksumscontroller.cpp:519
parse_sum_file
static std::vector< File > parse_sum_file(const QString &fileName)
Definition: verifychecksumscontroller.cpp:298
Kleo::Crypto::VerifyChecksumsController::start
void start()
Definition: verifychecksumscontroller.cpp:213
Kleo::Crypto::Controller
Definition: controller.h:50
find_base_directiories
static QStringList find_base_directiories(const QStringList &files)
Definition: verifychecksumscontroller.cpp:383
QList
Definition: commands/command.h:46
find_sums_by_input_files
static std::vector< SumFile > find_sums_by_input_files(const QStringList &files, QStringList &errors, const function< void(int)> &progress, const std::vector< shared_ptr< ChecksumDefinition > > &checksumDefinitions)
Definition: verifychecksumscontroller.cpp:414
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:56:42 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