Changeset 10329

Show
Ignore:
Timestamp:
08/28/08 10:23:31 (3 months ago)
Author:
asterix
Message:

don't pass iters to menuitems callback, that are quickly invalid. Fixes #4034

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/roster_window.py

    r10292 r10329  
    25092509                        on_response_ok = (remove, list_)) 
    25102510 
    2511         def on_block(self, widget, titer, group_list): 
    2512                 ''' When clicked on the 'block' button in context menu. ''' 
     2511        def on_block(self, widget, list_, group=None): 
     2512                ''' When clicked on the 'block' button in context menu. 
     2513                list_ is a list of (contact, account)''' 
    25132514                def on_continue(msg): 
    25142515                        if msg is None: 
     
    25172518                        model = self.modelfilter 
    25182519                        accounts = [] 
    2519                         if group_list is None: 
    2520                                 jid = model[titer][C_JID].decode('utf-8') 
    2521                                 account = model[titer][C_ACCOUNT].decode('utf-8') 
    2522                                 accounts.append(account) 
    2523                                 self.send_status(account, 'offline', msg, to = jid) 
    2524                                 new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', 
    2525                                         'value' : jid, 'child': [u'message', u'iq', u'presence-out']} 
    2526                                 gajim.connections[account].blocked_list.append(new_rule) 
    2527                                 # needed for draw_contact: 
    2528                                 gajim.connections[account].blocked_contacts.append(jid) 
    2529                                 self.draw_contact(jid, account) 
    2530                         else: 
    2531                                 if titer is None: 
    2532                                         for (contact, account) in group_list: 
    2533                                                 if account not in accounts: 
    2534                                                         if not gajim.connections[account].privacy_rules_supported: 
    2535                                                                 continue 
    2536                                                         accounts.append(account) 
    2537                                                 self.send_status(account, 'offline', msg, to=contact.jid) 
    2538                                                 new_rule = {'order': u'1', 'type': u'jid', 
    2539                                                                 'action': u'deny', 'value' : contact.jid, 
    2540                                                                 'child': [u'message', u'iq', u'presence-out']} 
    2541                                                 gajim.connections[account].blocked_list.append(new_rule) 
    2542                                                 # needed for draw_contact: 
    2543                                                 gajim.connections[account].blocked_contacts.append( 
    2544                                                         contact.jid) 
    2545                                                 self.draw_contact(contact.jid, account) 
    2546                                 else: 
    2547                                         group = model[titer][C_JID].decode('utf-8') 
    2548                                         for (contact, account) in group_list: 
    2549                                                 if account not in accounts: 
    2550                                                         if not gajim.connections[account].privacy_rules_supported: 
    2551                                                                 continue 
    2552                                                         accounts.append(account) 
    2553                                                         # needed for draw_group: 
    2554                                                         gajim.connections[account].blocked_groups.append(group) 
    2555                                                         self.draw_group(group, account) 
    2556                                                 self.send_status(account, 'offline', msg, to=contact.jid) 
    2557                                                 self.draw_contact(contact.jid, account) 
    2558                                         new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', 
    2559                                                 'value' : group, 'child': [u'message', u'iq', 
     2520                        if group is None: 
     2521                                for (contact, account) in list_: 
     2522                                        if account not in accounts: 
     2523                                                if not gajim.connections[account].privacy_rules_supported: 
     2524                                                        continue 
     2525                                                accounts.append(account) 
     2526                                        self.send_status(account, 'offline', msg, to=contact.jid) 
     2527                                        new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', 
     2528                                                'value' : contact.jid, 'child': [u'message', u'iq', 
    25602529                                                u'presence-out']} 
    25612530                                        gajim.connections[account].blocked_list.append(new_rule) 
     2531                                        # needed for draw_contact: 
     2532                                        gajim.connections[account].blocked_contacts.append( 
     2533                                                contact.jid) 
     2534                                        self.draw_contact(contact.jid, account) 
     2535                        else: 
     2536                                for (contact, account) in list_: 
     2537                                        if account not in accounts: 
     2538                                                if not gajim.connections[account].privacy_rules_supported: 
     2539                                                        continue 
     2540                                                accounts.append(account) 
     2541                                                # needed for draw_group: 
     2542                                                gajim.connections[account].blocked_groups.append(group) 
     2543                                                self.draw_group(group, account) 
     2544                                        self.send_status(account, 'offline', msg, to=contact.jid) 
     2545                                        self.draw_contact(contact.jid, account) 
     2546                                new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', 
     2547                                        'value' : group, 'child': [u'message', u'iq', u'presence-out']} 
     2548                                gajim.connections[account].blocked_list.append(new_rule) 
    25622549                        for account in accounts: 
    25632550                                gajim.connections[account].set_privacy_list( 
     
    25702557                self.get_status_message('offline', on_continue) 
    25712558 
    2572         def on_unblock(self, widget, titer, group_list): 
     2559        def on_unblock(self, widget, list_, group=None): 
    25732560                ''' When clicked on the 'unblock' button in context menu. ''' 
    25742561                model = self.modelfilter 
    25752562                accounts = [] 
    2576                 if group_list is None: 
    2577                         jid = model[titer][C_JID].decode('utf-8') 
    2578                         jid_account = model[titer][C_ACCOUNT].decode('utf-8') 
    2579                         accounts.append(jid_account) 
    2580                         gajim.connections[jid_account].new_blocked_list = [] 
    2581                         for rule in gajim.connections[jid_account].blocked_list: 
    2582                                 if rule['action'] != 'deny' or rule['type'] != 'jid' \ 
    2583                                 or rule['value'] != jid: 
    2584                                         gajim.connections[jid_account].new_blocked_list.append(rule) 
    2585                         # needed for draw_contact: 
    2586                         if jid in gajim.connections[jid_account].blocked_contacts: 
    2587                                 gajim.connections[jid_account].blocked_contacts.remove(jid) 
    2588                         self.draw_contact(jid, jid_account) 
    2589                 else: 
    2590                         if titer is None: 
    2591                                 for (contact, account) in group_list: 
    2592                                         if account not in accounts: 
    2593                                                 if gajim.connections[account].privacy_rules_supported: 
    2594                                                         accounts.append(account) 
    2595                                                         gajim.connections[account].new_blocked_list = [] 
    2596                                                         gajim.connections[account].to_unblock = [] 
    2597                                                         gajim.connections[account].to_unblock.append(contact.jid) 
    2598                                         else: 
     2563                if group is None: 
     2564                        for (contact, account) in list_: 
     2565                                if account not in accounts: 
     2566                                        if gajim.connections[account].privacy_rules_supported: 
     2567                                                accounts.append(account) 
     2568                                                gajim.connections[account].new_blocked_list = [] 
     2569                                                gajim.connections[account].to_unblock = [] 
    25992570                                                gajim.connections[account].to_unblock.append(contact.jid) 
    2600                                         # needed for draw_contact: 
    2601                                         if contact.jid in gajim.connections[account].blocked_contacts: 
    2602                                                 gajim.connections[account].blocked_contacts.remove( 
    2603                                                         contact.jid) 
    2604                                         self.draw_contact(contact.jid, account) 
    2605                                 for account in accounts: 
    2606                                         for rule in gajim.connections[account].blocked_list: 
    2607                                                 if rule['action'] != 'deny' or rule['type'] != 'jid' \ 
    2608                                                 or rule['value'] not in gajim.connections[account].to_unblock: 
    2609                                                         gajim.connections[account].new_blocked_list.append(rule) 
    2610                         else: 
    2611                                 group = model[titer][C_JID].decode('utf-8') 
    2612                                 for (contact, account) in group_list: 
    2613                                         if account not in accounts: 
    2614                                                 if gajim.connections[account].privacy_rules_supported: 
    2615                                                         accounts.append(account) 
    2616                                                         # needed for draw_group: 
    2617                                                         if group in gajim.connections[account].blocked_groups: 
    2618                                                                 gajim.connections[account].blocked_groups.remove(group) 
    2619                                                         self.draw_group(group, account) 
    2620                                                         gajim.connections[account].new_blocked_list = [] 
    2621                                                         for rule in gajim.connections[account].blocked_list: 
    2622                                                                 if rule['action'] != 'deny' or rule['type'] != 'group' \ 
    2623                                                                 or rule['value'] != group: 
    2624                                                                         gajim.connections[account].new_blocked_list.append( 
    2625                                                                                 rule) 
    2626                                         self.draw_contact(contact.jid, account) 
     2571                                else: 
     2572                                        gajim.connections[account].to_unblock.append(contact.jid) 
     2573                                # needed for draw_contact: 
     2574                                if contact.jid in gajim.connections[account].blocked_contacts: 
     2575                                        gajim.connections[account].blocked_contacts.remove(contact.jid) 
     2576                                self.draw_contact(contact.jid, account) 
     2577                        for account in accounts: 
     2578                                for rule in gajim.connections[account].blocked_list: 
     2579                                        if rule['action'] != 'deny' or rule['type'] != 'jid' \ 
     2580                                        or rule['value'] not in gajim.connections[account].to_unblock: 
     2581                                                gajim.connections[account].new_blocked_list.append(rule) 
     2582                else: 
     2583                        for (contact, account) in list_: 
     2584                                if account not in accounts: 
     2585                                        if gajim.connections[account].privacy_rules_supported: 
     2586                                                accounts.append(account) 
     2587                                                # needed for draw_group: 
     2588                                                if group in gajim.connections[account].blocked_groups: 
     2589                                                        gajim.connections[account].blocked_groups.remove(group) 
     2590                                                self.draw_group(group, account) 
     2591                                                gajim.connections[account].new_blocked_list = [] 
     2592                                                for rule in gajim.connections[account].blocked_list: 
     2593                                                        if rule['action'] != 'deny' or rule['type'] != 'group' \ 
     2594                                                        or rule['value'] != group: 
     2595                                                                gajim.connections[account].new_blocked_list.append(rule) 
     2596                                self.draw_contact(contact.jid, account) 
    26272597                for account in accounts: 
    2628                         gajim.connections[account].set_privacy_list( 
    2629                                 'block', gajim.connections[account].new_blocked_list) 
     2598                        gajim.connections[account].set_privacy_list('block', 
     2599                                gajim.connections[account].new_blocked_list) 
    26302600                        gajim.connections[account].get_privacy_list('block') 
    26312601                        if len(gajim.connections[account].new_blocked_list) == 0: 
     
    26392609                                        gajim.interface.instances[account]['blocked_contacts'].\ 
    26402610                                                privacy_list_received([]) 
    2641                 if group_list is None: 
    2642                         status = gajim.connections[jid_account].connected 
    2643                         if gajim.SHOW_LIST[status] == 'invisible': 
    2644                                 # Don't send our presence if we're invisible 
    2645                                 return 
    2646                         msg = gajim.connections[jid_account].status 
     2611                for (contact, account) in list_: 
    26472612                        if not self.regroup: 
    2648                                 show = gajim.SHOW_LIST[status] 
     2613                                show = gajim.SHOW_LIST[gajim.connections[account].connected] 
    26492614                        else:   # accounts merged 
    26502615                                show = helpers.get_global_show() 
    2651                         self.send_status(jid_account, show, msg, to=jid) 
    2652                 else: 
    2653                         for (contact, account) in group_list: 
    2654                                 if not self.regroup: 
    2655                                         show = gajim.SHOW_LIST[gajim.connections[account].connected] 
    2656                                 else:   # accounts merged 
    2657                                         show = helpers.get_global_show() 
    2658                                 if show == 'invisible': 
    2659                                         # Don't send our presence if we're invisible 
    2660                                         continue 
    2661                                 if account not in accounts: 
    2662                                         if gajim.connections[account].privacy_rules_supported: 
    2663                                                 accounts.append(account) 
    2664                                                 self.send_status(account, show, 
    2665                                                         gajim.connections[account].status, to=contact.jid) 
    2666                                 else: 
     2616                        if show == 'invisible': 
     2617                                # Don't send our presence if we're invisible 
     2618                                continue 
     2619                        if account not in accounts: 
     2620                                accounts.append(account) 
     2621                                if gajim.connections[account].privacy_rules_supported: 
    26672622                                        self.send_status(account, show, 
    26682623                                                gajim.connections[account].status, to=contact.jid) 
    2669  
    2670         def on_rename(self, widget, titer, path): 
     2624                        else: 
     2625                                self.send_status(account, show, 
     2626                                        gajim.connections[account].status, to=contact.jid) 
     2627 
     2628        def on_rename(self, widget, row_type, jid, account): 
    26712629                # this function is called either by F2 or by Rename menuitem 
    26722630                if gajim.interface.instances.has_key('rename'): 
     
    26752633                model = self.modelfilter 
    26762634 
    2677                 row_type = model[titer][C_TYPE] 
    2678                 jid = model[titer][C_JID].decode('utf-8') 
    2679                 account = model[titer][C_ACCOUNT].decode('utf-8') 
    26802635                # account is offline, don't allow to rename 
    26812636                if gajim.connections[account].connected < 2: 
     
    26902645                        if jid in helpers.special_groups + (_('General'),): 
    26912646                                return 
    2692                         old_text = model[titer][C_JID].decode('utf-8') 
     2647                        old_text = jid 
    26932648                        title = _('Rename Group') 
    2694                         message = _('Enter a new name for group %s') % old_text 
     2649                        message = _('Enter a new name for group %s') % jid 
    26952650 
    26962651                def on_renamed(new_text, account, row_type, jid, old_text): 
     
    29822937                        type_ = model[path][C_TYPE] 
    29832938                        if type_ in ('contact', 'group', 'agent'): 
    2984                                 titer = model.get_iter(path) 
    2985                                 self.on_rename(widget, titer, path) 
     2939                                jid = model[path][C_JID].decode('utf-8') 
     2940                                account = model[path][C_ACCOUNT].decode('utf-8') 
     2941                                self.on_rename(widget, type_, jid, account) 
    29862942 
    29872943                elif event.keyval == gtk.keysyms.Delete: 
     
    29912947                                return 
    29922948                        type_ = model[list_of_paths[0]][C_TYPE] 
    2993                         account = model[list_of_paths[0]][C_ACCOUNT] 
     2949                        account = model[list_of_paths[0]][C_ACCOUNT].decode('utf-8') 
    29942950                        list_ = [] 
    29952951                        for path in list_of_paths: 
     
    51265082                        rename_item.set_image(img) 
    51275083                        menu.append(rename_item) 
    5128                         rename_item.connect('activate', self.on_rename, titer, path) 
     5084                        rename_item.connect('activate', self.on_rename, 'group', group, 
     5085                                account) 
    51295086 
    51305087                        # Block group 
     
    51425099                                icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) 
    51435100                                unblock_menuitem.set_image(icon) 
    5144                                 unblock_menuitem.connect('activate', self.on_unblock, titer, list_) 
     5101                                unblock_menuitem.connect('activate', self.on_unblock, list_, group) 
    51455102                                menu.append(unblock_menuitem) 
    51465103                        else: 
     
    51485105                                icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) 
    51495106                                block_menuitem.set_image(icon) 
    5150                                 block_menuitem.connect('activate', self.on_block, titer, list_) 
     5107                                block_menuitem.connect('activate', self.on_block, list_, group) 
    51515108                                menu.append(block_menuitem) 
    51525109                                if not gajim.connections[account].privacy_rules_supported: 
     
    52485205                                send_file_menuitem.set_sensitive(False) 
    52495206 
    5250                         rename_menuitem.connect('activate', self.on_rename, titer, tree_path) 
     5207                        rename_menuitem.connect('activate', self.on_rename, 'contact', jid, 
     5208                                account) 
    52515209                        if contact.show in ('offline', 'error'): 
    52525210                                information_menuitem.set_sensitive(False) 
     
    54275385                        self.on_send_single_message_menuitem_activate, account, contact) 
    54285386 
    5429                 rename_menuitem.connect('activate', self.on_rename, titer, tree_path) 
     5387                rename_menuitem.connect('activate', self.on_rename, 'contact', jid, 
     5388                        account) 
    54305389                remove_from_roster_menuitem.connect('activate', self.on_req_usub, 
    54315390                        [(contact, account)]) 
     
    55015460                                        unblock_menuitem.hide() 
    55025461                                        unignore_menuitem.set_no_show_all(False) 
    5503                                         unignore_menuitem.connect('activate', self.on_unblock, titer, 
    5504                                                 None) 
     5462                                        unignore_menuitem.connect('activate', self.on_unblock, [(contact, 
     5463                                                account)]) 
    55055464                                else: 
    5506                                         unblock_menuitem.connect('activate', self.on_unblock, titer, 
    5507                                                 None) 
     5465                                        unblock_menuitem.connect('activate', self.on_unblock, [(contact, 
     5466                                                account)]) 
    55085467                        else: 
    55095468                                unblock_menuitem.set_no_show_all(True) 
     
    55135472                                        block_menuitem.hide() 
    55145473                                        ignore_menuitem.set_no_show_all(False) 
    5515                                         ignore_menuitem.connect('activate', self.on_block, titer, None) 
     5474                                        ignore_menuitem.connect('activate', self.on_block, [(contact, 
     5475                                                account)]) 
    55165476                                else: 
    5517                                         block_menuitem.connect('activate', self.on_block, titer, None) 
     5477                                        block_menuitem.connect('activate', self.on_block, [(contact, 
     5478                                                account)]) 
    55185479                else: 
    55195480                        unblock_menuitem.set_no_show_all(True) 
     
    55985559                        icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) 
    55995560                        unblock_menuitem.set_image(icon) 
    5600                         unblock_menuitem.connect('activate', self.on_unblock, None, list_) 
     5561                        unblock_menuitem.connect('activate', self.on_unblock, list_) 
    56015562                        manage_contacts_submenu.append(unblock_menuitem) 
    56025563                else: 
     
    56045565                        icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) 
    56055566                        block_menuitem.set_image(icon) 
    5606                         block_menuitem.connect('activate', self.on_block, None, list_) 
     5567                        block_menuitem.connect('activate', self.on_block, list_) 
    56075568                        manage_contacts_submenu.append(block_menuitem) 
    56085569 
     
    57185679                item.set_image(img) 
    57195680                manage_transport_submenu.append(item) 
    5720                 item.connect('activate', self.on_rename, titer, path) 
     5681                item.connect('activate', self.on_rename, 'agent', jid, account) 
    57215682                if gajim.account_is_disconnected(account): 
    57225683                        item.set_sensitive(False) 
     
    57285689                if blocked: 
    57295690                        item = gtk.ImageMenuItem(_('_Unblock')) 
    5730                         item.connect('activate', self.on_unblock, titer, None) 
     5691                        item.connect('activate', self.on_unblock, [(contact, account)]) 
    57315692                else: 
    57325693                        item = gtk.ImageMenuItem(_('_Block')) 
    5733                         item.connect('activate', self.on_block, titer, None) 
     5694                        item.connect('activate', self.on_block, [(contact, account)]) 
    57345695 
    57355696                icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU)