• 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
kopetecontactlist.cpp
Go to the documentation of this file.
1 /*
2  kopetecontactlist.cpp - Kopete's Contact List backend
3 
4  Copyright (c) 2005-2007 by Michael Larouche <larouche@kde.org>
5  Copyright (c) 2002-2003 by Martijn Klingens <klingens@kde.org>
6  Copyright (c) 2002-2004 by Olivier Goffart <ogoffart@kde.org>
7  Copyright (c) 2002 by Duncan Mac-Vicar Prett <duncan@kde.org>
8 
9  Copyright (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
10 
11  *************************************************************************
12  * *
13  * This library is free software; you can redistribute it and/or *
14  * modify it under the terms of the GNU Lesser General Public *
15  * License as published by the Free Software Foundation; either *
16  * version 2 of the License, or (at your option) any later version. *
17  * *
18  *************************************************************************
19 */
20 
21 #include "kopetecontactlist.h"
22 
23 // Qt includes
24 #include <QtCore/QDir>
25 #include <QtCore/QRegExp>
26 #include <QtCore/QTimer>
27 #include <QtCore/QTextStream>
28 
29 // KDE includes
30 #include <kabc/stdaddressbook.h>
31 #include <kapplication.h>
32 #include <kdebug.h>
33 #include <kglobal.h>
34 #include <ksavefile.h>
35 #include <kstandarddirs.h>
36 
37 // Kopete includes
38 #include "kopeteaccount.h"
39 #include "kopeteaccountmanager.h"
40 #include "kopetechatsession.h"
41 #include "kopetecontact.h"
42 #include "kopetedeletecontacttask.h"
43 #include "kopetegroup.h"
44 #include "kopetemetacontact.h"
45 #include "kopetepicture.h"
46 #include "kopetepluginmanager.h"
47 #include "kopeteprotocol.h"
48 #include "xmlcontactstorage.h"
49 
50 namespace Kopete
51 {
52 
53 class ContactList::Private
54 {public:
56  bool loaded ;
57  bool terminated;
58 
59  QList<MetaContact *> contacts;
60  QList<Group *> groups;
61  QList<MetaContact *> selectedMetaContacts;
62  QList<Group *> selectedGroups;
63 
64  QTimer *saveTimer;
65 
66  MetaContact *myself;
67 };
68 
69 ContactList *ContactList::s_self = 0L;
70 
71 ContactList *ContactList::self()
72 {
73  if( !s_self )
74  s_self = new ContactList;
75 
76  return s_self;
77 }
78 
79 ContactList::ContactList()
80  : QObject( kapp ), d(new Private())
81 {
82  setObjectName( "KopeteContactList" );
83 
84  //the myself metacontact can't be created now, because it will use
85  //ContactList::self() as parent which will call this constructor -> infinite loop
86  d->myself=0L;
87 
88  //no contact list loaded yet, don't save them
89  d->loaded=false;
90  d->terminated = false;
91 
92  // automatically save on changes to the list
93  d->saveTimer = new QTimer( this );
94  d->saveTimer->setObjectName( "saveTimer" );
95  d->saveTimer->setSingleShot( true );
96  connect( d->saveTimer, SIGNAL(timeout()), SLOT (save()) );
97 
98  connect( this, SIGNAL(metaContactAdded(Kopete::MetaContact*)), SLOT(slotSaveLater()) );
99  connect( this, SIGNAL(metaContactRemoved(Kopete::MetaContact*)), SLOT(slotSaveLater()) );
100  connect( this, SIGNAL(groupAdded(Kopete::Group*)), SLOT(slotSaveLater()) );
101  connect( this, SIGNAL(groupRemoved(Kopete::Group*)), SLOT(slotSaveLater()) );
102  connect( this, SIGNAL(groupRenamed(Kopete::Group*,QString)), SLOT(slotSaveLater()) );
103 }
104 
105 ContactList::~ContactList()
106 {
107  s_self=0L;
108  delete d->myself;
109  delete d;
110 }
111 
112 QList<MetaContact *> ContactList::metaContacts() const
113 {
114  return d->contacts;
115 }
116 
117 
118 QList<Group *> ContactList::groups() const
119 {
120  return d->groups;
121 }
122 
123 
124 MetaContact *ContactList::metaContact( const QString &metaContactId ) const
125 {
126  QListIterator<MetaContact *> it( d->contacts );
127 
128  while ( it.hasNext() )
129  {
130  MetaContact *mc = it.next();
131  if( mc->metaContactId() == QUuid( metaContactId ) )
132  return mc;
133  }
134 
135  return 0L;
136 }
137 
138 
139 Group * ContactList::group(unsigned int groupId) const
140 {
141  if ( groupId == Group::topLevel()->groupId() )
142  return Group::topLevel();
143 
144  QListIterator<Group *> it(d->groups);
145 
146  while ( it.hasNext() )
147  {
148  Group *curr = it.next();
149  if( curr->groupId()==groupId )
150  return curr;
151  }
152  return 0L;
153 }
154 
155 
156 Contact *ContactList::findContact( const QString &protocolId,
157  const QString &accountId, const QString &contactId ) const
158 {
159  //Browsing metacontacts is too slow, better to uses the Dict of the account.
160  Account *i=AccountManager::self()->findAccount(protocolId,accountId);
161  if(!i)
162  {
163  kDebug( 14010 ) << "Account not found";
164  return 0L;
165  }
166  return i->contacts().value( contactId );
167 }
168 
169 
170 MetaContact *ContactList::findMetaContactByDisplayName( const QString &displayName ) const
171 {
172  foreach(Kopete::MetaContact *contact, d->contacts)
173  {
174  if( contact->displayName() == displayName )
175  {
176  return contact;
177  }
178  }
179  return 0;
180 }
181 
182 MetaContact* ContactList::findMetaContactByContactId( const QString &contactId ) const
183 {
184  QListIterator<Kopete::Account *> it( Kopete::AccountManager::self()->accounts() );
185  Kopete::Account *a;
186  while ( it.hasNext() )
187  {
188  a = it.next();
189  Contact *c=a->contacts().value( contactId );
190  if(c && c->metaContact())
191  return c->metaContact();
192  }
193  return 0L;
194 }
195 
196 Group * ContactList::findGroup(const QString& displayName, int type)
197 {
198  if( type == Group::Temporary )
199  return Group::temporary();
200  if( type == Group::TopLevel )
201  return Group::topLevel();
202  if( type == Group::Offline )
203  return Group::offline();
204 
205  QListIterator<Group *> it(d->groups);
206  while ( it.hasNext() )
207  {
208  Group *curr = it.next();
209  if( curr->type() == type && curr->displayName() == displayName )
210  return curr;
211  }
212 
213  Group *newGroup = new Group( displayName );
214  addGroup( newGroup );
215  return newGroup;
216 }
217 
218 
219 QList<MetaContact *> ContactList::selectedMetaContacts() const
220 {
221  return d->selectedMetaContacts;
222 }
223 
224 QList<Group *> ContactList::selectedGroups() const
225 {
226  return d->selectedGroups;
227 }
228 
229 void ContactList::addMetaContacts( QList<MetaContact *> metaContacts )
230 {
231  foreach( MetaContact* mc, metaContacts )
232  addMetaContact( mc );
233 }
234 
235 void ContactList::addMetaContact( MetaContact *mc )
236 {
237  if ( d->contacts.contains( mc ) )
238  return;
239 
240  d->contacts.append( mc );
241 
242  emit metaContactAdded( mc );
243  connect( mc, SIGNAL(persistentDataChanged()), SLOT(slotSaveLater()) );
244  connect( mc, SIGNAL(addedToGroup(Kopete::MetaContact*,Kopete::Group*)), SIGNAL(metaContactAddedToGroup(Kopete::MetaContact*,Kopete::Group*)) );
245  connect( mc, SIGNAL(removedFromGroup(Kopete::MetaContact*,Kopete::Group*)), SIGNAL(metaContactRemovedFromGroup(Kopete::MetaContact*,Kopete::Group*)) );
246  connect( mc, SIGNAL(movedToGroup(Kopete::MetaContact*,Kopete::Group*,Kopete::Group*)),
247  SIGNAL(metaContactMovedToGroup(Kopete::MetaContact*,Kopete::Group*,Kopete::Group*)));
248 }
249 
250 
251 void ContactList::removeMetaContact(MetaContact *m)
252 {
253  if ( !d->contacts.contains(m) )
254  {
255  kDebug(14010) << "Trying to remove a not listed MetaContact.";
256  return;
257  }
258 
259  if ( d->selectedMetaContacts.contains( m ) )
260  {
261  d->selectedMetaContacts.removeAll( m );
262  setSelectedItems( d->selectedMetaContacts, d->selectedGroups );
263  }
264 
265  //removes subcontact from server here and now.
266  Kopete::Contact *contactToDelete = 0;
267  foreach( contactToDelete, m->contacts() )
268  {
269  // TODO: Check for good execution of task
270  Kopete::DeleteContactTask *deleteTask = new Kopete::DeleteContactTask(contactToDelete);
271  deleteTask->start();
272  }
273 
274  d->contacts.removeAll( m );
275  emit metaContactRemoved( m );
276  m->deleteLater();
277 }
278 
279 void ContactList::mergeMetaContacts( QList<MetaContact *> src, Kopete::MetaContact *dst )
280 {
281  // merge all metacontacts from src into dst
282 
283  // Note: there is no need to remove the src metacontacts, they are going to be
284  // removed when the last contact is moved to the new metacontact
285 
286  // TODO: add a confirmation dialog asking if this is really wanted
287  // TODO: add a Undo option for this
288 
289  foreach( Kopete::MetaContact *mc, src )
290  {
291  foreach( Kopete::Contact *c, mc->contacts() )
292  c->setMetaContact( dst );
293  }
294 }
295 
296 void ContactList::addGroups( QList<Group *> groups )
297 {
298  foreach( Group* g, groups )
299  addGroup( g );
300 }
301 
302 void ContactList::addGroup( Group * g )
303 {
304  if(!d->groups.contains(g) )
305  {
306  d->groups.append( g );
307  emit groupAdded( g );
308  connect( g , SIGNAL (displayNameChanged(Kopete::Group*,QString)) , this , SIGNAL (groupRenamed(Kopete::Group*,QString)) ) ;
309  }
310 }
311 
312 void ContactList::removeGroup( Group *g )
313 {
314  if ( g == Group::topLevel() )
315  return;
316 
317  if ( d->selectedGroups.contains( g ) )
318  {
319  d->selectedGroups.removeAll( g );
320  setSelectedItems( d->selectedMetaContacts, d->selectedGroups );
321  }
322 
323  // Remove metaContacts from group or delete the metaContact if it isn't in any other group
324  foreach ( MetaContact * metaContact, g->members() )
325  {
326  const QList<Group *> mcGroups = metaContact->groups();
327  if ( (mcGroups.count() == 1 && mcGroups.contains( g )) || mcGroups.isEmpty() )
328  removeMetaContact( metaContact );
329  else
330  metaContact->removeFromGroup( g );
331  }
332 
333  d->groups.removeAll( g );
334  emit groupRemoved( g );
335  g->deleteLater();
336 }
337 
338 
339 void ContactList::setSelectedItems(QList<MetaContact *> metaContacts , QList<Group *> groups)
340 {
341  kDebug( 14010 ) << metaContacts.count() << " metacontacts, " << groups.count() << " groups selected";
342  d->selectedMetaContacts=metaContacts;
343  d->selectedGroups=groups;
344 
345  emit metaContactSelected( groups.isEmpty() && metaContacts.count()==1 );
346  emit selectionChanged();
347 }
348 
349 MetaContact* ContactList::myself()
350 {
351  if(!d->myself)
352  d->myself=new MetaContact();
353  return d->myself;
354 }
355 
357 void ContactList::load()
358 {
359  // don't save when we're in the middle of this...
360  d->loaded = false;
361 
362  Kopete::ContactListStorage *storage = new Kopete::XmlContactStorage();
363  storage->load();
364  if( !storage->isValid() )
365  {
366  kDebug(14010) << "Contact list storage failed. Reason: " << storage->errorMessage();
367  }
368  else
369  {
370  addGroups( storage->groups() );
371  addMetaContacts( storage->contacts() );
372  }
373 
374  d->loaded = true;
375  delete storage;
376  emit contactListLoaded();
377 }
378 
379 bool Kopete::ContactList::loaded() const
380 {
381  return d->loaded;
382 }
383 
384 void Kopete::ContactList::save()
385 {
386  if ( d->terminated )
387  {
388  kWarning(14010) << "Contact list terminated, abort saving";
389  return;
390  }
391 
392  if( !d->loaded )
393  {
394  kDebug(14010) << "Contact list not loaded, abort saving";
395  return;
396  }
397 
398  Kopete::ContactListStorage *storage = new Kopete::XmlContactStorage();
399  storage->save();
400  if( !storage->isValid() )
401  {
402  kDebug(14010) << "Contact list storage failed. Reason: " << storage->errorMessage();
403 
404  // Saving the contact list failed. retry every minute until it works.
405  // single-shot: will get restarted by us next time if it's still failing
406  d->saveTimer->setSingleShot( true );
407  d->saveTimer->start( 60000 );
408  delete storage;
409  return;
410  }
411 
412  // cancel any scheduled saves
413  d->saveTimer->stop();
414  delete storage;
415 }
416 
417 void ContactList::shutdown()
418 {
419  if ( !d->terminated )
420  {
421  save();
422  d->terminated = true;
423  d->saveTimer->stop();
424  }
425 }
426 
427 void ContactList::slotSaveLater()
428 {
429  if ( d->terminated )
430  return;
431 
432  // if we already have a save scheduled, it will be cancelled. either way,
433  // start a timer to save the contact list a bit later.
434  d->saveTimer->start( 17100 /* 17,1 seconds */ );
435 }
436 
437 void ContactList::slotKABCChanged()
438 {
439  // TODO: react to changes in KABC, replacing this function, post 3.4 (Will)
440  // call syncWithKABC on each metacontact to check if its associated kabc entry has changed.
441 /* for ( MetaContact * mc = d->contacts.first(); mc; mc = d->contacts.next() )
442 
443  mc->syncWithKABC();*/
444 }
445 
446 
447 } //END namespace Kopete
448 
449 #include "kopetecontactlist.moc"
450 
451 // vim: set noet ts=4 sts=4 sw=4:
452 
Kopete::ContactList::myself
MetaContact * myself()
return the metacontact that represent the user itself.
Definition: kopetecontactlist.cpp:349
kopetemetacontact.h
Kopete::ContactList::self
static ContactList * self()
The contact list is a singleton object.
Definition: kopetecontactlist.cpp:71
Kopete::ContactList
manage contacts and metacontact
Definition: kopetecontactlist.h:49
Kopete::DeleteContactTask::start
virtual void start()
Begin the task.
Definition: kopetedeletecontacttask.cpp:52
Kopete::ContactList::selectionChanged
void selectionChanged()
This signal is emit when the selection has changed, it is emitted after the following slot Warning: D...
Kopete::ContactList::shutdown
void shutdown()
Definition: kopetecontactlist.cpp:417
Kopete::Group::offline
static Group * offline()
Definition: kopetegroup.cpp:51
Kopete::ContactList::groupRenamed
void groupRenamed(Kopete::Group *, const QString &oldname)
A group has just been renamed.
Kopete::ContactList::findMetaContactByContactId
MetaContact * findMetaContactByContactId(const QString &contactId) const
Find a meta contact by its contact id.
Definition: kopetecontactlist.cpp:182
QListIterator::next
const T & next()
Kopete::ContactList::groups
QList< Group * > groups() const
Definition: kopetecontactlist.cpp:118
Kopete::Group::members
QList< MetaContact * > members() const
child metacontact This function is not very efficient - it searches through all the metacontacts in t...
Definition: kopetegroup.cpp:98
kopeteaccount.h
Kopete::ContactListStorage::groups
Group::List groups() const
Get the Group list for this storage.
Definition: kopetecontactliststorage.cpp:47
Kopete::ContactList::removeGroup
void removeGroup(Kopete::Group *)
Remove a group this method delete the group.
Definition: kopetecontactlist.cpp:312
Kopete::Contact::setMetaContact
void setMetaContact(MetaContact *m)
Move this contact to a new MetaContact.
Definition: kopetecontact.cpp:420
Kopete::ContactList::findGroup
Group * findGroup(const QString &displayName, int type=0)
find a group with his displayName If a group already exists with the given name and the given type...
Definition: kopetecontactlist.cpp:196
Kopete::MetaContact::removeFromGroup
void removeFromGroup(Kopete::Group *from)
Remove a contact from one group.
Definition: kopetemetacontact.cpp:1022
Kopete::ContactList::addGroup
void addGroup(Kopete::Group *)
Add a group each group must be added on the list after his creation.
Definition: kopetecontactlist.cpp:302
Kopete::DeleteContactTask
Delete a contact in Kopete.
Definition: kopetedeletecontacttask.h:52
Kopete::ContactList::metaContactSelected
void metaContactSelected(bool)
This signal is emitted each time the selection has changed.
QUuid
kopetegroup.h
Kopete::ContactListStorage::isValid
virtual bool isValid() const =0
Check if the current ContactListStorage.
Kopete::ContactList::metaContacts
QList< MetaContact * > metaContacts() const
return a list of all metacontact of the contact list Retrieve the list of all available meta contacts...
Definition: kopetecontactlist.cpp:112
Kopete::AccountManager::self
static AccountManager * self()
Retrieve the instance of AccountManager.
Definition: kopeteaccountmanager.cpp:77
Kopete::ContactListStorage::load
virtual void load()=0
Load the contact list.
Kopete::AccountManager::findAccount
Account * findAccount(const QString &protocolId, const QString &accountId)
Return the account asked.
Definition: kopeteaccountmanager.cpp:329
Kopete::ContactListStorage::errorMessage
virtual QString errorMessage() const =0
Get a nice error message.
QList::count
int count(const T &value) const
Kopete::ContactList::groupRemoved
void groupRemoved(Kopete::Group *)
A group has just been removed.
QTimer
Kopete::Group::groupId
uint groupId
Definition: kopetegroup.h:47
Kopete::ContactList::group
Group * group(unsigned int groupId) const
return the group with the given unique id.
Definition: kopetecontactlist.cpp:139
kopetedeletecontacttask.h
Kopete::ContactList::metaContactAdded
void metaContactAdded(Kopete::MetaContact *mc)
A meta contact was added to the contact list.
QObject
kopetepicture.h
Kopete::MetaContact::metaContactId
QUuid metaContactId
Definition: kopetemetacontact.h:66
kopeteprotocol.h
QList::isEmpty
bool isEmpty() const
QObject::setObjectName
void setObjectName(const QString &name)
kopetechatsession.h
Kopete::MetaContact::displayName
QString displayName
Definition: kopetemetacontact.h:58
kopetecontactlist.h
Kopete::ContactList::~ContactList
~ContactList()
Definition: kopetecontactlist.cpp:105
Kopete::MetaContact::contacts
QList< Contact * > contacts() const
Retrieve the list of contacts that are part of the meta contact.
Definition: kopetemetacontact.cpp:1279
Kopete::ContactList::metaContactRemoved
void metaContactRemoved(Kopete::MetaContact *mc)
A metacontact has just been removed.
Kopete::ContactList::metaContactRemovedFromGroup
void metaContactRemovedFromGroup(Kopete::MetaContact *mc, Kopete::Group *from)
A contact has been removed from a group.
QObject::deleteLater
void deleteLater()
Kopete::Group::Offline
Definition: kopetegroup.h:56
QString
Kopete::ContactList::findContact
Contact * findContact(const QString &protocolId, const QString &accountId, const QString &contactId) const
find a contact in the contact list.
Definition: kopetecontactlist.cpp:156
QList< MetaContact * >
Kopete::ContactList::mergeMetaContacts
void mergeMetaContacts(QList< MetaContact * > src, Kopete::MetaContact *dst)
Merge one or more metacontacts into another one.
Definition: kopetecontactlist.cpp:279
Kopete::Contact
Definition: kopetecontact.h:58
Kopete::ContactList::metaContact
MetaContact * metaContact(const QString &metaContactId) const
Return the metacontact referenced by the given id.
Definition: kopetecontactlist.cpp:124
Kopete::ContactListStorage::contacts
MetaContact::List contacts() const
Get the MetaContact list for this storage.
Definition: kopetecontactliststorage.cpp:52
QList::contains
bool contains(const T &value) const
Kopete::ContactList::metaContactMovedToGroup
void metaContactMovedToGroup(Kopete::MetaContact *mc, Kopete::Group *from, Kopete::Group *to)
A contact has been moved from one group to another.
Kopete::ContactList::addMetaContact
void addMetaContact(Kopete::MetaContact *c)
Add the metacontact into the contact list When calling this method, the contact has to be already pla...
Definition: kopetecontactlist.cpp:235
Kopete::ContactList::addMetaContacts
void addMetaContacts(QList< MetaContact * > metaContacts)
Add metacontacts into the contact list When calling this method, contacts have to be already placed i...
Definition: kopetecontactlist.cpp:229
Kopete::Group::topLevel
static Group * topLevel()
Definition: kopetegroup.cpp:35
Kopete::ContactList::metaContactAddedToGroup
void metaContactAddedToGroup(Kopete::MetaContact *mc, Kopete::Group *to)
A contact has been added to a group.
xmlcontactstorage.h
Kopete::Contact::metaContact
MetaContact * metaContact() const
Get the metacontact for this contact.
Definition: kopetecontact.cpp:523
Kopete::ContactList::save
void save()
Definition: kopetecontactlist.cpp:384
Kopete::Group::TopLevel
Definition: kopetegroup.h:56
kopeteaccountmanager.h
Kopete::ContactList::selectedGroups
QList< Group * > selectedGroups() const
return the list of groups actualy selected in the contact list UI
Definition: kopetecontactlist.cpp:224
Kopete::ContactList::groupAdded
void groupAdded(Kopete::Group *)
A group has just been added.
Kopete::MetaContact::groups
QList< Group * > groups() const
The groups the contact is stored in.
Definition: kopetemetacontact.cpp:1069
Kopete::Group
Class which represents the Group.
Definition: kopetegroup.h:44
Kopete::ContactList::removeMetaContact
void removeMetaContact(Kopete::MetaContact *contact)
Remove a metacontact from the contact list.
Definition: kopetecontactlist.cpp:251
Kopete::MetaContact
Definition: kopetemetacontact.h:54
Kopete::Group::Temporary
Definition: kopetegroup.h:56
QListIterator
Kopete::XmlContactStorage
XML storage for contact list elements.
Definition: xmlcontactstorage.h:39
Kopete::Group::type
GroupType type() const
Definition: kopetegroup.cpp:127
Kopete::ContactList::addGroups
void addGroups(QList< Group * > groups)
Add groups each group must be added on the list after his creation.
Definition: kopetecontactlist.cpp:296
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Kopete::ContactListStorage
Provide a storage for Kopete Contact List.
Definition: kopetecontactliststorage.h:34
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
Kopete::ContactList::loaded
bool loaded() const
Definition: kopetecontactlist.cpp:379
Kopete::ContactListStorage::save
virtual void save()=0
Save the contact list.
Kopete::ContactList::findMetaContactByDisplayName
MetaContact * findMetaContactByDisplayName(const QString &displayName) const
Find a contact by display name.
Definition: kopetecontactlist.cpp:170
kopetepluginmanager.h
Kopete::ContactList::setSelectedItems
void setSelectedItems(QList< MetaContact * > metaContacts, QList< Group * > groups)
Set which items are selected in the ContactList GUI.
Definition: kopetecontactlist.cpp:339
kopetecontact.h
Kopete::ContactList::load
void load()
Definition: kopetecontactlist.cpp:357
Kopete::Group::temporary
static Group * temporary()
Definition: kopetegroup.cpp:43
Kopete::Group::displayName
QString displayName
Definition: kopetegroup.h:46
Kopete::ContactList::contactListLoaded
void contactListLoaded()
Kopete::ContactList::selectedMetaContacts
QList< MetaContact * > selectedMetaContacts() const
return the list of metacontact actually selected in the contact list UI
Definition: kopetecontactlist.cpp:219
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