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