X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Fchannel%2Fcontact_list.py;h=e184d2d6ddb97092530d8697205138a86ae9c8dc;hp=6607979dcc06d4782d47754e3122cc9020dd6f57;hb=1c892d1b9bf14b28eb54ce3590ed2ee29d5e3d25;hpb=f37a27445591c939b3f89713e6d9d82a11009180 diff --git a/src/channel/contact_list.py b/src/channel/contact_list.py index 6607979..e184d2d 100644 --- a/src/channel/contact_list.py +++ b/src/channel/contact_list.py @@ -4,7 +4,7 @@ import telepathy import tp import util.coroutines as coroutines -import gtk_toolbox +import util.misc as misc_utils import handle @@ -17,8 +17,6 @@ class AllContactsListChannel( ): """ The group of contacts for whom you receive presence - - @bug On Maemo 5 this isn't even being created, I think """ def __init__(self, connection, manager, props, listHandle): @@ -29,54 +27,102 @@ class AllContactsListChannel( self.__props = props self.__session = connection.session self.__listHandle = listHandle + self.__members = set() - self._callback = coroutines.func_sink( - coroutines.expand_positional( - self._on_contacts_refreshed + if self._conn.options.useGVContacts: + self._callback = coroutines.func_sink( + coroutines.expand_positional( + self._on_contacts_refreshed + ) + ) + self.__session.addressbook.updateSignalHandler.register_sink( + self._callback ) - ) - self.__session.addressbook.updateSignalHandler.register_sink( - self._callback - ) - self.GroupFlagsChanged(0, 0) + addressbook = connection.session.addressbook + contacts = addressbook.get_numbers() + self._process_refresh(addressbook, set(contacts), set(), set()) + else: + self._callback = None - addressbook = connection.session.addressbook - contacts = addressbook.get_numbers() - self._process_refresh(addressbook, set(contacts), set()) + self.GroupFlagsChanged(0, 0) - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def Close(self): self.close() def close(self): _moduleLogger.debug("Closing contact list") - self.__session.addressbook.updateSignalHandler.unregister_sink( - self._callback - ) - self._callback = None + if self._callback is not None: + self.__session.addressbook.updateSignalHandler.unregister_sink( + self._callback + ) + self._callback = None tp.ChannelTypeContactList.Close(self) self.remove_from_connection() - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) + def GetLocalPendingMembersWithInfo(self): + return [] + + @misc_utils.log_exception(_moduleLogger) def _on_contacts_refreshed(self, addressbook, added, removed, changed): - self._process_refresh(addressbook, added, removed) + self._process_refresh(addressbook, added, removed, changed) + + def _is_on_list(self, number): + return True + + def _is_on_list_changed(self, number): + return (number in self.__members) ^ (self._is_on_list(number)) + + def _is_now_on_list(self, number): + return number not in self.__members and self._is_on_list(number) - def _process_refresh(self, addressbook, added, removed): + def _was_on_list(self, number): + return number in self.__members and not self._is_on_list(number) + + def _process_refresh(self, addressbook, added, removed, changed): _moduleLogger.info( "%s Added: %r, Removed: %r" % (self.__listHandle.get_name(), len(added), len(removed)) ) connection = self._conn + + # convert changed into added/removed + alsoAdded = set( + number + for number in changed + if self._is_now_on_list(number) + ) + alsoRemoved = set( + number + for number in changed + if self._was_on_list(number) + ) + + # Merge the added/removed with changed + added = [ + contactNumber + for contactNumber in added + if self._is_on_list(contactNumber) + ] + added.extend(alsoAdded) + added.sort() handlesAdded = [ handle.create_handle(connection, "contact", contactNumber) for contactNumber in added ] + self.__members.union(added) + + removed = list(removed) + removed.extend(alsoRemoved) handlesRemoved = [ handle.create_handle(connection, "contact", contactNumber) for contactNumber in removed ] + self.__members.difference(removed) + message = "" actor = 0 reason = telepathy.CHANNEL_GROUP_CHANGE_REASON_NONE @@ -89,6 +135,12 @@ class AllContactsListChannel( ) +class DenyContactsListChannel(AllContactsListChannel): + + def _is_on_list(self, number): + return self._conn.session.addressbook.is_blocked(number) + + _LIST_TO_FACTORY = { # The group of contacts for whom you receive presence 'subscribe': AllContactsListChannel, @@ -99,11 +151,10 @@ _LIST_TO_FACTORY = { # This doesn't make sense to support 'hide': None, # A group of contacts who may send you messages - # @todo Allow-List would be cool to support + # Is this meant to serve as a definitive white list for all contact? 'allow': None, # A group of contacts who may not send you messages - # @todo Deny-List would be cool to support - 'deny': None, + 'deny': DenyContactsListChannel, # On protocols where the user's contacts are stored, this contact list # contains all stored contacts regardless of subscription status. 'stored': AllContactsListChannel,