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

kopete/libkopete

  • sources
  • kde-4.14
  • kdenetwork
  • kopete
  • libkopete
kopetewalletmanager.cpp
Go to the documentation of this file.
1 /*
2  kopetewalletmanager.cpp - Kopete Wallet Manager
3 
4  Copyright (c) 2004 by Richard Smith <kde@metafoo.co.uk>
5  Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
6 
7  *************************************************************************
8  * *
9  * This library is free software; you can redistribute it and/or *
10  * modify it under the terms of the GNU Lesser General Public *
11  * License as published by the Free Software Foundation; either *
12  * version 2 of the License, or (at your option) any later version. *
13  * *
14  *************************************************************************
15 */
16 
17 #include "kopetewalletmanager.h"
18 
19 #include "kopeteuiglobal.h"
20 
21 #include <kdebug.h>
22 #include <kwallet.h>
23 
24 #include <qtimer.h>
25 #include <qwidget.h>
26 #include <qapplication.h>
27 
28 static WId mainWindowID()
29 {
30  if ( QWidget *w = Kopete::UI::Global::mainWidget() )
31  return w->winId();
32  return 0;
33 }
34 
35 class Kopete::WalletManager::Private
36 {
37 public:
38  Private() : wallet(0), signal(0) {}
39  ~Private() { delete wallet; delete signal; }
40 
41  KWallet::Wallet *wallet;
42 
43  // we can't just connect every slot that wants the wallet to the
44  // walletOpened signal - since we disconnect all the slots immediately
45  // after emitting the signal, this would result in everyone who asked
46  // for the wallet again in response to a walletOpened signal to fail
47  // to receive it.
48  // instead, we store a KopeteWalletSignal which we connect to, and create
49  // a new one for each set of requests.
50  KopeteWalletSignal *signal;
51 };
52 
53 Kopete::WalletManager::WalletManager()
54  : d( new Private )
55 {
56 }
57 
58 Kopete::WalletManager::~WalletManager()
59 {
60  closeWallet();
61  delete d;
62 }
63 
64 Kopete::WalletManager *Kopete::WalletManager::self()
65 {
66  static WalletManager s;
67  return &s;
68 }
69 
70 void Kopete::WalletManager::openWallet( QObject *object, const char *slot )
71 {
72  if ( !d->signal )
73  d->signal = new KopeteWalletSignal;
74  // allow connecting to protected slots by calling object->connect
75  connect( d->signal, SIGNAL(walletOpened(KWallet::Wallet*)), object, slot );
76  //object->connect( d->signal, SIGNAL(walletOpened(KWallet::Wallet*)), slot );
77  openWalletInner();
78 }
79 
80 void Kopete::WalletManager::openWalletInner()
81 {
82  // do we already have a wallet?
83  if ( d->wallet )
84  {
85  // if the wallet isn't open yet, we're pending a slotWalletChangedStatus
86  // anyway, so we don't set up a single shot.
87  if ( d->wallet->isOpen() )
88  {
89  kDebug(14010) << " wallet already open";
90  QTimer::singleShot( 0, this, SLOT(slotGiveExistingWallet()) );
91  }
92  else
93  {
94  kDebug(14010) << " still waiting for earlier request";
95  }
96  return;
97  }
98 
99  kDebug(14010) << " about to open wallet async";
100 
101  // we have no wallet: ask for one.
102  d->wallet = KWallet::Wallet::openWallet( KWallet::Wallet::NetworkWallet(),
103  mainWindowID(), KWallet::Wallet::Asynchronous );
104 
105  if ( !d->wallet )
106  {
107  emitWalletOpened( 0 );
108  return;
109  }
110 
111  connect( d->wallet, SIGNAL(walletOpened(bool)), SLOT(slotWalletChangedStatus()) );
112 }
113 
114 void Kopete::WalletManager::slotWalletChangedStatus()
115 {
116  kDebug(14010) << " isOpen: " << d->wallet->isOpen();
117 
118  if( d->wallet->isOpen() )
119  {
120  if ( !d->wallet->hasFolder( QString::fromLatin1( "Kopete" ) ) )
121  d->wallet->createFolder( QString::fromLatin1( "Kopete" ) );
122 
123  if ( d->wallet->setFolder( QString::fromLatin1( "Kopete" ) ) )
124  {
125  kDebug(14010) << "Successfully opened the wallet !";
126  // success!
127  QObject::connect( d->wallet, SIGNAL(walletClosed()), this, SLOT(closeWallet()) );
128  }
129  else
130  {
131  // opened OK, but we can't use it
132  delete d->wallet;
133  d->wallet = 0;
134  }
135  }
136  else
137  {
138  // failed to open
139  delete d->wallet;
140  d->wallet = 0;
141 
142  kWarning(14010) << "wallet open error";
143  }
144 
145  emitWalletOpened( d->wallet );
146 }
147 
148 void Kopete::WalletManager::slotGiveExistingWallet()
149 {
150  kDebug(14010) << " with d->wallet " << d->wallet;
151 
152  if ( d->wallet )
153  {
154  // the wallet was already open
155  if ( d->wallet->isOpen() )
156  emitWalletOpened( d->wallet );
157  // if the wallet was not open, but d->wallet is not 0,
158  // then we're waiting for it to open, and will be told
159  // when it's done: do nothing.
160  else
161  kDebug(14010) << " wallet gone, waiting for another wallet";
162  }
163  else
164  {
165  // the wallet was lost between us trying to open it and
166  // getting called back. try to reopen it.
167  openWalletInner();
168  }
169 }
170 
171 void Kopete::WalletManager::closeWallet()
172 {
173  if ( !d->wallet ) return;
174 
175  delete d->wallet;
176  d->wallet = 0L;
177 
178  emit walletLost();
179 }
180 
181 void Kopete::WalletManager::emitWalletOpened( KWallet::Wallet *wallet )
182 {
183  KopeteWalletSignal *signal = d->signal;
184  d->signal = 0;
185  if ( signal )
186  emit signal->walletOpened( wallet );
187  delete signal;
188 }
189 
190 
191 #include "kopetewalletmanager.moc"
192 
193 // vim: set noet ts=4 sts=4 sw=4:
194 
mainWindowID
static WId mainWindowID()
Definition: kopetewalletmanager.cpp:28
QWidget
KopeteWalletSignal
Definition: kopetewalletmanager.h:105
kopeteuiglobal.h
kopetewalletmanager.h
QObject
Kopete::WalletManager::self
static WalletManager * self()
Retrieve the wallet manager instance.
Definition: kopetewalletmanager.cpp:64
KopeteWalletSignal::walletOpened
void walletOpened(KWallet::Wallet *wallet)
Kopete::UI::Global::mainWidget
KOPETE_EXPORT QWidget * mainWidget()
Returns the main widget - this is the widget that message boxes and KNotify stuff should use as a par...
Definition: kopeteuiglobal.cpp:37
Kopete::WalletManager::closeWallet
void closeWallet()
Close the connection to the wallet.
Definition: kopetewalletmanager.cpp:171
Kopete::WalletManager::~WalletManager
~WalletManager()
Definition: kopetewalletmanager.cpp:58
QString::fromLatin1
QString fromLatin1(const char *str, int size)
Kopete::WalletManager::openWallet
void openWallet(QObject *object, const char *slot)
Attempt to open the KWallet asyncronously, then signal an object to indicate the task is complete...
Definition: kopetewalletmanager.cpp:70
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Kopete::WalletManager
Definition: kopetewalletmanager.h:37
QTimer::singleShot
singleShot
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:29:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kopete/libkopete

Skip menu "kopete/libkopete"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

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