[Telepathy] Spec meeting: Observer.Recover, ContactInfo undrafting, ContactList and friends
Will Thompson
will.thompson at collabora.co.uk
Thu Apr 15 10:52:38 PDT 2010
Dramatis personæ:
• Simon “smcv” McVittie;
• Sjoerd “sjoerd” Simons;
• Will “wjt” Thompson;
• and introducing Marco Barisione as the Voice of Contacts Experience!
== Recover ==
https://bugs.freedesktop.org/show_bug.cgi?id=24768
Cabal says ++
== ContactInfo ==
https://bugs.freedesktop.org/show_bug.cgi?id=13350
Will wonders whether the CM should cache vCards on disk, and be
responsible for refreshing them every week/month, so that we wouldn't
need RefreshContacts(). Sjoerd and Simon disagree: the address book
knows better than the CM whether the user actually does want the
contacts refreshed and how often, and if there even *is* an address book
interested in ContactInfo. Also, the API doesn't preclude the CM caching
and returning cached information in GetContactInfo().
SetContactInfo() failing rather than subsetting if you pass in
unsupported information. Pro: Keeps the UI honest Con: Makes setting the
same info on multiple accounts harder.
But we convinced ourselves that you don't generally want to do that
(lots of people have home and work accounts and don't want to share
their MeCard between them) so UIs have to deal anyway.
Resolved: specify it to be fascist for now. We can relax it later if we
need to. (Unlike GetContactAttributes(), which we relaxed recently, the
price of being tolerant is that information is silently dropped.)
SupportedFields: XEP-0054 doesn't actually support all vCard fields. AP
Simon: change the SupportedFields: [] example to refer to a hypothetical
protocol which supports all of vCard.
Example is wrong: all the parameters should be 'type=foo' not 'foo'.
This interface gets the Marco F. Barisione seal of approval.
== ContactList, ContactGroups, Nicknames ==
https://bugs.freedesktop.org/show_bug.cgi?id=21787
=== ContactList ===
Can you get groups via GetContactListAttributes()? Yes; they're on a
different interface but they're contact attrs. so you can.
How does this correspond to the current impl. of 'stored' in Gabble?
It's the same.
Alias vs. Nickname vs. short form: we used to say that the JID
"foo at bar.com" has alias "foo" in the absense of any other information.
The idea was to give the UI something nicer to show. Unfortunately it's
not okay if the UI wants to distinguish between an actual alias the
contact has set, and just a nicer thing to show. So we could have three
concepts:
• alias: something I have set for a contact;
• nickname: something the contact set for themself;
• pretty-id: a prettified version of the contact ID.
This would also help SIP, where it's harder than just stripping stuff
after the @.
Side point: presets might want to be able to say "on this protocol, IDs
end in @domain, and likely domains are..." for a better Jabber UI (where
both boxes are editable, but the RHS one has a dropdown for standard
ones, like the Empathy status picker):
+--[ Add contact ]---------------------------+
| JID: [ ] @ [ gmail.com | ↓ ] |
| | googlemail.com | |
+----------------------| jabber.org |-+
| collabora.co.uk |
+-------------------+
But this is orthogonal.
How do we represent AIM's thing where you can customize your screen
name's whitespace and capitalization? On Nicknames (check that AIM
doesn't have a separate concept of your own alias these days...). Need a
property to say we're on AIM and it behaves like this.
RequestSubscription()'s message: should the CM fall back to sending an
IM if the protocol doesn't support sending messages with subscription
requests? Sjoerd says that ICQ gateways on Jabber did this in the olden
days and it was really annoying. Simon and Marco point out that it's
pretty easy for the UI to do this fallback.
Should there be a property you can set On (but not Off again, because
that breaks with multiple UIs) to make the CM automatically say yes to
reciprocal subcription requests? This is fraught with uncertainty: what
happens if the CM signals such requests anyway? Does the UI have to set
it every time? So, probably not a great idea.
Should we have an AuthorizeAndSubscribe(au: Contacts) to make it easier
to do reciprocal subscriptions? Hmm. Probably no real benefit.
How do we deal with the roster not having arrived when the UI calls
GetContactListAttributes() or Get('Contacts')? Proposed solution: make
the former wait until the roster's been downloaded, and just delete the
Contacts property.
When do we start emitting ContactsChanged? After
GetContactListAttributes() has returned or the roster has been
retrieved, whichever is the later. (On Salut, you don't know when you
have got the whole roster.)
Should ContactChanged, ContactRemoved be plural? On Salut you can get a
flood of contacts after the original download (because you join two
switches together).
Should have three separate removal methods:
• Unsubscribe()
• Unpublish()
• Remove()
Most UIs will just use the last one. Remove() also removes the alias.
=== Aside: Blocking ===
This interface is correct to not show blocked contacts (unless you're
actually subscribed to them); they should be a different interface. This
means that UIs that don't care about blocking don't accidentally unblock
people if you remove them from your contact list.
However: blocked contacts do have aliases. So rename Nicknames to Names,
with two attrs: nickname and local-alias. Then we can easily add
pretty-id later (or even now).
If you subscribe to someone who's blocked, what do we do? We could
either unblock them, or fail to add them. Everyone votes for unblocking.
=== ContactGroups ===
GroupsChanged is just for one contact; GroupCreated don't say who's in
it. So if you get a new group with 50 contacts in it... what happens?
GroupsChanged should be au as as.
DefaultGroup: does AIM actually have a default group? Can you change it?
This interface also needs a lag until you have your roster. But we can
just declare that this interface depends on ContactList and say that
this interface doesn't work until you GetContactListAttributes()? Sjoerd
makes worried noises.
Add a method to make this interface start working? Make GroupCreated
plural? The latter.
How do you create an empty group? AddToGroup("foo", []). An earlier
draft had EnsureGroup("foo"); it seems redundant.
--
Will
More information about the telepathy
mailing list