6 import util.coroutines as coroutines
11 _moduleLogger = logging.getLogger("channel.contact_list")
14 class AllContactsListChannel(
15 tp.ChannelTypeContactList,
16 tp.ChannelInterfaceGroup,
19 The group of contacts for whom you receive presence
21 @bug On Maemo 5 this isn't even being created, I think
24 def __init__(self, connection, manager, props, listHandle):
25 tp.ChannelTypeContactList.__init__(self, connection, manager, props)
26 tp.ChannelInterfaceGroup.__init__(self)
28 self.__manager = manager
30 self.__session = connection.session
31 self.__listHandle = listHandle
33 self._callback = coroutines.func_sink(
34 coroutines.expand_positional(
35 self._on_contacts_refreshed
38 self.__session.addressbook.updateSignalHandler.register_sink(
42 self.GroupFlagsChanged(0, 0)
44 addressbook = connection.session.addressbook
45 contacts = addressbook.get_contact_ids()
46 self._process_refresh(addressbook, set(contacts), set())
49 @gtk_toolbox.log_exception(_moduleLogger)
54 self.__session.addressbook.updateSignalHandler.unregister_sink(
59 tp.ChannelTypeContactList.Close(self)
60 self.remove_from_connection()
62 @gtk_toolbox.log_exception(_moduleLogger)
63 def _on_contacts_refreshed(self, addressbook, added, removed, changed):
64 self._process_refresh(addressbook, added, removed)
66 def _process_refresh(self, addressbook, added, removed):
68 "%s Added: %r, Removed: %r" % (self.__listHandle.get_name(), len(added), len(removed))
70 connection = self._conn
72 handle.create_handle(connection, "contact", contactId, phoneNumber)
73 for contactId in added
74 for (phoneType, phoneNumber) in addressbook.get_contact_details(contactId)
77 handle.create_handle(connection, "contact", contactId, phoneNumber)
78 for contactId in removed
79 for (phoneType, phoneNumber) in addressbook.get_contact_details(contactId)
83 reason = telepathy.CHANNEL_GROUP_CHANGE_REASON_NONE
86 handlesAdded, handlesRemoved,
94 # The group of contacts for whom you receive presence
95 'subscribe': AllContactsListChannel,
96 # The group of contacts who may receive your presence
97 'publish': AllContactsListChannel,
98 # A group of contacts who are on the publish list but are temporarily
99 # disallowed from receiving your presence
100 # This doesn't make sense to support
102 # A group of contacts who may send you messages
103 # @todo Allow-List would be cool to support
105 # A group of contacts who may not send you messages
106 # @todo Deny-List would be cool to support
108 # On protocols where the user's contacts are stored, this contact list
109 # contains all stored contacts regardless of subscription status.
110 'stored': AllContactsListChannel,
114 _SUPPORTED_LISTS = frozenset(
116 for name in _LIST_TO_FACTORY.iterkeys()
121 def create_contact_list_channel(connection, manager, props, h):
122 factory = _LIST_TO_FACTORY.get(h.get_name(), None)
124 raise telepathy.errors.NotCapable("Unsuported type %s" % h.get_name())
125 return factory(connection, manager, props, h)
128 def get_spported_lists():
129 return _SUPPORTED_LISTS