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

kleopatra

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

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