• 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
kabcpersistence.cpp
Go to the documentation of this file.
1 /*
2  addressbooklink.cpp - Manages operations involving the KDE Address Book
3 
4  Copyright (c) 2005 Will Stephenson <wstephenson@kde.org>
5 
6  Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
7 
8  *************************************************************************
9  * *
10  * This library is free software; you can redistribute it and/or *
11  * modify it under the terms of the GNU Lesser General Public *
12  * License as published by the Free Software Foundation; either *
13  * version 2 of the License, or (at your option) any later version. *
14  * *
15  *************************************************************************
16 */
17 
18 #include "kabcpersistence.h"
19 
20 #include <qstring.h>
21 #include <qtimer.h>
22 
23 #include <kabc/addressbook.h>
24 #include <kabc/addressee.h>
25 #include <kabc/resource.h>
26 #include <kabc/stdaddressbook.h>
27 
28 // UI related includes used for importing from KABC
29 #include <kdialog.h>
30 #include <klocale.h>
31 #include <kmessagebox.h>
32 #include "accountselector.h"
33 #include "kopeteuiglobal.h"
34 
35 #include "kopeteaccount.h"
36 #include "kopeteaccountmanager.h"
37 #include "kopetecontact.h"
38 #include "kopetemetacontact.h"
39 #include "kopetepluginmanager.h"
40 #include "kopeteprotocol.h"
41 
42 namespace Kopete
43 {
44 
48 static QString unionContents( const QString& arg1, const QString& arg2 )
49 {
50  const QChar separator( 0xE000 );
51  QStringList outList = arg1.split( separator, QString::SkipEmptyParts );
52  const QStringList arg2List = arg2.split( separator, QString::SkipEmptyParts );
53  for ( QStringList::ConstIterator it = arg2List.constBegin(); it != arg2List.constEnd(); ++it )
54  if ( !outList.contains( *it ) )
55  outList.append( *it );
56  const QString out = outList.join( QString( separator ) );
57  return out;
58 }
59 
60 class KABCPersistence::Private
61 {
62 public:
63  Private()
64  : addrBookWritePending(false)
65  {}
66  QList<KABC::Resource *> pendingResources;
67  bool addrBookWritePending;
68 
69  // FIXME: Try to remove that static variable !
70  static KABC::AddressBook* s_addressBook;
71 };
72 
73 KABC::AddressBook* KABCPersistence::Private::s_addressBook = 0L;
74 
75 KABCPersistence::KABCPersistence( QObject * parent, const char * name )
76  : QObject( parent), d(new Private())
77 {
78  setObjectName( name );
79 }
80 
81 KABCPersistence::~KABCPersistence()
82 {
83  delete d;
84 }
85 
86 KABCPersistence *KABCPersistence::self()
87 {
88  static KABCPersistence s;
89  return &s;
90 }
91 
92 KABC::AddressBook* KABCPersistence::addressBook()
93 {
94  if ( Private::s_addressBook == 0L )
95  {
96  Private::s_addressBook = KABC::StdAddressBook::self();
97  KABC::StdAddressBook::setAutomaticSave( false );
98  }
99  return Private::s_addressBook;
100 }
101 
102 void KABCPersistence::write( MetaContact * mc )
103 {
104  // Save any changes in each contact's addressBookFields to KABC
105  KABC::AddressBook* ab = addressBook();
106 
107  kDebug( 14010 ) << "looking up Addressee for " << mc->displayName() << "...";
108  // Look up the address book entry
109  KABC::Addressee theAddressee = ab->findByUid( mc->kabcId() );
110  // Check that if addressee is not deleted or if the link is spurious
111  // (inherited from Kopete < 0.8, where all metacontacts had random ids)
112  if ( theAddressee.isEmpty() )
113  {
114  // not found in currently enabled addressbooks - may be in a disabled resource...
115  return;
116  }
117  else
118  {
119  // collate the instant messaging data to be inserted into the address book
120  QMap<QString, QStringList> addressMap;
121  QList<Contact *> contacts = mc->contacts();
122  QListIterator<Contact *> cIt( contacts );
123  while ( cIt.hasNext() )
124  {
125  Contact * c = cIt.next();
126  QStringList addresses = addressMap[ c->protocol()->addressBookIndexField() ];
127  addresses.append( c->contactId() );
128  addressMap.insert( c->protocol()->addressBookIndexField(), addresses );
129  }
130 
131  // insert a custom field for each protocol
132  QMap<QString, QStringList>::ConstIterator it = addressMap.constBegin();
133  for ( ; it != addressMap.constEnd(); ++it )
134  {
135  // read existing data for this key
136  const QString currentCustomForProtocol = theAddressee.custom( it.key(), QLatin1String( "All" ) );
137  // merge without duplicating
138  const QString toWrite = unionContents( currentCustomForProtocol, it.value().join( QString( QChar( 0xE000 ) ) ) );
139  // Note if nothing ends up in the KABC data, this is because insertCustom does nothing if any param is empty.
140  kDebug( 14010 ) << "Writing: " << it.key() << ", " << "All" << ", " << toWrite;
141  theAddressee.insertCustom( it.key(), QLatin1String( "All" ), toWrite );
142  const QString check = theAddressee.custom( it.key(), QLatin1String( "All" ) );
143  }
144  ab->insertAddressee( theAddressee );
145  writeAddressBook( theAddressee.resource() );
146  //theAddressee.dump();
147  }
148 
149 /* // Wipe out the existing addressBook entries
150  d->addressBook.clear();
151  // This causes each Kopete::Protocol subclass to serialise its contacts' data into the metacontact's plugin data and address book data
152  emit aboutToSave(this);
153 
154  kDebug( 14010 ) << "...FOUND ONE!";
155  // Store address book fields
156  QMap<QString, QMap<QString, QString> >::ConstIterator appIt = d->addressBook.begin();
157  for( ; appIt != d->addressBook.end(); ++appIt )
158  {
159  QMap<QString, QString>::ConstIterator addrIt = appIt.data().begin();
160  for( ; addrIt != appIt.data().end(); ++addrIt )
161  {
162  // read existing data for this key
163  QString currentCustom = theAddressee.custom( appIt.key(), addrIt.key() );
164  // merge without duplicating
165  QString toWrite = unionContents( currentCustom, addrIt.data() );
166  // write the result
167  // Note if nothing ends up in the KABC data, this is because insertCustom does nothing if any param is empty.
168  kDebug( 14010 ) << "Writing: " << appIt.key() << ", " << addrIt.key() << ", " << toWrite;
169  theAddressee.insertCustom( appIt.key(), addrIt.key(), toWrite );
170  }
171  }
172  ab->insertAddressee( theAddressee );
173  writeAddressBook();
174  }*/
175 }
176 
177 void KABCPersistence::writeAddressBook( KABC::Resource * res)
178 {
179  if ( !d->pendingResources.count( res ) )
180  d->pendingResources.append( res );
181  if ( !d->addrBookWritePending )
182  {
183  d->addrBookWritePending = true;
184  QTimer::singleShot( 2000, this, SLOT(slotWriteAddressBook()) );
185  }
186 }
187 
188 void KABCPersistence::slotWriteAddressBook()
189 {
190  //kDebug( 14010 ) ;
191  KABC::AddressBook* ab = addressBook();
192  QListIterator<KABC::Resource *> it( d->pendingResources );
193  while ( it.hasNext() )
194  {
195  //kDebug( 14010 ) << "Writing resource " << it.current()->resourceName();
196  KABC::Ticket *ticket = ab->requestSaveTicket( it.next() );
197  if ( !ticket )
198  kWarning( 14010 ) << "WARNING: Resource is locked by other application!";
199  else
200  {
201  if ( !ab->save( ticket ) )
202  {
203  kWarning( 14010 ) << "ERROR: Saving failed!";
204  ab->releaseSaveTicket( ticket );
205  }
206  }
207  //kDebug( 14010 ) << "Finished writing KABC";
208  }
209  d->pendingResources.clear();
210  d->addrBookWritePending = false;
211 }
212 
213 void KABCPersistence::removeKABC( MetaContact *)
214 {
215 /* // remove any data this KMC has written to the KDE address book
216  // Save any changes in each contact's addressBookFields to KABC
217  KABC::AddressBook* ab = addressBook();
218 
219  // Wipe out the existing addressBook entries
220  d->addressBook.clear();
221  // This causes each Kopete::Protocol subclass to serialise its contacts' data into the metacontact's plugin data and address book data
222  emit aboutToSave(this);
223 
224  // If the metacontact is linked to a kabc entry
225  if ( !d->kabcId().isEmpty() )
226  {
227  //kDebug( 14010 ) << "looking up Addressee for " << displayName() << "...";
228  // Look up the address book entry
229  KABC::Addressee theAddressee = ab->findByUid( d->kabcId() );
230 
231  if ( theAddressee.isEmpty() )
232  {
233  // remove the link
234  //kDebug( 14010 ) << "...not found.";
235  d->kabcId.clear();
236  }
237  else
238  {
239  //kDebug( 14010 ) << "...FOUND ONE!";
240  // Remove address book fields
241  QMap<QString, QMap<QString, QString> >::ConstIterator appIt = d->addressBook.begin();
242  for( ; appIt != d->addressBook.end(); ++appIt )
243  {
244  QMap<QString, QString>::ConstIterator addrIt = appIt.data().begin();
245  for( ; addrIt != appIt.data().end(); ++addrIt )
246  {
247  // FIXME: This assumes Kopete is the only app writing these fields
248  kDebug( 14010 ) << "Removing: " << appIt.key() << ", " << addrIt.key();
249  theAddressee.removeCustom( appIt.key(), addrIt.key() );
250  }
251  }
252  ab->insertAddressee( theAddressee );
253 
254  writeAddressBook();
255  }
256  }
257 // kDebug(14010) << kBacktrace();*/
258 }
259 
260 bool KABCPersistence::syncWithKABC( MetaContact * mc )
261 {
262  kDebug(14010) ;
263  bool contactAdded = false;
264  // check whether the dontShowAgain was checked
265  KABC::AddressBook* ab = addressBook();
266  KABC::Addressee addr = ab->findByUid( mc->kabcId() );
267 
268  if ( !addr.isEmpty() ) // if we are associated with KABC
269  {
270 // load the set of addresses from KABC
271  const QStringList customs = addr.customs();
272 
273  QStringList::ConstIterator it;
274  for ( it = customs.constBegin(); it != customs.constEnd(); ++it )
275  {
276  QString app, name, value;
277  splitField( *it, app, name, value );
278  kDebug( 14010 ) << "app=" << app << " name=" << name << " value=" << value;
279 
280  if ( app.startsWith( QLatin1String( "messaging/" ) ) )
281  {
282  if ( name == QLatin1String( "All" ) )
283  {
284  kDebug( 14010 ) << " syncing \"" << app << ":" << name << " with contact list ";
285  // Get the protocol name from the custom field
286  // by chopping the 'messaging/' prefix from the custom field app name
287  QString protocolName = app.right( app.length() - 10 );
288  // munge Jabber hack
289  if ( protocolName == QLatin1String( "xmpp" ) )
290  protocolName = QLatin1String( "jabber" );
291 
292  // Check Kopete supports it
293  Protocol * proto = dynamic_cast<Protocol*>( PluginManager::self()->loadPlugin( QLatin1String( "kopete_" ) + protocolName ) );
294  if ( !proto )
295  {
296  KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry,
297  i18n( "<qt>\"%1\" is not supported by Kopete.</qt>", protocolName ),
298  i18n( "Could Not Sync with KDE Address Book" ) );
299  continue;
300  }
301 
302  // See if we need to add each contact in this protocol
303  QStringList addresses = value.split( QChar( 0xE000 ), QString::SkipEmptyParts );
304  QStringList::iterator end = addresses.end();
305  for ( QStringList::iterator it = addresses.begin(); it != end; ++it )
306  {
307  // check whether each one is present in Kopete
308  // Is it in the contact list?
309  // First discard anything after an 0xE120, this is used by IRC to separate nick and server group name, but
310  // IRC doesn't support this properly yet, so the user will have to select an appropriate account manually
311  int separatorPos = (*it).indexOf( QChar( 0xE120 ) );
312  if ( separatorPos != -1 )
313  *it = (*it).left( separatorPos );
314 
315  Kopete::MetaContact *otherMc = 0;
316  foreach( Kopete::Account *act, Kopete::AccountManager::self()->accounts() )
317  {
318  if( act->protocol() != proto )
319  continue;
320  Kopete::Contact *c= act->contacts().value(*it);
321  if(c)
322  {
323  otherMc=c->metaContact();
324  break;
325  }
326  }
327 
328  if ( otherMc ) // Is it in another metacontact?
329  {
330  // Is it already in this metacontact? If so, we needn't do anything
331  if ( otherMc == mc )
332  {
333  kDebug( 14010 ) << *it << " already a child of this metacontact.";
334  continue;
335  }
336  kDebug( 14010 ) << *it << " already exists in OTHER metacontact, move here?";
337  // find the Kopete::Contact and attempt to move it to this metacontact.
338  otherMc->findContact( proto->pluginId(), QString(), *it )->setMetaContact( mc );
339  }
340  else
341  {
342  // if not, prompt to add it
343  kDebug( 14010 ) << proto->pluginId() << "://" << *it << " was not found in the contact list. Prompting to add...";
344  if ( KMessageBox::Yes == KMessageBox::questionYesNo( Kopete::UI::Global::mainWidget(),
345  i18n( "<qt>An address was added to this contact by another application.<br />Would you like to use it in Kopete?<br /><b>Protocol:</b> %1<br /><b>Address:</b> %2</qt>", proto->displayName(), *it ), i18n( "Import Address From Address Book" ), KGuiItem( i18n("Use") ), KGuiItem( i18n("Do Not Use") ), QLatin1String( "ImportFromKABC" ) ) )
346  {
347  // Check the accounts for this protocol are all connected
348  // Most protocols do not allow you to add contacts while offline
349  // Would be better to have a virtual bool Kopete::Account::readyToAddContact()
350  int accountcount=0;
351  bool allAccountsConnected = true;
352  Kopete::Account *chosen = 0;
353  foreach( Kopete::Account *act, Kopete::AccountManager::self()->accounts() )
354  {
355  if( act->protocol() == proto)
356  {
357  accountcount++;
358  if(!act->isConnected())
359  {
360  allAccountsConnected=false;
361  break;
362  }
363  chosen=act;
364  }
365  }
366 
367  if ( !allAccountsConnected )
368  {
369  KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry,
370  i18n( "<qt>One or more of your accounts using %1 are offline. Most systems have to be connected to add contacts. Please connect these accounts and try again.</qt>", protocolName ),
371  i18n( "Not Connected" ) );
372  continue;
373  }
374 
375  // we have got a contact to add, our accounts are connected, so add it.
376  // Do we need to choose an account
377  if ( accountcount > 1 )
378  { // if we have >1 account in this protocol, prompt for the protocol.
379  KDialog *chooser = new KDialog(0);
380  chooser->setCaption( i18n("Choose Account") );
381  chooser->setButtons( KDialog::Ok | KDialog::Cancel );
382 
383  AccountSelector *accSelector = new AccountSelector(proto, chooser);
384  accSelector->setObjectName( QLatin1String("accSelector") );
385  chooser->setMainWidget(accSelector);
386  if ( chooser->exec() == QDialog::Rejected )
387  continue;
388  chosen = accSelector->selectedItem();
389 
390  delete chooser;
391  }
392  else if ( accountcount == 0 )
393  {
394  KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry,
395  i18n( "<qt>You do not have an account configured for <b>%1</b> yet. Please create an account, connect it, and try again.</qt>", protocolName ),
396  i18n( "No Account Found" ) );
397  continue;
398  }
399 
400  // add the contact to the chosen account
401  if ( chosen )
402  {
403  kDebug( 14010 ) << "Adding " << *it << " to " << chosen->accountId();
404  if ( chosen->addContact( *it, mc ) )
405  contactAdded = true;
406  else
407  KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry,
408  i18n( "<qt>It was not possible to add the contact.</qt>" ),
409  i18n( "Could Not Add Contact") ) ;
410  }
411  }
412  else
413  kDebug( 14010 ) << " user declined to add " << *it << " to contact list ";
414  }
415  }
416  kDebug( 14010 ) << " all " << addresses.count() << " contacts in " << proto->pluginId() << " checked ";
417  }
418  else
419  kDebug( 14010 ) << "not interested in name=" << name;
420 
421  }
422  else
423  kDebug( 14010 ) << "not interested in app=" << app;
424  }
425  }
426  return contactAdded;
427  return false;
428 }
429 
430 // FIXME: Remove when IM address API is in KABC (KDE 4)
431 void KABCPersistence::splitField( const QString &str, QString &app, QString &name, QString &value )
432 {
433  int colon = str.indexOf( ':' );
434  if ( colon != -1 ) {
435  const QString tmp = str.left( colon );
436  value = str.mid( colon + 1 );
437 
438  int dash = tmp.indexOf( '-' );
439  if ( dash != -1 ) {
440  app = tmp.left( dash );
441  name = tmp.mid( dash + 1 );
442  }
443  }
444 }
445 
446 } // end namespace Kopete
447 
448  // dump addressbook contents
449 
450 #include "kabcpersistence.moc"
kopetemetacontact.h
Kopete::Account::protocol
Protocol * protocol() const
Definition: kopeteaccount.cpp:216
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
Kopete::MetaContact::kabcId
QString kabcId() const
Get the KABC id for this metacontact.
Definition: kopetemetacontact.cpp:1169
QListIterator::next
const T & next()
kopeteaccount.h
Kopete::Contact::contactId
QString contactId
Definition: kopetecontact.h:70
QChar
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
Kopete::MetaContact::findContact
Contact * findContact(const QString &protocolId, const QString &accountId, const QString &contactId)
Find the Contact to a given contact.
Definition: kopetemetacontact.cpp:256
Kopete::KABCPersistence::write
void write(MetaContact *mc)
Change the KABC data associated with this metacontact.
Definition: kabcpersistence.cpp:102
Kopete::Protocol
base class of every protocol.
Definition: kopeteprotocol.h:62
kabcpersistence.h
Kopete::Account::isConnected
bool isConnected
Definition: kopeteaccount.h:81
Kopete::unionContents
static QString unionContents(const QString &arg1, const QString &arg2)
utility function to merge two QStrings containing individual elements separated by 0xE000 ...
Definition: kabcpersistence.cpp:48
Kopete::Plugin::displayName
QString displayName() const
Returns the display name of this plugin.
Definition: kopeteplugin.cpp:52
QMap::constBegin
const_iterator constBegin() const
QMap
AccountSelector::selectedItem
Kopete::Account * selectedItem()
Definition: accountselector.cpp:146
Kopete::PluginManager::loadPlugin
Plugin * loadPlugin(const QString &pluginId, PluginLoadMode mode=LoadSync)
Load a single plugin by plugin name.
Definition: kopetepluginmanager.cpp:340
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
Kopete::KABCPersistence::KABCPersistence
KABCPersistence(QObject *parent=0, const char *name=0)
Definition: kabcpersistence.cpp:75
KDialog
QStringList::join
QString join(const QString &separator) const
Kopete::AccountManager::self
static AccountManager * self()
Retrieve the instance of AccountManager.
Definition: kopeteaccountmanager.cpp:77
kopeteuiglobal.h
Kopete::Plugin::addressBookIndexField
QString addressBookIndexField() const
Return the index field as set by addAddressBookField()
Definition: kopeteplugin.cpp:105
QObject::name
const char * name() const
QList::count
int count(const T &value) const
Kopete::Contact::protocol
Protocol * protocol() const
Get the protocol that the contact belongs to.
Definition: kopetecontact.cpp:533
QList::append
void append(const T &value)
Kopete::KABCPersistence
Definition: kabcpersistence.h:44
QObject
Kopete::Account::accountId
QString accountId
Definition: kopeteaccount.h:77
Kopete::Plugin::pluginId
QString pluginId() const
Get the plugin id.
Definition: kopeteplugin.cpp:46
kopeteprotocol.h
QObject::setObjectName
void setObjectName(const QString &name)
QMap::constEnd
const_iterator constEnd() const
Kopete::MetaContact::displayName
QString displayName
Definition: kopetemetacontact.h:58
QString::startsWith
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
Kopete::KABCPersistence::~KABCPersistence
~KABCPersistence()
Definition: kabcpersistence.cpp:81
Kopete::MetaContact::contacts
QList< Contact * > contacts() const
Retrieve the list of contacts that are part of the meta contact.
Definition: kopetemetacontact.cpp:1279
QString
QList< KABC::Resource * >
Kopete::Contact
Definition: kopetecontact.h:58
QList::iterator
QStringList
QString::right
QString right(int n) const
AccountSelector
widget to select an account, based on K3ListView
Definition: accountselector.h:31
QList::end
iterator end()
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::PluginManager::self
static PluginManager * self()
Retrieve the plugin loader instance.
Definition: kopetepluginmanager.cpp:104
QMap::key
const Key key(const T &value) const
Kopete::KABCPersistence::removeKABC
void removeKABC(MetaContact *mc)
Remove any KABC data for this meta contact.
Definition: kabcpersistence.cpp:213
QString::mid
QString mid(int position, int n) const
Kopete::Contact::metaContact
MetaContact * metaContact() const
Get the metacontact for this contact.
Definition: kopetecontact.cpp:523
QLatin1String
kopeteaccountmanager.h
Kopete::KABCPersistence::syncWithKABC
bool syncWithKABC(MetaContact *mc)
Check for any new addresses added to this contact's KABC entry and prompt if they should be added in ...
Definition: kabcpersistence.cpp:260
Kopete::KABCPersistence::slotWriteAddressBook
void slotWriteAddressBook()
Perform a delayed address book write.
Definition: kabcpersistence.cpp:188
QList::ConstIterator
typedef ConstIterator
Kopete::KABCPersistence::addressBook
static KABC::AddressBook * addressBook()
Access Kopete's KDE address book instance.
Definition: kabcpersistence.cpp:92
QString::length
int length() const
QStringList::split
QStringList split(const QString &sep, const QString &str, bool allowEmptyEntries)
QString::left
QString left(int n) const
Kopete::AccountManager::accounts
const QList< Account * > & accounts() const
Retrieve the list of accounts.
Definition: kopeteaccountmanager.cpp:313
Kopete::MetaContact
Definition: kopetemetacontact.h:54
QMap::insert
iterator insert(const Key &key, const T &value)
QListIterator
QList::constEnd
const_iterator constEnd() const
QList::constBegin
const_iterator constBegin() const
Kopete::KABCPersistence::writeAddressBook
void writeAddressBook(KABC::Resource *res)
Request an address book write, will be delayed to bundle any others happening around the same time...
Definition: kabcpersistence.cpp:177
Kopete::KABCPersistence::self
static KABCPersistence * self()
Retrieve the instance of AccountManager.
Definition: kabcpersistence.cpp:86
Kopete::KABCPersistence::splitField
static void splitField(const QString &str, QString &app, QString &name, QString &value)
Definition: kabcpersistence.cpp:431
Kopete::Account
The Kopete::Account class handles one account.
Definition: kopeteaccount.h:72
Kopete::Account::contacts
const QHash< QString, Contact * > & contacts()
Retrieve the list of contacts for this account (except myself contact)
Definition: kopeteaccount.cpp:333
QList::begin
iterator begin()
kopetepluginmanager.h
kopetecontact.h
Kopete::Account::addContact
MetaContact * addContact(const QString &contactId, const QString &displayName=QString(), Group *group=0, AddMode mode=DontChangeKABC)
Create a contact (creating a new metacontact if necessary)
Definition: kopeteaccount.cpp:339
accountselector.h
name
const char * name
Definition: kopeteonlinestatus.cpp:104
QMap::value
const T value(const Key &key) const
QTimer::singleShot
singleShot
QListIterator::hasNext
bool hasNext() const
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