• 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
systrayicon.cpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset:4 -*-
2  systemtrayicon.cpp
3 
4  This file is part of Kleopatra, the KDE keymanager
5  Copyright (c) 2007 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 "systrayicon.h"
36 
37 #ifndef QT_NO_SYSTEMTRAYICON
38 
39 #include "mainwindow.h"
40 #include "kleopatraapplication.h"
41 
42 #include <smartcard/readerstatus.h>
43 
44 #include <utils/kdsignalblocker.h>
45 
46 #include <commands/importcertificatefromclipboardcommand.h>
47 #include <commands/encryptclipboardcommand.h>
48 #include <commands/signclipboardcommand.h>
49 #include <commands/decryptverifyclipboardcommand.h>
50 #include <commands/setinitialpincommand.h>
51 #include <commands/learncardkeyscommand.h>
52 
53 #include <KIcon>
54 #include <KLocale>
55 #include <KAboutApplicationDialog>
56 #include <KAboutData>
57 #include <KComponentData>
58 #include <KWindowSystem>
59 
60 #include <QMenu>
61 #include <QAction>
62 #include <QTimer>
63 #include <QApplication>
64 #include <QClipboard>
65 #include <QPointer>
66 
67 #include <boost/shared_ptr.hpp>
68 #include <boost/bind.hpp>
69 
70 #include <cassert>
71 
72 using namespace boost;
73 using namespace Kleo;
74 using namespace Kleo::Commands;
75 using namespace Kleo::SmartCard;
76 
77 class SysTrayIcon::Private {
78  friend class ::SysTrayIcon;
79  SysTrayIcon * const q;
80 public:
81  explicit Private( SysTrayIcon * qq );
82  ~Private();
83 
84 private:
85  void slotAbout() {
86  if ( !aboutDialog ) {
87  aboutDialog = new KAboutApplicationDialog( KGlobal::mainComponent().aboutData() );
88  aboutDialog->setAttribute( Qt::WA_DeleteOnClose );
89  }
90 
91  if ( aboutDialog->isVisible() )
92  aboutDialog->raise();
93  else
94  aboutDialog->show();
95  }
96 
97  void enableDisableActions() {
98  //work around a Qt bug (seen with Qt 4.4.0, Windows): QClipBoard->mimeData() triggers QClipboard::changed(),
99  //triggering slotEnableDisableActions again
100  const KDSignalBlocker blocker( QApplication::clipboard() );
101  openCertificateManagerAction.setEnabled( !q->mainWindow() || !q->mainWindow()->isVisible() );
102  importClipboardAction.setEnabled( ImportCertificateFromClipboardCommand::canImportCurrentClipboard() );
103  encryptClipboardAction.setEnabled( EncryptClipboardCommand::canEncryptCurrentClipboard() );
104  openPGPSignClipboardAction.setEnabled( SignClipboardCommand::canSignCurrentClipboard() );
105  smimeSignClipboardAction.setEnabled( SignClipboardCommand::canSignCurrentClipboard() );
106  decryptVerifyClipboardAction.setEnabled( DecryptVerifyClipboardCommand::canDecryptVerifyCurrentClipboard() );
107  setInitialPinAction.setEnabled( anyCardHasNullPin );
108  learnCertificatesAction.setEnabled( anyCardCanLearnKeys );
109 
110  q->setAttentionWanted( ( anyCardHasNullPin || anyCardCanLearnKeys ) && !q->attentionWindow() );
111  }
112 
113  void startCommand( Command * cmd ) {
114  assert( cmd );
115  cmd->setParent( q->mainWindow() );
116  cmd->start();
117  }
118 
119  void slotImportClipboard() {
120  startCommand( new ImportCertificateFromClipboardCommand( 0 ) );
121  }
122 
123  void slotEncryptClipboard() {
124  startCommand( new EncryptClipboardCommand( 0 ) );
125  }
126 
127  void slotOpenPGPSignClipboard() {
128  startCommand( new SignClipboardCommand( GpgME::OpenPGP, 0 ) );
129  }
130 
131  void slotSMIMESignClipboard() {
132  startCommand( new SignClipboardCommand( GpgME::CMS, 0 ) );
133  }
134 
135  void slotDecryptVerifyClipboard() {
136  startCommand( new DecryptVerifyClipboardCommand( 0 ) );
137  }
138 
139  void slotSetInitialPin() {
140  SetInitialPinCommand * cmd = new SetInitialPinCommand;
141  q->setAttentionWindow( cmd->dialog() );
142  startCommand( cmd );
143  }
144 
145  void slotLearnCertificates() {
146  LearnCardKeysCommand * cmd = new LearnCardKeysCommand( GpgME::CMS );
147  q->setAttentionWindow( cmd->dialog() );
148  startCommand( cmd );
149  }
150 
151 private:
152  bool anyCardHasNullPin;
153  bool anyCardCanLearnKeys;
154 
155  QMenu menu;
156  QAction openCertificateManagerAction;
157  QAction configureAction;
158  QAction aboutAction;
159  QAction quitAction;
160  QMenu clipboardMenu;
161  QAction importClipboardAction;
162  QAction encryptClipboardAction;
163  QAction smimeSignClipboardAction;
164  QAction openPGPSignClipboardAction;
165  QAction decryptVerifyClipboardAction;
166  QMenu cardMenu;
167  QAction updateCardStatusAction;
168  QAction setInitialPinAction;
169  QAction learnCertificatesAction;
170 
171  QPointer<KAboutApplicationDialog> aboutDialog;
172 };
173 
174 SysTrayIcon::Private::Private( SysTrayIcon * qq )
175  : q( qq ),
176  anyCardHasNullPin( false ),
177  anyCardCanLearnKeys( false ),
178  menu(),
179  openCertificateManagerAction( i18n("&Open Certificate Manager..."), q ),
180  configureAction( i18n("&Configure %1...", KGlobal::mainComponent().aboutData()->programName() ), q ),
181  aboutAction( i18n("&About %1...", KGlobal::mainComponent().aboutData()->programName() ), q ),
182  quitAction( i18n("&Shutdown Kleopatra"), q ),
183  clipboardMenu( i18n("Clipboard" ) ),
184  importClipboardAction( i18n("Certificate Import"), q ),
185  encryptClipboardAction( i18n("Encrypt..."), q ),
186  smimeSignClipboardAction( i18n("S/MIME-Sign..."), q ),
187  openPGPSignClipboardAction( i18n("OpenPGP-Sign..."), q ),
188  decryptVerifyClipboardAction( i18n("Decrypt/Verify..."), q ),
189  cardMenu( i18n("SmartCard") ),
190  updateCardStatusAction( i18n("Update Card Status"), q ),
191  setInitialPinAction( i18n("Set NetKey v3 Initial PIN..."), q ),
192  learnCertificatesAction( i18n("Learn NetKey v3 Card Certificates"), q ),
193  aboutDialog()
194 {
195  q->setNormalIcon( KIcon( QLatin1String("kleopatra") ) );
196  q->setAttentionIcon( KIcon( QLatin1String("secure-card") ) );
197 
198  KDAB_SET_OBJECT_NAME( menu );
199  KDAB_SET_OBJECT_NAME( openCertificateManagerAction );
200  KDAB_SET_OBJECT_NAME( configureAction );
201  KDAB_SET_OBJECT_NAME( aboutAction );
202  KDAB_SET_OBJECT_NAME( quitAction );
203  KDAB_SET_OBJECT_NAME( clipboardMenu );
204  KDAB_SET_OBJECT_NAME( importClipboardAction );
205  KDAB_SET_OBJECT_NAME( encryptClipboardAction );
206  KDAB_SET_OBJECT_NAME( smimeSignClipboardAction );
207  KDAB_SET_OBJECT_NAME( openPGPSignClipboardAction );
208  KDAB_SET_OBJECT_NAME( decryptVerifyClipboardAction );
209  KDAB_SET_OBJECT_NAME( cardMenu );
210  KDAB_SET_OBJECT_NAME( setInitialPinAction );
211  KDAB_SET_OBJECT_NAME( learnCertificatesAction );
212 
213  connect( &openCertificateManagerAction, SIGNAL(triggered()), qApp, SLOT(openOrRaiseMainWindow()) );
214  connect( &configureAction, SIGNAL(triggered()), qApp, SLOT(openOrRaiseConfigDialog()) );
215  connect( &aboutAction, SIGNAL(triggered()), q, SLOT(slotAbout()) );
216  connect( &quitAction, SIGNAL(triggered()), QCoreApplication::instance(), SLOT(quit()) );
217  connect( &importClipboardAction, SIGNAL(triggered()), q, SLOT(slotImportClipboard()) );
218  connect( &encryptClipboardAction, SIGNAL(triggered()), q, SLOT(slotEncryptClipboard()) );
219  connect( &smimeSignClipboardAction, SIGNAL(triggered()), q, SLOT(slotSMIMESignClipboard()) );
220  connect( &openPGPSignClipboardAction, SIGNAL(triggered()), q, SLOT(slotOpenPGPSignClipboard()) );
221  connect( &decryptVerifyClipboardAction, SIGNAL(triggered()), q, SLOT(slotDecryptVerifyClipboard()) );
222  connect( &updateCardStatusAction, SIGNAL(triggered()), ReaderStatus::instance(), SLOT(updateStatus()) );
223  connect( &setInitialPinAction, SIGNAL(triggered()), q, SLOT(slotSetInitialPin()) );
224  connect( &learnCertificatesAction, SIGNAL(triggered()), q, SLOT(slotLearnCertificates()) );
225 
226  connect( QApplication::clipboard(), SIGNAL(changed(QClipboard::Mode)),
227  q, SLOT(slotEnableDisableActions()) );
228 
229  menu.addAction( &openCertificateManagerAction );
230  menu.addAction( &configureAction );
231  menu.addAction( &aboutAction );
232  menu.addSeparator();
233  menu.addMenu( &clipboardMenu );
234  clipboardMenu.addAction( &importClipboardAction );
235  clipboardMenu.addAction( &encryptClipboardAction );
236  clipboardMenu.addAction( &smimeSignClipboardAction );
237  clipboardMenu.addAction( &openPGPSignClipboardAction );
238  clipboardMenu.addAction( &decryptVerifyClipboardAction );
239  menu.addSeparator();
240  menu.addMenu( &cardMenu );
241  cardMenu.addAction( &updateCardStatusAction );
242  cardMenu.addAction( &setInitialPinAction );
243  cardMenu.addAction( &learnCertificatesAction );
244  menu.addSeparator();
245  menu.addAction( &quitAction );
246 
247  q->setContextMenu( &menu );
248 }
249 
250 SysTrayIcon::Private::~Private() {}
251 
252 SysTrayIcon::SysTrayIcon( QObject * p )
253  : SystemTrayIcon( p ), d( new Private( this ) )
254 {
255  KGlobal::ref();
256  slotEnableDisableActions();
257 }
258 
259 SysTrayIcon::~SysTrayIcon() {
260  KGlobal::deref();
261 }
262 
263 MainWindow * SysTrayIcon::mainWindow() const {
264  return static_cast<MainWindow*>( SystemTrayIcon::mainWindow() );
265 }
266 
267 QDialog * SysTrayIcon::attentionWindow() const {
268  return static_cast<QDialog*>( SystemTrayIcon::attentionWindow() );
269 }
270 
271 void SysTrayIcon::doActivated() {
272  if ( const QWidget * const aw = attentionWindow() )
273  if ( aw->isVisible() )
274  return; // ignore clicks while an attention window is open.
275  if ( d->anyCardHasNullPin )
276  d->slotSetInitialPin();
277  else if ( d->anyCardCanLearnKeys )
278  d->slotLearnCertificates();
279  else {
280  // Toggle visibility of MainWindow
281  KleopatraApplication::instance()->toggleMainWindowVisibility();
282  }
283 }
284 
285 void SysTrayIcon::setAnyCardHasNullPin( bool on ) {
286  if ( d->anyCardHasNullPin == on )
287  return;
288  d->anyCardHasNullPin = on;
289  slotEnableDisableActions();
290 }
291 
292 void SysTrayIcon::setAnyCardCanLearnKeys( bool on ) {
293  if ( d->anyCardCanLearnKeys == on )
294  return;
295  d->anyCardCanLearnKeys = on;
296  slotEnableDisableActions();
297 }
298 
299 void SysTrayIcon::slotEnableDisableActions() {
300  d->enableDisableActions();
301 }
302 
303 #include "moc_systrayicon.cpp"
304 
305 #endif // QT_NO_SYSTEMTRAYICON
Kleo::SystemTrayIcon::slotEnableDisableActions
virtual void slotEnableDisableActions()=0
QDialog
learncardkeyscommand.h
SysTrayIcon::mainWindow
MainWindow * mainWindow() const
Definition: systrayicon.cpp:263
QWidget
Kleo::Commands::GnuPGProcessCommand::dialog
QDialog * dialog() const
Definition: gnupgprocesscommand.cpp:217
Kleo::Command::start
void start()
Definition: commands/command.cpp:182
readerstatus.h
SysTrayIcon::setAnyCardHasNullPin
void setAnyCardHasNullPin(bool)
Definition: systrayicon.cpp:285
Kleo::Commands::LearnCardKeysCommand
Definition: learncardkeyscommand.h:43
kdsignalblocker.h
Kleo::ImportCertificateFromClipboardCommand
Definition: importcertificatefromclipboardcommand.h:44
d
#define d
Definition: adduseridcommand.cpp:90
Kleo::Class::OpenPGP
Definition: classify.h:49
Kleo::Commands::SetInitialPinCommand
Definition: setinitialpincommand.h:41
mainwindow.h
KDAB_SET_OBJECT_NAME
#define KDAB_SET_OBJECT_NAME(x)
Definition: kdtoolsglobal.h:66
KleopatraApplication::instance
static KleopatraApplication * instance()
Definition: kleopatraapplication.h:54
Kleo::Class::CMS
Definition: classify.h:48
Kleo::Commands::EncryptClipboardCommand
Definition: encryptclipboardcommand.h:45
SysTrayIcon::setAnyCardCanLearnKeys
void setAnyCardCanLearnKeys(bool)
Definition: systrayicon.cpp:292
encryptclipboardcommand.h
systrayicon.h
Kleo::Commands::DecryptVerifyClipboardCommand
Definition: decryptverifyclipboardcommand.h:45
Kleo::Commands::SetInitialPinCommand::dialog
QDialog * dialog() const
Definition: setinitialpincommand.cpp:145
Kleo::Commands::SignClipboardCommand
Definition: signclipboardcommand.h:47
decryptverifyclipboardcommand.h
SysTrayIcon
Definition: systrayicon.h:45
q
#define q
Definition: adduseridcommand.cpp:91
Kleo::SystemTrayIcon
Definition: systemtrayicon.h:44
SysTrayIcon::SysTrayIcon
SysTrayIcon(QObject *parent=0)
Definition: systrayicon.cpp:252
setinitialpincommand.h
kleopatraapplication.h
KDSignalBlocker
Exception-safe and convenient wrapper around QObject::blockSignals()
Definition: kdsignalblocker.h:30
KleopatraApplication::toggleMainWindowVisibility
void toggleMainWindowVisibility()
Definition: kleopatraapplication.cpp:411
importcertificatefromclipboardcommand.h
Kleo::Command
Definition: commands/command.h:58
signclipboardcommand.h
SysTrayIcon::~SysTrayIcon
~SysTrayIcon()
Definition: systrayicon.cpp:259
MainWindow
Definition: kgpgconf/mainwindow.h:47
SysTrayIcon::attentionWindow
QDialog * attentionWindow() const
Definition: systrayicon.cpp:267
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