• 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
  • libkleopatraclient
  • core
libkleopatraclient/core/command.cpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset:4 -*-
2  command.cpp
3 
4  This file is part of KleopatraClient, the Kleopatra interface library
5  Copyright (c) 2008 Klarälvdalens Datakonsult AB
6 
7  KleopatraClient is free software; you can redistribute it and/or modify
8  it under the terms of the GNU Library 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  KleopatraClient 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  Library General Public License for more details.
16 
17  You should have received a copy of the GNU Library 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 
22 #include <config-kleopatra.h>
23 
24 #include "command.h"
25 #include "command_p.h"
26 
27 #include <QtGlobal> // Q_OS_WIN
28 
29 #ifdef Q_OS_WIN // HACK: AllowSetForegroundWindow needs _WIN32_WINDOWS >= 0x0490 set
30 # ifndef _WIN32_WINDOWS
31 # define _WIN32_WINDOWS 0x0500
32 # define _WIN32_WINNT 0x0500 // good enough for Vista too
33 # endif
34 # include <utils/gnupg-registry.h>
35 # include <windows.h>
36 #endif
37 
38 #include <QMutexLocker>
39 #include <QFile>
40 #include <QDebug>
41 #include <QDir>
42 #include <QProcess>
43 
44 #include <assuan.h>
45 #include <gpg-error.h>
46 
47 #ifndef Q_MOC_RUN
48 #include <boost/shared_ptr.hpp>
49 #include <boost/type_traits/remove_pointer.hpp>
50 #endif
51 
52 #include <algorithm>
53 #include <string>
54 #include <sstream>
55 
56 using namespace KLEOPATRACLIENT_NAMESPACE;
57 using namespace boost;
58 
59 // copied from kleopatra/utils/hex.cpp
60 static std::string hexencode( const std::string & in ) {
61  std::string result;
62  result.reserve( 3 * in.size() );
63 
64  static const char hex[] = "0123456789ABCDEF";
65 
66  for ( std::string::const_iterator it = in.begin(), end = in.end() ; it != end ; ++it )
67  switch ( const unsigned char ch = *it ) {
68  default:
69  if ( ( ch >= '!' && ch <= '~' ) || ch > 0xA0 ) {
70  result += ch;
71  break;
72  }
73  // else fall through
74  case ' ':
75  result += '+';
76  break;
77  case '"':
78  case '#':
79  case '$':
80  case '%':
81  case '\'':
82  case '+':
83  case '=':
84  result += '%';
85  result += hex[ (ch & 0xF0) >> 4 ];
86  result += hex[ (ch & 0x0F) ];
87  break;
88  }
89 
90  return result;
91 }
92 
93 #ifdef UNUSED
94 static std::string hexencode( const char * in ) {
95  if ( !in )
96  return std::string();
97  return hexencode( std::string( in ) );
98 }
99 #endif
100 
101 // changed from returning QByteArray to returning std::string
102 static std::string hexencode( const QByteArray & in ) {
103  if ( in.isNull() )
104  return std::string();
105  return hexencode( std::string( in.data(), in.size() ) );
106 }
107 // end copied from kleopatra/utils/hex.cpp
108 
109 Command::Command( QObject * p )
110  : QObject( p ), d( new Private( this ) )
111 {
112  d->init();
113 }
114 
115 Command::Command( Private * pp, QObject * p )
116  : QObject( p ), d( pp )
117 {
118  d->init();
119 }
120 
121 Command::~Command() {
122  delete d; d = 0;
123 }
124 
125 void Command::Private::init() {
126  connect( this, SIGNAL(started()), q, SIGNAL(started()) );
127  connect( this, SIGNAL(finished()), q, SIGNAL(finished()) );
128 }
129 
130 void Command::setParentWId( WId wid ) {
131  const QMutexLocker locker( &d->mutex );
132  d->inputs.parentWId = wid;
133 }
134 
135 WId Command::parentWId() const {
136  const QMutexLocker locker( &d->mutex );
137  return d->inputs.parentWId;
138 }
139 
140 
141 void Command::setServerLocation( const QString & location ) {
142  const QMutexLocker locker( &d->mutex );
143  d->outputs.serverLocation = location;
144 }
145 
146 QString Command::serverLocation() const {
147  const QMutexLocker locker( &d->mutex );
148  return d->outputs.serverLocation;
149 }
150 
151 
152 bool Command::waitForFinished() {
153  return d->wait();
154 }
155 
156 bool Command::waitForFinished( unsigned long ms ) {
157  return d->wait( ms );
158 }
159 
160 
161 bool Command::error() const {
162  const QMutexLocker locker( &d->mutex );
163  return !d->outputs.errorString.isEmpty();
164 }
165 
166 bool Command::wasCanceled() const {
167  const QMutexLocker locker( &d->mutex );
168  return d->outputs.canceled;
169 }
170 
171 QString Command::errorString() const {
172  const QMutexLocker locker( &d->mutex );
173  return d->outputs.errorString;
174 }
175 
176 
177 qint64 Command::serverPid() const {
178  const QMutexLocker locker( &d->mutex );
179  return d->outputs.serverPid;
180 }
181 
182 
183 void Command::start() {
184  d->start();
185 }
186 
187 void Command::cancel() {
188  qDebug( "Sorry, not implemented: KleopatraClient::Command::Cancel" );
189 }
190 
191 
192 void Command::setOptionValue( const char * name, const QVariant & value, bool critical ) {
193  if ( !name || !*name )
194  return;
195  const Private::Option opt = {
196  value,
197  true,
198  critical
199  };
200  const QMutexLocker locker( &d->mutex );
201  d->inputs.options[name] = opt;
202 }
203 
204 QVariant Command::optionValue( const char * name ) const {
205  if ( !name || !*name )
206  return QVariant();
207  const QMutexLocker locker( &d->mutex );
208 
209  const std::map<std::string,Private::Option>::const_iterator it = d->inputs.options.find( name );
210  if ( it == d->inputs.options.end() )
211  return QVariant();
212  else
213  return it->second.value;
214 }
215 
216 
217 void Command::setOption( const char * name, bool critical ) {
218  if ( !name || !*name )
219  return;
220  const QMutexLocker locker( &d->mutex );
221 
222  if ( isOptionSet( name ) )
223  unsetOption( name );
224 
225  const Private::Option opt = {
226  QVariant(),
227  false,
228  critical
229  };
230 
231  d->inputs.options[name] = opt;
232 }
233 
234 void Command::unsetOption( const char * name ) {
235  if ( !name || !*name )
236  return;
237  const QMutexLocker locker( &d->mutex );
238  d->inputs.options.erase( name );
239 }
240 
241 bool Command::isOptionSet( const char * name ) const {
242  if ( !name || !*name )
243  return false;
244  const QMutexLocker locker( &d->mutex );
245  return d->inputs.options.count( name );
246 }
247 
248 bool Command::isOptionCritical( const char * name ) const {
249  if ( !name || !*name )
250  return false;
251  const QMutexLocker locker( &d->mutex );
252  const std::map<std::string,Private::Option>::const_iterator it = d->inputs.options.find( name );
253  return it != d->inputs.options.end() && it->second.isCritical;
254 }
255 
256 void Command::setFilePaths( const QStringList & filePaths ) {
257  const QMutexLocker locker( &d->mutex );
258  d->inputs.filePaths = filePaths;
259 }
260 
261 QStringList Command::filePaths() const {
262  const QMutexLocker locker( &d->mutex );
263  return d->inputs.filePaths;
264 }
265 
266 
267 void Command::setRecipients( const QStringList & recipients, bool informative ) {
268  const QMutexLocker locker( &d->mutex );
269  d->inputs.recipients = recipients;
270  d->inputs.areRecipientsInformative = informative;
271 }
272 
273 QStringList Command::recipients() const {
274  const QMutexLocker locker( &d->mutex );
275  return d->inputs.recipients;
276 }
277 
278 bool Command::areRecipientsInformative() const {
279  const QMutexLocker locker( &d->mutex );
280  return d->inputs.areRecipientsInformative;
281 }
282 
283 
284 void Command::setSenders( const QStringList & senders, bool informative ) {
285  const QMutexLocker locker( &d->mutex );
286  d->inputs.senders = senders;
287  d->inputs.areSendersInformative = informative;
288 }
289 
290 QStringList Command::senders() const {
291  const QMutexLocker locker( &d->mutex );
292  return d->inputs.senders;
293 }
294 
295 bool Command::areSendersInformative() const {
296  const QMutexLocker locker( &d->mutex );
297  return d->inputs.areSendersInformative;
298 }
299 
300 
301 void Command::setInquireData( const char * what, const QByteArray & data ) {
302  const QMutexLocker locker( &d->mutex );
303  d->inputs.inquireData[what] = data;
304 }
305 
306 void Command::unsetInquireData( const char * what ) {
307  const QMutexLocker locker( &d->mutex );
308  d->inputs.inquireData.erase( what );
309 }
310 
311 QByteArray Command::inquireData( const char * what ) const {
312  const QMutexLocker locker( &d->mutex );
313  const std::map<std::string,QByteArray>::const_iterator it = d->inputs.inquireData.find( what );
314  if ( it == d->inputs.inquireData.end() )
315  return QByteArray();
316  else
317  return it->second;
318 }
319 
320 bool Command::isInquireDataSet( const char * what ) const {
321  const QMutexLocker locker( &d->mutex );
322  const std::map<std::string,QByteArray>::const_iterator it = d->inputs.inquireData.find( what );
323  return it != d->inputs.inquireData.end();
324 }
325 
326 
327 QByteArray Command::receivedData() const {
328  const QMutexLocker locker( &d->mutex );
329  return d->outputs.data;
330 }
331 
332 
333 void Command::setCommand( const char * command ) {
334  const QMutexLocker locker( &d->mutex );
335  d->inputs.command = command;
336 }
337 
338 QByteArray Command::command() const {
339  const QMutexLocker locker( &d->mutex );
340  return d->inputs.command;
341 }
342 
343 //
344 // here comes the ugly part
345 //
346 
347 #ifdef HAVE_ASSUAN2
348 static void my_assuan_release( assuan_context_t ctx ) {
349  if ( ctx )
350  assuan_release( ctx );
351 }
352 #endif
353 
354 typedef shared_ptr< remove_pointer<assuan_context_t>::type > AssuanContextBase;
355 namespace {
356  struct AssuanClientContext : AssuanContextBase {
357  AssuanClientContext() : AssuanContextBase() {}
358 #ifndef HAVE_ASSUAN2
359  explicit AssuanClientContext( assuan_context_t ctx ) : AssuanContextBase( ctx, &assuan_disconnect ) {}
360  void reset( assuan_context_t ctx=0 ) { AssuanContextBase::reset( ctx, &assuan_disconnect ); }
361 #else
362  explicit AssuanClientContext( assuan_context_t ctx ) : AssuanContextBase( ctx, &my_assuan_release ) {}
363  void reset( assuan_context_t ctx=0 ) { AssuanContextBase::reset( ctx, &my_assuan_release ); }
364 #endif
365  };
366 }
367 
368 #ifdef HAVE_ASSUAN2
369 // compatibility typedef - remove when we require assuan v2...
370 typedef gpg_error_t assuan_error_t;
371 #endif
372 
373 static assuan_error_t
374 my_assuan_transact( const AssuanClientContext & ctx,
375  const char *command,
376  assuan_error_t (*data_cb)( void *, const void *, size_t )=0,
377  void * data_cb_arg=0,
378  assuan_error_t (*inquire_cb)( void *, const char * )=0,
379  void * inquire_cb_arg=0,
380  assuan_error_t (*status_cb)( void *, const char * )=0,
381  void * status_cb_arg=0)
382 {
383  return assuan_transact( ctx.get(), command, data_cb, data_cb_arg, inquire_cb, inquire_cb_arg, status_cb, status_cb_arg );
384 }
385 
386 static QString to_error_string( int err ) {
387  char buffer[1024];
388  gpg_strerror_r( static_cast<gpg_error_t>(err),
389  buffer, sizeof buffer );
390  buffer[sizeof buffer - 1] = '\0';
391  return QString::fromLocal8Bit( buffer );
392 }
393 
394 static QString gnupg_home_directory() {
395 #ifdef Q_OS_WIN
396  return QFile::decodeName( default_homedir() );
397 #else
398  const QByteArray gnupgHome = qgetenv( "GNUPGHOME" );
399  if ( !gnupgHome.isEmpty() )
400  return QFile::decodeName( gnupgHome );
401  else
402  return QDir::homePath() + QLatin1String( "/.gnupg" );
403 #endif
404 }
405 
406 static QString get_default_socket_name() {
407  const QString homeDir = gnupg_home_directory();
408  if ( homeDir.isEmpty() )
409  return QString();
410  return QDir( homeDir ).absoluteFilePath( QLatin1String( "S.uiserver" ) );
411 }
412 
413 static QString default_socket_name() {
414  static QString name = get_default_socket_name();
415  return name;
416 }
417 
418 static QString uiserver_executable() {
419  return QLatin1String( "kleopatra" );
420 }
421 
422 static QString start_uiserver() {
423  if ( !QProcess::startDetached( uiserver_executable(), QStringList() << QLatin1String( "--daemon" ) ) )
424  return Command::tr( "Failed to start uiserver %1" ).arg( uiserver_executable() );
425  else
426  return QString();
427 }
428 
429 static assuan_error_t getinfo_pid_cb( void * opaque, const void * buffer, size_t length ) {
430  qint64 & pid = *static_cast<qint64*>( opaque );
431  pid = QByteArray( static_cast<const char*>( buffer ), length ).toLongLong();
432  return 0;
433 }
434 
435 static assuan_error_t command_data_cb( void * opaque, const void * buffer, size_t length ) {
436  QByteArray & ba = *static_cast<QByteArray*>( opaque );
437  ba.append( QByteArray( static_cast<const char*>(buffer), length ) );
438  return 0;
439 }
440 
441 namespace {
442  struct inquire_data {
443  const std::map<std::string,QByteArray> * map;
444  const AssuanClientContext * ctx;
445  };
446 }
447 
448 static assuan_error_t command_inquire_cb( void * opaque, const char * what ) {
449  if ( !opaque )
450  return 0;
451  const inquire_data & id = *static_cast<const inquire_data*>( opaque );
452  const std::map<std::string,QByteArray>::const_iterator it = id.map->find( what );
453  if ( it != id.map->end() ) {
454  const QByteArray & v = it->second;
455  assuan_send_data( id.ctx->get(), v.data(), v.size() );
456  }
457  return 0;
458 }
459 
460 static inline std::ostream & operator<<( std::ostream & s, const QByteArray & ba ) {
461  return s << std::string( ba.data(), ba.size() );
462 }
463 
464 static assuan_error_t send_option( const AssuanClientContext & ctx, const char * name, const QVariant & value ) {
465  std::stringstream ss;
466  ss << "OPTION " << name;
467  if ( value.isValid() )
468  ss << '=' << value.toString().toUtf8();
469  return my_assuan_transact( ctx, ss.str().c_str() );
470 }
471 
472 static assuan_error_t send_file( const AssuanClientContext & ctx, const QString & file ) {
473  std::stringstream ss;
474  ss << "FILE " << hexencode( QFile::encodeName( file ) );
475  return my_assuan_transact( ctx, ss.str().c_str() );
476 }
477 
478 static assuan_error_t send_recipient( const AssuanClientContext & ctx, const QString & recipient, bool info ) {
479  std::stringstream ss;
480  ss << "RECIPIENT ";
481  if ( info )
482  ss << "--info ";
483  ss << "--" << hexencode( recipient.toUtf8() );
484  return my_assuan_transact( ctx, ss.str().c_str() );
485 }
486 
487 static assuan_error_t send_sender( const AssuanClientContext & ctx, const QString & sender, bool info ) {
488  std::stringstream ss;
489  ss << "SENDER ";
490  if ( info )
491  ss << "--info ";
492  ss << "--" << hexencode( sender.toUtf8() );
493  return my_assuan_transact( ctx, ss.str().c_str() );
494 }
495 
496 void Command::Private::run() {
497 
498  // Take a snapshot of the input data, and clear the output data:
499  Inputs in;
500  Outputs out;
501  {
502  const QMutexLocker locker( &mutex );
503  in = inputs;
504  outputs = out;
505  }
506 
507  out.canceled = false;
508 
509  if ( out.serverLocation.isEmpty() )
510  out.serverLocation = default_socket_name();
511 
512 #ifndef HAVE_ASSUAN2
513  assuan_context_t naked_ctx = 0;
514 #endif
515  AssuanClientContext ctx;
516  assuan_error_t err = 0;
517 
518  inquire_data id = { &in.inquireData, &ctx };
519 
520  const QString socketName = out.serverLocation;
521  if ( socketName.isEmpty() ) {
522  out.errorString = tr("Invalid socket name!");
523  goto leave;
524  }
525 
526 #ifndef HAVE_ASSUAN2
527  err = assuan_socket_connect( &naked_ctx, QFile::encodeName( socketName ).constData(), -1 );
528 #else
529  {
530  assuan_context_t naked_ctx = 0;
531  err = assuan_new( &naked_ctx );
532  if ( err ) {
533  out.errorString = tr( "Could not allocate resources to connect to Kleopatra UI server at %1: %2" )
534  .arg( socketName, to_error_string( err ) );
535  goto leave;
536  }
537 
538  ctx.reset( naked_ctx );
539  }
540 
541 
542  err = assuan_socket_connect( ctx.get(), QFile::encodeName( socketName ).constData(), -1, 0 );
543 #endif
544  if ( err ) {
545  qDebug( "UI server not running, starting it" );
546 
547  const QString errorString = start_uiserver();
548  if ( !errorString.isEmpty() ) {
549  out.errorString = errorString;
550  goto leave;
551  }
552 
553  // give it a bit of time to start up and try a couple of times
554  for ( int i = 0 ; err && i < 20 ; ++i ) {
555  msleep( 500 );
556 #ifndef HAVE_ASSUAN2
557  err = assuan_socket_connect( &naked_ctx, QFile::encodeName( socketName ).constData(), -1 );
558 #else
559  err = assuan_socket_connect( ctx.get(), QFile::encodeName( socketName ).constData(), -1, 0 );
560 #endif
561  }
562  }
563 
564  if ( err ) {
565  out.errorString = tr( "Could not connect to Kleopatra UI server at %1: %2" )
566  .arg( socketName, to_error_string( err ) );
567  goto leave;
568  }
569 
570 #ifndef HAVE_ASSUAN2
571  ctx.reset( naked_ctx );
572  naked_ctx = 0;
573 #endif
574 
575  out.serverPid = -1;
576  err = my_assuan_transact( ctx, "GETINFO pid", &getinfo_pid_cb, &out.serverPid );
577  if ( err || out.serverPid <= 0 ) {
578  out.errorString = tr( "Could not get the process-id of the Kleopatra UI server at %1: %2" )
579  .arg( socketName, to_error_string( err ) );
580  goto leave;
581  }
582 
583  qDebug() << "Server PID =" << out.serverPid;
584 
585 #if defined(Q_OS_WIN)
586  if ( !AllowSetForegroundWindow( (pid_t)out.serverPid ) )
587  qDebug() << "AllowSetForegroundWindow(" << out.serverPid << ") failed: " << GetLastError();
588 #endif
589 
590  if ( in.command.isEmpty() )
591  goto leave;
592 
593  if ( in.parentWId ) {
594 #if defined(Q_OS_WIN32)
595  err = send_option( ctx, "window-id", QString().sprintf( "%lx", reinterpret_cast<quintptr>( in.parentWId ) ) );
596 #else
597  err = send_option( ctx, "window-id", QString().sprintf( "%lx", static_cast<unsigned long>( in.parentWId ) ) );
598 #endif
599  if ( err )
600  qDebug( "sending option window-id failed - ignoring" );
601  }
602 
603  for ( std::map<std::string,Option>::const_iterator it = in.options.begin(), end = in.options.end() ; it != end ; ++it )
604  if ( ( err = send_option( ctx, it->first.c_str(), it->second.hasValue ? it->second.value.toString() : QVariant() ) ) ) {
605  if ( it->second.isCritical ) {
606  out.errorString = tr("Failed to send critical option %1: %2")
607  .arg( QString::fromLatin1( it->first.c_str() ), to_error_string( err ) );
608  goto leave;
609  } else {
610  qDebug() << "Failed to send non-critical option" << it->first.c_str() << ":" << to_error_string( err );
611  }
612  }
613 
614  Q_FOREACH( const QString & filePath, in.filePaths )
615  if ( ( err = send_file( ctx, filePath ) ) ) {
616  out.errorString = tr("Failed to send file path %1: %2")
617  .arg( filePath, to_error_string( err ) );
618  goto leave;
619  }
620 
621  Q_FOREACH( const QString & sender, in.senders )
622  if ( ( err = send_sender( ctx, sender, in.areSendersInformative ) ) ) {
623  out.errorString = tr("Failed to send sender %1: %2")
624  .arg( sender, to_error_string( err ) );
625  goto leave;
626  }
627 
628  Q_FOREACH( const QString & recipient, in.recipients )
629  if ( ( err = send_recipient( ctx, recipient, in.areRecipientsInformative ) ) ) {
630  out.errorString = tr("Failed to send recipient %1: %2")
631  .arg( recipient, to_error_string( err ) );
632  goto leave;
633  }
634 
635 #if 0
636  setup I/O;
637 #endif
638 
639  err = my_assuan_transact( ctx, in.command.constData(), &command_data_cb, &out.data, &command_inquire_cb, &id );
640  if ( err ) {
641  if ( gpg_err_code( err ) == GPG_ERR_CANCELED )
642  out.canceled = true;
643  else
644  out.errorString = tr( "Command (%1) failed: %2" )
645  .arg( QString::fromLatin1( in.command.constData() ) ).arg( to_error_string( err ) );
646  goto leave;
647  }
648 
649 
650  leave:
651  const QMutexLocker locker( &mutex );
652  // copy outputs to where Command can see them:
653  outputs = out;
654 }
KLEOPATRACLIENT_NAMESPACE::Command::Private
Definition: libkleopatraclient/core/command_p.h:37
KLEOPATRACLIENT_NAMESPACE::Command::serverLocation
QString serverLocation() const
Definition: libkleopatraclient/core/command.cpp:146
command.h
KLEOPATRACLIENT_NAMESPACE::Command::cancel
void cancel()
Definition: libkleopatraclient/core/command.cpp:187
KLEOPATRACLIENT_NAMESPACE::Command::filePaths
QStringList filePaths() const
Definition: libkleopatraclient/core/command.cpp:261
QByteArray
KLEOPATRACLIENT_NAMESPACE::Command::receivedData
QByteArray receivedData() const
Definition: libkleopatraclient/core/command.cpp:327
QObject::sender
QObject * sender() const
KLEOPATRACLIENT_NAMESPACE::Command::error
bool error() const
Definition: libkleopatraclient/core/command.cpp:161
QProcess::startDetached
bool startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid)
QByteArray::isNull
bool isNull() const
KLEOPATRACLIENT_NAMESPACE::Command::setSenders
void setSenders(const QStringList &senders, bool informative)
Definition: libkleopatraclient/core/command.cpp:284
QByteArray::isEmpty
bool isEmpty() const
default_socket_name
static QString default_socket_name()
Definition: libkleopatraclient/core/command.cpp:413
QVariant::value
T value() const
send_sender
static assuan_error_t send_sender(const AssuanClientContext &ctx, const QString &sender, bool info)
Definition: libkleopatraclient/core/command.cpp:487
send_option
static assuan_error_t send_option(const AssuanClientContext &ctx, const char *name, const QVariant &value)
Definition: libkleopatraclient/core/command.cpp:464
KLEOPATRACLIENT_NAMESPACE::Command::senders
QStringList senders() const
Definition: libkleopatraclient/core/command.cpp:290
default_homedir
char * default_homedir(void)
gnupg-registry.h
KLEOPATRACLIENT_NAMESPACE::Command::wasCanceled
bool wasCanceled() const
Definition: libkleopatraclient/core/command.cpp:166
AssuanContextBase
shared_ptr< remove_pointer< assuan_context_t >::type > AssuanContextBase
Definition: libkleopatraclient/core/command.cpp:354
KLEOPATRACLIENT_NAMESPACE::Command::parentWId
WId parentWId() const
Definition: libkleopatraclient/core/command.cpp:135
KLEOPATRACLIENT_NAMESPACE::Command::errorString
QString errorString() const
Definition: libkleopatraclient/core/command.cpp:171
KLEOPATRACLIENT_NAMESPACE::Command::start
void start()
Definition: libkleopatraclient/core/command.cpp:183
QDir::homePath
QString homePath()
my_assuan_transact
static assuan_error_t my_assuan_transact(const AssuanClientContext &ctx, const char *command, assuan_error_t(*data_cb)(void *, const void *, size_t)=0, void *data_cb_arg=0, assuan_error_t(*inquire_cb)(void *, const char *)=0, void *inquire_cb_arg=0, assuan_error_t(*status_cb)(void *, const char *)=0, void *status_cb_arg=0)
Definition: libkleopatraclient/core/command.cpp:374
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
getinfo_pid_cb
static assuan_error_t getinfo_pid_cb(void *opaque, const void *buffer, size_t length)
Definition: libkleopatraclient/core/command.cpp:429
KLEOPATRACLIENT_NAMESPACE::Command::~Command
~Command()
Definition: libkleopatraclient/core/command.cpp:121
QThread::start
void start(Priority priority)
QObject::name
const char * name() const
boost::shared_ptr
Definition: encryptemailcontroller.h:51
QString::fromLocal8Bit
QString fromLocal8Bit(const char *str, int size)
hexencode
static std::string hexencode(const std::string &in)
Definition: libkleopatraclient/core/command.cpp:60
d
#define d
Definition: adduseridcommand.cpp:89
KLEOPATRACLIENT_NAMESPACE::Command::Command
Command(QObject *parent=0)
Definition: libkleopatraclient/core/command.cpp:109
KLEOPATRACLIENT_NAMESPACE::Command::areSendersInformative
bool areSendersInformative() const
Definition: libkleopatraclient/core/command.cpp:295
operator<<
static std::ostream & operator<<(std::ostream &s, const QByteArray &ba)
Definition: libkleopatraclient/core/command.cpp:460
KLEOPATRACLIENT_NAMESPACE::Command::serverPid
qint64 serverPid() const
Definition: libkleopatraclient/core/command.cpp:177
KLEOPATRACLIENT_NAMESPACE::Command::inquireData
QByteArray inquireData(const char *what) const
Definition: libkleopatraclient/core/command.cpp:311
KLEOPATRACLIENT_NAMESPACE::Command::setCommand
void setCommand(const char *command)
Definition: libkleopatraclient/core/command.cpp:333
uiserver_executable
static QString uiserver_executable()
Definition: libkleopatraclient/core/command.cpp:418
QObject
KLEOPATRACLIENT_NAMESPACE::Command::isInquireDataSet
bool isInquireDataSet(const char *what) const
Definition: libkleopatraclient/core/command.cpp:320
KLEOPATRACLIENT_NAMESPACE::Command::setInquireData
void setInquireData(const char *what, const QByteArray &data)
Definition: libkleopatraclient/core/command.cpp:301
KLEOPATRACLIENT_NAMESPACE::Command::unsetInquireData
void unsetInquireData(const char *what)
Definition: libkleopatraclient/core/command.cpp:306
QString::isEmpty
bool isEmpty() const
start_uiserver
static QString start_uiserver()
Definition: libkleopatraclient/core/command.cpp:422
QByteArray::constData
const char * constData() const
KLEOPATRACLIENT_NAMESPACE::Command::waitForFinished
bool waitForFinished()
Definition: libkleopatraclient/core/command.cpp:152
KLEOPATRACLIENT_NAMESPACE::Command::setServerLocation
void setServerLocation(const QString &location)
Definition: libkleopatraclient/core/command.cpp:141
gnupg_home_directory
static QString gnupg_home_directory()
Definition: libkleopatraclient/core/command.cpp:394
QString
mutex
static QMutex mutex
Definition: sessiondata.cpp:50
QtConcurrent::map
QFuture< void > map(Sequence &sequence, MapFunction function)
KLEOPATRACLIENT_NAMESPACE::Command::areRecipientsInformative
bool areRecipientsInformative() const
Definition: libkleopatraclient/core/command.cpp:278
QStringList
KLEOPATRACLIENT_NAMESPACE::Command::d
Private * d
Definition: libkleopatraclient/core/command.h:96
QByteArray::append
QByteArray & append(char ch)
KLEOPATRACLIENT_NAMESPACE::Command::setOptionValue
void setOptionValue(const char *name, const QVariant &value, bool critical=true)
Definition: libkleopatraclient/core/command.cpp:192
KLEOPATRACLIENT_NAMESPACE::Command::isOptionSet
bool isOptionSet(const char *name) const
Definition: libkleopatraclient/core/command.cpp:241
get_default_socket_name
static QString get_default_socket_name()
Definition: libkleopatraclient/core/command.cpp:406
QByteArray::toLongLong
qlonglong toLongLong(bool *ok, int base) const
QDir
KLEOPATRACLIENT_NAMESPACE::Command::isOptionCritical
bool isOptionCritical(const char *name) const
Definition: libkleopatraclient/core/command.cpp:248
string
const char * string
Definition: verifychecksumscontroller.cpp:510
KLEOPATRACLIENT_NAMESPACE::Command::setParentWId
void setParentWId(WId wid)
Definition: libkleopatraclient/core/command.cpp:130
send_recipient
static assuan_error_t send_recipient(const AssuanClientContext &ctx, const QString &recipient, bool info)
Definition: libkleopatraclient/core/command.cpp:478
command_p.h
KLEOPATRACLIENT_NAMESPACE::Command::setFilePaths
void setFilePaths(const QStringList &filePaths)
Definition: libkleopatraclient/core/command.cpp:256
QThread::wait
bool wait(unsigned long time)
QLatin1String
QMutexLocker
KLEOPATRACLIENT_NAMESPACE::Command::command
QByteArray command() const
Definition: libkleopatraclient/core/command.cpp:338
QDir::absoluteFilePath
QString absoluteFilePath(const QString &fileName) const
QByteArray::data
char * data()
QString::fromLatin1
QString fromLatin1(const char *str, int size)
QVariant::isValid
bool isValid() const
KLEOPATRACLIENT_NAMESPACE::Command::setOption
void setOption(const char *name, bool critical=true)
Definition: libkleopatraclient/core/command.cpp:217
KLEOPATRACLIENT_NAMESPACE::Command::optionValue
QVariant optionValue(const char *name) const
Definition: libkleopatraclient/core/command.cpp:204
QThread::started
void started()
KLEOPATRACLIENT_NAMESPACE::Command::recipients
QStringList recipients() const
Definition: libkleopatraclient/core/command.cpp:273
KLEOPATRACLIENT_NAMESPACE::Command::unsetOption
void unsetOption(const char *name)
Definition: libkleopatraclient/core/command.cpp:234
QByteArray::size
int size() const
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
to_error_string
static QString to_error_string(int err)
Definition: libkleopatraclient/core/command.cpp:386
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QVariant::toString
QString toString() const
command_inquire_cb
static assuan_error_t command_inquire_cb(void *opaque, const char *what)
Definition: libkleopatraclient/core/command.cpp:448
command_data_cb
static assuan_error_t command_data_cb(void *opaque, const void *buffer, size_t length)
Definition: libkleopatraclient/core/command.cpp:435
KLEOPATRACLIENT_NAMESPACE::Command::setRecipients
void setRecipients(const QStringList &recipients, bool informative)
Definition: libkleopatraclient/core/command.cpp:267
QFile::encodeName
QByteArray encodeName(const QString &fileName)
KLEOPATRACLIENT_NAMESPACE
#define KLEOPATRACLIENT_NAMESPACE
Definition: kleopatraclient_export.h:61
QFile::decodeName
QString decodeName(const QByteArray &localFileName)
QThread::finished
void finished()
send_file
static assuan_error_t send_file(const AssuanClientContext &ctx, const QString &file)
Definition: libkleopatraclient/core/command.cpp:472
qDebug
#define qDebug
Definition: kdpipeiodevice.cpp:62
QVariant
QString::toUtf8
QByteArray toUtf8() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:33:10 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