that was not a really great idea... shame on me.
[kdenetwork.git] / kopete / KABC_INTEG_NOTES
blob214c6a4af7e7b16c58a52a479fb6fe0de39d829d
1 Address book integration notes 26/08/03
3 Premise:
4 KDE captures the real life relation between IM Contacts and KABC contacts; both represent people with whom we communicate electronically - so there's no need to separate them
5 Goals:
6 *) Duplicate Information may be removed.
7 *) This enables PIM apps like KMail to use a KDE IM service (Kopete) to display IM status or perform IM actions (chatting)
8 *) Or games, desktop sharing
9 *) Ability to put IM-delivered contact data into the KDE addressbook
10 *) send vcards via kopete
12 What does Kopete get out of the association?
13 *) Ability to view KABC information on that metacontact
14 *) Use information in the KABC such as GPG key?
15 *) Can store/use KABC information in the metacontact like contact photo
18 Spaze's goals
19 1. Share data with the other PIM apps. Notably groups, display names, GPG keys, email addresses and other IM UIDs
20 2. Allow other apps to retrieve all IM-enabled contacts and their online status for e.g. presence display in kmail or invitations for desktop sharing
21 3. Allow other IM apps to share the same data that Kopete uses in a standardized way
22 4. Allow other apps to start a chat with selected persons in a standardized way _regardless of client used_
23 5. in the longer run i would like to add,say, an ICQ UIN from kaddressbook and Kopete automatically picks up the change, adds it to the server side contact list and does all other kind of syncing of changes made in kaddressbook as well. for the short term one way kopete->kabc is ok, but the API should be prepared for full bidi comms. ideally kopete, libkabc and all server side contact lists are always 100% in sync as much as possible for each.
25 mETz' goals
26 1. well, I just think Kopete should never edit my addressbook without me knowing
28 Gof's goals
29 1. my goal is to have the kopete contactlist a kind of address book  (i.e. i want to view and modify kabc entry from kopete, like if i am in the kab interface.  i do not want to open KAB
30 2. and i want to share fields (gpg key) with other application, like kmail
31 3.  technicaly, i think that should be transparent.
32 Goals (-ve):
33 *) don't store information that's not worth sharing in the address book
35 gregj's goals
36 kopete should not replace  server side data with kabc derived data nor upload information that wasn't present on the server before. 
37 E.g. we know someones telephone nr. but we don't want to put this information back on server if it was not present there before. Update IMO is ok.  
39 brunes goals
40 the only points I wanted to make were 
41 1. I think the MSN / OSCAR picture support should somehow integrate with / use the picture in kaddressbook, and
42 2. we need to get the KAB guys to add >1 field for IM account in KAB, and all the contacts for a MC should have their accounts there
44 Syncing policies
45 KABC->kopete ok, what about server side metadata
47 Display Name
49 Priority: Goals for 3.2
50 ONLY the actual linking and one-way storage from kopete in kabc and retrieval of display name and address book data
51 Also ability to add kabc contained contacts to kopete ( selected ones only )
53 Linking
54 use KMC UID to store KABC uid, QString::null if no link.
55 Establish the link using KMC Props dialog (mETz: Alt+return shortcut to open pls).
56 Policy:
57 One way kopete->kabc contacts
58 , achieve bidi later
59 <Bille> what about the sync policy between IM contacts contained in kabc and in kopete
60 <spaze> mETz: alt-enter doesn't work? report a bug to klistview/qlistview, that sucks :( </ot>
61 <gregj> hyhy
62 <spaze> Bille: implied i'd say
63 <Bille> for example - in Addressee A I already have 3 IM id's added with another client - if i associate him with a Kopete MC
64 <Gof> first, we need to do the link (almost done?)  after, we will see
65 <spaze> Bille: oh, that
66 <Bille> do i want to add those contacts to the MC?
67 <spaze> ugh..
68 <Gof> and the wizzard iontegration is in the link
69 <Gof> now, it has no sense  to provide a link if we don't use it at all
70 <spaze> Bille: I think Gof is right. first we just ignore what's in libkabc and do it one-way
71 <spaze> Bille: once that works we can do it bidi
72 <Bille> ok
73 <spaze> Bille: we have the luxury to be the first so no need to be compatible :)
74 <spaze> Bille: as for bidi, that's still kde 3.2, at least partly
75 <spaze> Bille: I think we should should a list of all these contacts and ask what to do
76 <spaze> Bille: like
77 <Gof> spaze: for kde 3.2, if we provide a link, we need to sync at least some stuff
78 <spaze> (x) Add all contacts
79 <Bille> spaze: but then, how do you remember what was chosen the next time the props dialog comes up
80 <spaze> ( ) Add only these contacts
81 <Gof> if not, the link is useless, and it's better no link at all
82 <Bille> spaze: agreed
83 <spaze> not even conditional, just always, if you say you want to use kabc
84 <spaze> that's our first test case
85 <spaze> once that works we can do the addressbook fields
86 <Bille> gregj: what is your take on syncing display name to addressee name?
87 <spaze> first store-and-retrieve, assuming nobody messes with it
88 <gregj> hmm
89 <spaze> third will be to detect changes made to address book fields outside kopete
90 <gregj> yes
92 ***
94 <Gof> spaze: ( )  add all contact    is not good imo  (i don't want to add irc channels)  and also, it would make a lot of duplicate entities
95 <gregj> i want kabc to provide me storage, and give back just what i stored
96 <gregj> nothing more
97 <Bille> gregj: what if it changes the Kopete displayname (that is not sent to the server)?
98 <gregj> if i didn't provide email, i don't want email back
99 <gregj> and so on
100 <spaze> Gof: eh, we're talking different things now
101 <Gof> maybe
102 <gregj> Bille: hmm, this is hard to say now
103 <gregj> Bille: i am retriving all information on connect from server
104 <spaze> Gof: I'm talking about the fields to IMPORT from libkabc when we start kopete and kabc was changed by another app, i.e. someone was added there
105 <gregj> Bille: as long as uid matches, this should be ok
106 <Bille> gregj: ok
107 <gregj> if someone changes uid in kabc, then it is his problem
108 <spaze> Gof: but you pointed out a nice flaw in the current addressBookFields API :(
109  samppa Singularity spaze STiAT|off 
110 <spaze> gregj: i'm talking about adding new entries, not modifying
111 <Bille> spaze: pls expand on that
112 <Gof> spaze: what one?
113 <spaze> Bille: the flaw?
114 <gregj> spaze: oh
115 <Bille> yup
116 <gregj> spaze: than it is ok to me
117 <gregj> spaze: i will have to synchronize it with server than
118 <spaze> Bille: we now assume addressbook fields are either all stored in kabc or all stored in xml
120 SEMANTICS OF KABC KEYS
121  ok, one question, it is already dual-key based (app, key)
122 <spaze> so that's perfect
123 <Bille> yeah, what's that Key about?
124 <Bille> i wasn't sure what that's for
125 <spaze> Bille: what kabc is "supposed" to be used like is as follows:
126 <spaze> addCustomField( "kopete", "myCustomKey", "myValue" )
127 <spaze> BUT
128 <spaze> we use kabc for data that is NOT app-specific
129 <Bille> in our semantics, what's the All mean, all messaging apps incl kopete? :)
130 <spaze> so we 'abuse' app as key and are stuck with a key that we don't use
131 <-- cdr has quit (Client Quit)
132 <gregj> spaze: maybe there should be a category in kabc
133 <spaze> Bille: oh... that's another 'abuse' of the sematics
134 <spaze> Bille: that's only for contact id's
135 <gregj> spaze: category for IM related info, emails, and so on
136 <spaze> Bille: "messaging/msn" is the protocol
137 <spaze> Bille: but suppose i have 2 msn accounts under a single KABC entry
138 <gregj> so we can use category IM
139 <Bille> spaze: oic
140 <gregj> which is shared with other im apps
141 <spaze> how are you going to tell that you want msn@martijn.homeip.net to be contacted by your main account
142 <Bille> gregj: that's what the messaging/ part of the key we already use signifies
143 <spaze> and msntest@.. with your debug account
144 <gregj> Bille: got it :D
145 <spaze> Bille: "All" means that all YOUR accounts can access MY account
147 ************************************************
148 Use cases
150 1) Add new metacontact + contacts using Add Contact Wizard
151         Decide whether to associate or not if using mandatory association.
152     a) Matching addressbook entry already exists
153         - Need to choose kabc entry in ACW?
154         - Check if kabc entry already contains IM information (old install of Kopete or from another client)
155         b) No matching entry exists
156         - Need to add new one
158 2) Someone adds you - protocol notifies and creates (temporary?) MC.
159         (Martijn says this becomes the same as 1) when the MC is made permanent)
161 3)  All new Kopete (first run / no existing configs or contactlist)
162         Add accounts
163         Server Side Contact List (SSCL) fetched, lots of permanent contacts are created.
164 *)  Consider if 2 accounts are added and there are contacts from different accounts such that they represent the same person.  They belong in the same MC.  MC merging should take place prior to kabc association.
166 4)  An existing Kopete config is present and we upgrade to a version of Kopete supporting kabc.
168 5a)  After abandoning Kopete, users start using a different KDE IM client, and would like to use the IM address details stored in the KDE address book.
170 5b)  The user used another KDE IM Client.  But he finally discovers Kopete,which is the best, decides to use it, and he would like to use information already existing in KABC
172 6)  Protocols may deliver contact data that users may want to aggregate into the kabc entry.
174 7)  A contact adds a new IM account, either the user decides to add the new account to the MC manually, or the contact messages the user first, we get a temporary contact Kopete side, add them to the MC.
176 8) The user no longer wishes to have a particular contact (or even metacontact) in Kopete, and deletes the object.
178 9) A contact changes accounts (msn:foo@uncool.org -> foo@cool.org).  This is the same as 7) then 8).
180 Implementation notes
181 --------------------
182 1) New MC.  Need dialogs to ask if association needed. Association dialog allows to select/search kabc contacts.  We need to write the kabc data sooner than closing Kopete!
184 2) Same as 1)
186 3) Not an issue given optional participation
187 *) is orthogonal and can be dealt with separately.
189 4) Deferred association
191 5a) We don't want any Kopete specific data in the kabc.  Entries should be usable by other KDE IM apps.
193 5b) The reverse case, therefore we should agree standard entry format with other apps.
194     We should also make using this info really easy in the Add Contact Wizard (see below).
196 6) Question: how to combine all contacts in an MCs' data before saving this to kabc.
198 7) First do dupe check or 'im-info-in-kabc-not-in-kopete' check in case this information already exists in KABC.  Once added to a MC, if already associated, we can add the new contact information to kabc immediately, otherwise Deferred association accessed via MC properties dialog.
200 8) Don't remove the kabc fields, other IM clients might be using them.  So we just remove them from the Kopete contact list.  Dupe contact on the MC add contact thingy will catch if the contact is added again.  (and the user might still want to have other data like the phone number) * See the kabc section
202 Therefore we need an Association Dialog accessed in wizard and from the MC properties dialog.  Note, this name sucks, don't write any classes using it.
204 Side Issues
205 -----------
207 It's not possible to add >1 contact per protocol using the ACW.  Martijn: >1 contact per MC is for power users, they can add extra contacts using the MC's context menu. Change to an iterative ACW would fix this.
210 Possible ACW order including kabc
211 ---------------------------------
212 1) Welcome :P
213 2) Choose Account
214 3) Fill in protocol details
215 4) Select Group
216 5) Select kabc contact from list | create new | create none
218 6) - if the user selected to create a new entry in the KAB, show the page showed when you add normaly a new KAB entry (if possible where some fields are
219    - if the user selected to search in the existing KABC database, show a nice widget to search one user.
220        (I hope there is nice KParts in KABC)
222 ( 5) could come after the welcome but this might be too different for users to swallow... Will)
223         agreed - Olivier
224         yup - Matt
225 If we delay the KABC assoc question until after contacts are added, we cannot use any IM information
226 that is already present in KABC.  And if different contacts are in the KABC, this might surprise the user when
227 the KMC appears in the contactlist with extra contacts.·
229 So it would be better if we performed this check before adding any contacts, in the ACW
231 Olivier: I think a step (the first?) should be to ask a displayname for the metacontact.
233 wow wow wow...  this make a big ACW, but a quick add feature would still be desired by people like this:
234 Bug 53062: Adding contacts more quickly
237 --Will's try--
238 1) Welcome :P
239 2) Do you want to use the KDE Addressbook for this contact, or restrict it to Kopete?
240    ( Could have a 'remember my choice and don't ask again option' ).
241 ( or else goto A )
242 3) Choose addressee or add new addressee.
243    (Check that the addressee is not already associated with an MC)
244    (Mark the contact as 'In KABC' or can we just use valid vs invalid KABC UIDs to show relation?
245    (Chances are next time the user adds a KABC addressee it will coincide with an existing Kopete UID).
246 3.5) Select groups and ask for a displayname
247 4) (Check to see if IM fields are already present in KABC)
248 5a)"The addressbook already contained the following IM information..
249 (goto C)
251 A) How would you like to IM XXX?
252 B) Fill in contact details
253    (Add duplicate check after validity check)
254 C) Use another protocol?
256 D) Finish screen
258 NB) Better to move to a iterative selection of protocols (Select protocol -> fill in details -> Select protocol or done ...).
259 This way power users can add +1 contact per protocol without complicating the ACW for simple users.
263 --Olivier's 2nd try--
264 1) Welcome :P    do you want  to add this contact to KAB?   ( we need to choose a good default, or using the last selected one )
265         (.) Yes / search in KAB fo an existing entry     => goto A
266         (.) Yes / and create a new KAB entry             => goto B
267         (.) No / Do not add this contact to KAB          => goto 3
268 ( This would require the user to remember if an appropriate KAB entry exists.
269   It would be better to allow the user to select/search KAB entries OR create a new one
270   from the same screen, if they can't find an entry - Will)
271 A) use a KPart from KAB to search an user an select one. if one exist => goto 3    the user still can shoose to create one  => goto B
272 B) use a KPart from KAB to show the widget showed when adding new KAB entried => goto 3
274 3) select groups, and ask the displayName (let empty to use the serverside one)  (show the KAB displayname by default)
275 4) select account to use  (select by default account where a KAB entry exist)
276 5) fill the account data (if a KAB entry exist, show as default)
277 6) (.) another account (and select it)    => goto 5
278    (.) finish
279 7) Finish screen  (is that possible to merge this screen with the previous one?
281 This try to do all in as few step as possible.
282 I can't count very well, but AFAICS your suggestion is equal or greater:
284 Step Count              No IM in kabc   1 IM in kabc (new entry) + n new
285 Will                            7                               6 +  3 * n = 9
286 Gof                             6                               5 +  2 * n = 7
290  KAB Widget in Kopete
291 =========================
293  in the metacontact popup menu:
294 A)  "Add to KAB"         if the metacontact don't use KAB yet
295 B)  "View information"   if the metacontact is already in KAB
298 A)  show the step  2 and A/B  of my addcontactwizard  (Olivier)
300 B) KParts showing the KAddressBook entries information, and allow to edit it of
301 course
304 so kopete becomes in fact a addressbook itself
308 Adding fields to kabc
309 ~~~~~~~~~~~~~~~~~~~~~
310 Either - all new addressee, no IM + new IM to add | existing address, no IM + new IM to add
311 | existing addressee, no IM + new IM to add | existing addressee, existing IM + new IM to add | existing addressee, existing IM + nothing to add
313 I think we're going to need a more complex data structure to tell KCL::addMetaContact what it has to do.
315    I don't understand this <p>  -Olivier
317 Fields to put in kabc
318 ~~~~~~~~~~~~~~~~~~~~~
319 Relation between kabc entries and kopete metacontacts could be 1:1 or 1:many.  1:1 is neatest.
321 In Kopete contact list:
322 include UID from related kabc entry
324 In kabc
325 Something like X-MESSAGING-MSN:bob@hotmail.com for each protocol account that contact uses.
327 We should keep the extra stuff in kabc to a minimum.  We can store nicknames in contactlist.xml.
329 We should allow plugins to save some data:
330 Some protocol allow to reach phone numbers, or more (see the ICQ info page)
331 It would be useful if KABC could remember what application writes an entry. so when ICQ try to modify an e-mail, only the "icq-email" is affected
333 Or like the language or the PGP public key
335 It is too complex to store the phone number according to icq as well as the kabc phone number and every other protocol's idea of phone.  The fields would be of no use to any app other than the inserting program or else we would have to update the world.  We *should* have a facility to insert information obtained from protocols into the common kabc fields but this is a hard problem to solve neatly.
336  - - I think it is not, ICQ phone number ~should~ be the same as all others one.  storing it here is just a way to *centralise* all information about someone.  Then, when you want to know his phone number, you look only there, and not at every place
337                 *problem: how to trust the information? that's why kabc could handle a source of the information
340 KABC Participation modes
341 ------------------------
343 Participation in the relation can be optional or mandatory.
345 Optional
346 ~~~~~~~~
347 Scenario 1:
348 1) New Kopete install or account
349 2) Ask 'New contacts added, associate with KDE Address book?'
350 3) Yes: Pop up association dialog
351    No:  Do nothing
353 Scenario 2:
354 1) New Kopete install or account
355 2) Do nothing
356 3) Deferreed association - user performs associate when they want to
358 -- For/In Favour
359 .) easier to code
360 .) easier migration
361 .) doesn't disturb people who don't want it
362 .) unobtrusive
364 -- Against
365 .) less consistent
366         (can someone explain me this? -Olivier)
367         Yes, I need more explanation on what consistent means. - Matt
368 .) may confuse user?
369         how?
371 Mandatory
372 ~~~~~~~~~
373 Scenario 1
374 1) When fetching SSCL, automatically create synthetic kabc entries.
375 Scenario 2
376 1) Fetch SSCL, ask user to create kabc entry normally.
377 Hybrid 1-2
378 1) Fetch SSCL
379 2) Match SS contacts with kabc entries and associate automatically.  Unmatched contacts are associated with synthetic kabc entries.
381 -- For
382 .) Can integrate with kabc contacts without disturbing user
384 -- Against
385 .) User has control of address book, this removes that control.
386 .) Synthetic entries may be duplicates of existing user added entries and user will have to reassociate MCs with correct entries and throw out the synthetic entries.
387 .) Hybrid approach may be too complex for user to comprehend.
388 .) this will be slow to add hundred of contacts when syncing the contactlist for the first time
390 Conclusion
391 ~~~~~~~~~~
392 I think the Optional is the best solution. all i describe in the other part of this file are using this solution (Olivier)
396 KDE PIM Apps' use of Kopete
397 --------------------------
399 Use cases
401 1) Email client or contact management app displays email sender's IM status if known.
403 2) Email client or contact management app wants to use Kopete as transport for something (vCard?).
405 Notes
407 Client would need to identify addressbook entries that are IM contactable, and obtain status information from an IM app or library.
409 David Faure says it's possible to do loose lazy binding to the app responsible for providing status information as in 1).  Something to do with KTrader and DCOP.  We would need some DCOP to return status info to the client from the IM app.
411 Showing the IM status of a contact in KMail, in KAddressBook....
412 A "reply-by-IM" action in KMail
414 such as things could be done. but how?
416 The application could know if this user is registered to an IM by looking at messaging fields
417 But how to use such as information available only at runtime, like the Status.
419 1) Saving the status to KABC
420    --the problem is that the status can not be reseted to offline if kopete crashed
422 2) KMail could contact Kopete via DCop
423    --too bad if i want to use another IM Client?
425 3) add an interface in kabc (or other) which could contact Kopete, or the IM which is actualy running.  This is in effect what dfaure suggested above.
427 KDE Games/Desktop sharing use of Kopete
428 ---------------------------------------
429 Use cases
431 1) Program wants to use Kopete as transport for game/desktop sharing invitation.
433 Notes
435 As above, client must identify IM contactable addressbook entries, obtain status information and get the IM app to send the invite (inline/file transfer).  Some protocols may not support file transfer though.  Do we need a capabilities interface on the IM apps, or just use the lowest common denominator?
437 On receipt of the invitation, IM app needs to recognize the invite and relay it to the recipient (similar lazy loose binding?).  In Kopete we could do this in a plugin, quite neatly.
439 Some problem:
440   Each protocol does that in a different way.  The Game/Application  need to know some protocol specific stuff (the MSN application ID for example)
442   I was thinking about Atlantik, and other games that are protocol independent.  "Protocol games" are protocols' problems.
446  'myself' integration
447 =======================
449 Some protocols allow to send some personal information like real name, phone number, address, ...   (see icq user info)
450 It would be cool if theses information about the users itself could be obtained from KAB.
452 see also Bug 63297: "meta-contact" global(local) display nickname for all accounts
454 Notes: some user might don't want to export their info the the server.
456 Yes this would be cool.  I think we need a general UI to control the flow of contact information between kabc and kopete.  The myself issue is the same as the metacontacts issue.
459 What about the API?
460 =====================
462  In KABC
463 ---------
464 The actual add to kabc could be performed in KopeteContactList::addMetaContact()
466 ACW::accept() -> KopeteContactList::adddMetaContact()
468 Here is a suggestion. I don't know if that already works like that in KABC.
469 AFAIK by reading the KABC API documentation, it use somme different c++ function to access/modify some stuff.
470 With this implementation, it is not possible to make that transparent for plugin.  That mean the PGP plugin need to call directly the KABC API (with Addressee::pgpKey()) for example.
472 My idea is to give for each fields a String, like for MIME-Type
473 so fields could be application/pgp-public-key    (do you see what i mean?)
474 We can even add the possibility to have several entries for one field (StringList)  (several emails for example)
476 Theses key could be stendardized (freedesktop.org ?)
478  In Kopete:
479 ------------
481 I think we will need to change the xml format of the contactlist, and the whole pluginData thing.
483 The idea is to have the same fields in Kopete than in KABC.
484 Gof: This was not our idea, we intend not to pollute the KABC with any more extra fields than necessary.  Kopete's info may not be useful to other IM apps (Will)
486 so for example, the pgp plugin will request the public key:
487 metacontact->data("application/pgp-public-key");
489 if the contact is in KABC, then libkopete will request info from kabc. Else, it will take the data stored internaly in the contactlist.xml (Gof)
491 This is a good question.  I think since we have the constraint that we have to keep kabc clean, this is the way to do it. (Will)
493 for contacts same things.
494 Anyway? what if we have several contact in one metacontact.
495 for example:
497 messenging/msn         =>   xxx@msn.com ; yyy@msn.com   (it's a StringList)
498 messenging/nickname    =>    Mr. X ; Mr. Y
500 that looks fine, but how to make sure than Mr. X is for xxx@msn.com, imagine if we have icq contact, or other? (Gof)
501 We should never store nicknames in kabc.  The metacontact name should be taken from the kabc formatted name (Will)
503 Of course every fields shouldn't be stored in KABC (for example: MSN's groups, or others)
504 to know what can be saved or not in kabc, i see two ways:
505 1) KopeteMetaContact::setData( QString key , QString data , bool saveToKAB);
506 2) if the key is or not recognized by KABC. example, if i save  "messaging/msn-groups"  KAB is not able to store it, so don't store it in KABC
509 Syncing contactlist info currently takes place when Kopete exits.  other kabc apps write kabc during their runs.  We will have to make changes to do this and to make sure that we don't try to write 200 kabc entries simultaneously with individual tickets after fetching the SSCL for a new account.
511 I don't think that syncing the KAB on an SSCL fetch is necessary. The only information we get when we fetch the SSCL is the contact name of that person who is on our SSCL, it's not until later, perhaps when we request the user info that we update the KAB. (Matt)
516 |How to share data when multiple contact in a metacontact?|
517 +---------------------------------------------------------+
519 The problem is that there are several sources of the information. example: if i have two msn contact ion the metacontact, i have maybe two pictures.
521 Currently, two solution has been mentioned:
522 1) use a per-contact value + a metacontact one. If there is only one contact, we automaticaly track the child contact one (exepted if the user selected himself the metacontact value). If not, we let the user choose what to use.
523      (like we already does for displayname)
525 2) Use the account / contact priority to determine the value.
529 KABC Association
530 ----------------
531 Association creates a 1:1 relationship between KMC and Addressee.  If we assume IM apps incl Kopete put IM addresses in the KABC (Messaging/msn etc) then whenever an association is made or changed, there will have to be a sync between Kopete's idea of IM addresses and those stored in KABC.  Changes to KABC data could happen while Kopete is offline so this sync check needs to take place when Kopete starts.  Potential problems if another IM client changes the data whilst Kopete is running or vice versa - addressees aren't locked while an apps is running, only while writing.
533 Association with existing contact: 1) No messaging information 2) Some messaging entries already exist.  Possible courses of action - add (only in KABC) accounts to MC - ask (how do we remember what the user wanted the next time we read the KABC)
535 What if a related kabc entry is deleted while Kopete is running?
537 Deserialising contact from contactlist.xml - do we try to check the kabc entries and create any accounts that we find there but not in the contactlist.xml?
539 When to update KABC
540 -------------------
541 Kopete writes its contactlist.xml at app close.  This is sufficient for kopete as the data is held in memory and not shared.  Data Kopete puts in KABC is shared, however, and users will expect to be able to use that data immediately.  Hence, data that will be put in KABC should be put there immediately.
542 This should happen when the KABC-exposed data changes - when an MC's set of contacts changes
543 NOT when starting kopete and the MC is filled with contacts!
544 *) When adding a new contact (Use case: A new contact messages me, I add them to my contact list, and then I want to play a game with them, and invite them using IM, for example)
545    KopeteContactList::addMetaContact()
546 *) When linking an existing contact to KABC (so other apps gain the benefit of the new link)
547    handle this in KMC::setMetaContactId() - remember issues if a link is changed, do we delete the kabc fields?
548 *) When adding new contacts to a KMC.
549         KMC::addContact()
550 *) When moving contacts between KMCs. KC::setMetaContact()?
551 *) When a MC's KABC association is changed. - KsetMetaContact