Author: asterix
Date: 2008-08-28 10:23:31 +0200 (Thu, 28 Aug 2008)
New Revision: 10329
Modified:
trunk/src/roster_window.py
Log:
don't pass iters to menuitems callback, that are quickly invalid. Fixes #4034
Modified: trunk/src/roster_window.py
===================================================================
--- trunk/src/roster_window.py 2008-08-27 18:55:18 UTC (rev 10328)
+++ trunk/src/roster_window.py 2008-08-28 08:23:31 UTC (rev 10329)
@@ -2508,57 +2508,44 @@
dialogs.ConfirmationDialog(pritext, sectext,
on_response_ok = (remove, list_))
- def on_block(self, widget, titer, group_list):
- ''' When clicked on the 'block' button in context menu. '''
+ def on_block(self, widget, list_, group=None):
+ ''' When clicked on the 'block' button in context menu.
+ list_ is a list of (contact, account)'''
def on_continue(msg):
if msg is None:
# user pressed Cancel to change status message dialog
return
model = self.modelfilter
accounts = []
- if group_list is None:
- jid = model[titer][C_JID].decode('utf-8')
- account = model[titer][C_ACCOUNT].decode('utf-8')
- accounts.append(account)
- self.send_status(account, 'offline', msg, to = jid)
- new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny',
- 'value' : jid, 'child': [u'message', u'iq', u'presence-out']}
- gajim.connections[account].blocked_list.append(new_rule)
- # needed for draw_contact:
- gajim.connections[account].blocked_contacts.append(jid)
- self.draw_contact(jid, account)
- else:
- if titer is None:
- for (contact, account) in group_list:
- if account not in accounts:
- if not gajim.connections[account].privacy_rules_supported:
- continue
- accounts.append(account)
- self.send_status(account, 'offline', msg, to=contact.jid)
- new_rule = {'order': u'1', 'type': u'jid',
- 'action': u'deny', 'value' : contact.jid,
- 'child': [u'message', u'iq', u'presence-out']}
- gajim.connections[account].blocked_list.append(new_rule)
- # needed for draw_contact:
- gajim.connections[account].blocked_contacts.append(
- contact.jid)
- self.draw_contact(contact.jid, account)
- else:
- group = model[titer][C_JID].decode('utf-8')
- for (contact, account) in group_list:
- if account not in accounts:
- if not gajim.connections[account].privacy_rules_supported:
- continue
- accounts.append(account)
- # needed for draw_group:
- gajim.connections[account].blocked_groups.append(group)
- self.draw_group(group, account)
- self.send_status(account, 'offline', msg, to=contact.jid)
- self.draw_contact(contact.jid, account)
- new_rule = {'order': u'1', 'type': u'group', 'action': u'deny',
- 'value' : group, 'child': [u'message', u'iq',
+ if group is None:
+ for (contact, account) in list_:
+ if account not in accounts:
+ if not gajim.connections[account].privacy_rules_supported:
+ continue
+ accounts.append(account)
+ self.send_status(account, 'offline', msg, to=contact.jid)
+ new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny',
+ 'value' : contact.jid, 'child': [u'message', u'iq',
u'presence-out']}
gajim.connections[account].blocked_list.append(new_rule)
+ # needed for draw_contact:
+ gajim.connections[account].blocked_contacts.append(
+ contact.jid)
+ self.draw_contact(contact.jid, account)
+ else:
+ for (contact, account) in list_:
+ if account not in accounts:
+ if not gajim.connections[account].privacy_rules_supported:
+ continue
+ accounts.append(account)
+ # needed for draw_group:
+ gajim.connections[account].blocked_groups.append(group)
+ self.draw_group(group, account)
+ self.send_status(account, 'offline', msg, to=contact.jid)
+ self.draw_contact(contact.jid, account)
+ new_rule = {'order': u'1', 'type': u'group', 'action': u'deny',
+ 'value' : group, 'child': [u'message', u'iq', u'presence-out']}
+ gajim.connections[account].blocked_list.append(new_rule)
for account in accounts:
gajim.connections[account].set_privacy_list(
'block', gajim.connections[account].blocked_list)
@@ -2569,64 +2556,47 @@
self.get_status_message('offline', on_continue)
- def on_unblock(self, widget, titer, group_list):
+ def on_unblock(self, widget, list_, group=None):
''' When clicked on the 'unblock' button in context menu. '''
model = self.modelfilter
accounts = []
- if group_list is None:
- jid = model[titer][C_JID].decode('utf-8')
- jid_account = model[titer][C_ACCOUNT].decode('utf-8')
- accounts.append(jid_account)
- gajim.connections[jid_account].new_blocked_list = []
- for rule in gajim.connections[jid_account].blocked_list:
- if rule['action'] != 'deny' or rule['type'] != 'jid' \
- or rule['value'] != jid:
- gajim.connections[jid_account].new_blocked_list.append(rule)
- # needed for draw_contact:
- if jid in gajim.connections[jid_account].blocked_contacts:
- gajim.connections[jid_account].blocked_contacts.remove(jid)
- self.draw_contact(jid, jid_account)
- else:
- if titer is None:
- for (contact, account) in group_list:
- if account not in accounts:
- if gajim.connections[account].privacy_rules_supported:
- accounts.append(account)
- gajim.connections[account].new_blocked_list = []
- gajim.connections[account].to_unblock = []
- gajim.connections[account].to_unblock.append(contact.jid)
- else:
+ if group is None:
+ for (contact, account) in list_:
+ if account not in accounts:
+ if gajim.connections[account].privacy_rules_supported:
+ accounts.append(account)
+ gajim.connections[account].new_blocked_list = []
+ gajim.connections[account].to_unblock = []
gajim.connections[account].to_unblock.append(contact.jid)
- # needed for draw_contact:
- if contact.jid in gajim.connections[account].blocked_contacts:
- gajim.connections[account].blocked_contacts.remove(
- contact.jid)
- self.draw_contact(contact.jid, account)
- for account in accounts:
- for rule in gajim.connections[account].blocked_list:
- if rule['action'] != 'deny' or rule['type'] != 'jid' \
- or rule['value'] not in gajim.connections[account].to_unblock:
- gajim.connections[account].new_blocked_list.append(rule)
- else:
- group = model[titer][C_JID].decode('utf-8')
- for (contact, account) in group_list:
- if account not in accounts:
- if gajim.connections[account].privacy_rules_supported:
- accounts.append(account)
- # needed for draw_group:
- if group in gajim.connections[account].blocked_groups:
- gajim.connections[account].blocked_groups.remove(group)
- self.draw_group(group, account)
- gajim.connections[account].new_blocked_list = []
- for rule in gajim.connections[account].blocked_list:
- if rule['action'] != 'deny' or rule['type'] != 'group' \
- or rule['value'] != group:
- gajim.connections[account].new_blocked_list.append(
- rule)
- self.draw_contact(contact.jid, account)
+ else:
+ gajim.connections[account].to_unblock.append(contact.jid)
+ # needed for draw_contact:
+ if contact.jid in gajim.connections[account].blocked_contacts:
+ gajim.connections[account].blocked_contacts.remove(contact.jid)
+ self.draw_contact(contact.jid, account)
+ for account in accounts:
+ for rule in gajim.connections[account].blocked_list:
+ if rule['action'] != 'deny' or rule['type'] != 'jid' \
+ or rule['value'] not in gajim.connections[account].to_unblock:
+ gajim.connections[account].new_blocked_list.append(rule)
+ else:
+ for (contact, account) in list_:
+ if account not in accounts:
+ if gajim.connections[account].privacy_rules_supported:
+ accounts.append(account)
+ # needed for draw_group:
+ if group in gajim.connections[account].blocked_groups:
+ gajim.connections[account].blocked_groups.remove(group)
+ self.draw_group(group, account)
+ gajim.connections[account].new_blocked_list = []
+ for rule in gajim.connections[account].blocked_list:
+ if rule['action'] != 'deny' or rule['type'] != 'group' \
+ or rule['value'] != group:
+ gajim.connections[account].new_blocked_list.append(rule)
+ self.draw_contact(contact.jid, account)
for account in accounts:
- gajim.connections[account].set_privacy_list(
- 'block', gajim.connections[account].new_blocked_list)
+ gajim.connections[account].set_privacy_list('block',
+ gajim.connections[account].new_blocked_list)
gajim.connections[account].get_privacy_list('block')
if len(gajim.connections[account].new_blocked_list) == 0:
gajim.connections[account].blocked_list = []
@@ -2638,45 +2608,30 @@
if gajim.interface.instances[account].has_key('blocked_contacts'):
gajim.interface.instances[account]['blocked_contacts'].\
privacy_list_received([])
- if group_list is None:
- status = gajim.connections[jid_account].connected
- if gajim.SHOW_LIST[status] == 'invisible':
- # Don't send our presence if we're invisible
- return
- msg = gajim.connections[jid_account].status
+ for (contact, account) in list_:
if not self.regroup:
- show = gajim.SHOW_LIST[status]
+ show = gajim.SHOW_LIST[gajim.connections[account].connected]
else: # accounts merged
show = helpers.get_global_show()
- self.send_status(jid_account, show, msg, to=jid)
- else:
- for (contact, account) in group_list:
- if not self.regroup:
- show = gajim.SHOW_LIST[gajim.connections[account].connected]
- else: # accounts merged
- show = helpers.get_global_show()
- if show == 'invisible':
- # Don't send our presence if we're invisible
- continue
- if account not in accounts:
- if gajim.connections[account].privacy_rules_supported:
- accounts.append(account)
- self.send_status(account, show,
- gajim.connections[account].status, to=contact.jid)
- else:
+ if show == 'invisible':
+ # Don't send our presence if we're invisible
+ continue
+ if account not in accounts:
+ accounts.append(account)
+ if gajim.connections[account].privacy_rules_supported:
self.send_status(account, show,
gajim.connections[account].status, to=contact.jid)
+ else:
+ self.send_status(account, show,
+ gajim.connections[account].status, to=contact.jid)
- def on_rename(self, widget, titer, path):
+ def on_rename(self, widget, row_type, jid, account):
# this function is called either by F2 or by Rename menuitem
if gajim.interface.instances.has_key('rename'):
gajim.interface.instances['rename'].dialog.present()
return
model = self.modelfilter
- row_type = model[titer][C_TYPE]
- jid = model[titer][C_JID].decode('utf-8')
- account = model[titer][C_ACCOUNT].decode('utf-8')
# account is offline, don't allow to rename
if gajim.connections[account].connected < 2:
return
@@ -2689,9 +2644,9 @@
elif row_type == 'group':
if jid in helpers.special_groups + (_('General'),):
return
- old_text = model[titer][C_JID].decode('utf-8')
+ old_text = jid
title = _('Rename Group')
- message = _('Enter a new name for group %s') % old_text
+ message = _('Enter a new name for group %s') % jid
def on_renamed(new_text, account, row_type, jid, old_text):
if gajim.interface.instances.has_key('rename'):
@@ -2981,8 +2936,9 @@
path = list_of_paths[0]
type_ = model[path][C_TYPE]
if type_ in ('contact', 'group', 'agent'):
- titer = model.get_iter(path)
- self.on_rename(widget, titer, path)
+ jid = model[path][C_JID].decode('utf-8')
+ account = model[path][C_ACCOUNT].decode('utf-8')
+ self.on_rename(widget, type_, jid, account)
elif event.keyval == gtk.keysyms.Delete:
treeselection = self.tree.get_selection()
@@ -2990,7 +2946,7 @@
if not len(list_of_paths):
return
type_ = model[list_of_paths[0]][C_TYPE]
- account = model[list_of_paths[0]][C_ACCOUNT]
+ account = model[list_of_paths[0]][C_ACCOUNT].decode('utf-8')
list_ = []
for path in list_of_paths:
if model[path][C_TYPE] != type_:
@@ -5125,7 +5081,8 @@
img.set_from_file(path_to_kbd_input_img)
rename_item.set_image(img)
menu.append(rename_item)
- rename_item.connect('activate', self.on_rename, titer, path)
+ rename_item.connect('activate', self.on_rename, 'group', group,
+ account)
# Block group
is_blocked = False
@@ -5141,13 +5098,13 @@
unblock_menuitem = gtk.ImageMenuItem(_('_Unblock'))
icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU)
unblock_menuitem.set_image(icon)
- unblock_menuitem.connect('activate', self.on_unblock, titer, list_)
+ unblock_menuitem.connect('activate', self.on_unblock, list_, group)
menu.append(unblock_menuitem)
else:
block_menuitem = gtk.ImageMenuItem(_('_Block'))
icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU)
block_menuitem.set_image(icon)
- block_menuitem.connect('activate', self.on_block, titer, list_)
+ block_menuitem.connect('activate', self.on_block, list_, group)
menu.append(block_menuitem)
if not gajim.connections[account].privacy_rules_supported:
block_menuitem.set_sensitive(False)
@@ -5247,7 +5204,8 @@
else:
send_file_menuitem.set_sensitive(False)
- rename_menuitem.connect('activate', self.on_rename, titer, tree_path)
+ rename_menuitem.connect('activate', self.on_rename, 'contact', jid,
+ account)
if contact.show in ('offline', 'error'):
information_menuitem.set_sensitive(False)
send_file_menuitem.set_sensitive(False)
@@ -5426,7 +5384,8 @@
send_single_message_menuitem.connect('activate',
self.on_send_single_message_menuitem_activate, account, contact)
- rename_menuitem.connect('activate', self.on_rename, titer, tree_path)
+ rename_menuitem.connect('activate', self.on_rename, 'contact', jid,
+ account)
remove_from_roster_menuitem.connect('activate', self.on_req_usub,
[(contact, account)])
information_menuitem.connect('activate', self.on_info, contact,
@@ -5500,11 +5459,11 @@
unblock_menuitem.set_no_show_all(True)
unblock_menuitem.hide()
unignore_menuitem.set_no_show_all(False)
- unignore_menuitem.connect('activate', self.on_unblock, titer,
- None)
+ unignore_menuitem.connect('activate', self.on_unblock, [(contact,
+ account)])
else:
- unblock_menuitem.connect('activate', self.on_unblock, titer,
- None)
+ unblock_menuitem.connect('activate', self.on_unblock, [(contact,
+ account)])
else:
unblock_menuitem.set_no_show_all(True)
unblock_menuitem.hide()
@@ -5512,9 +5471,11 @@
block_menuitem.set_no_show_all(True)
block_menuitem.hide()
ignore_menuitem.set_no_show_all(False)
- ignore_menuitem.connect('activate', self.on_block, titer, None)
+ ignore_menuitem.connect('activate', self.on_block, [(contact,
+ account)])
else:
- block_menuitem.connect('activate', self.on_block, titer, None)
+ block_menuitem.connect('activate', self.on_block, [(contact,
+ account)])
else:
unblock_menuitem.set_no_show_all(True)
block_menuitem.set_sensitive(False)
@@ -5597,13 +5558,13 @@
unblock_menuitem = gtk.ImageMenuItem(_('_Unblock'))
icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU)
unblock_menuitem.set_image(icon)
- unblock_menuitem.connect('activate', self.on_unblock, None, list_)
+ unblock_menuitem.connect('activate', self.on_unblock, list_)
manage_contacts_submenu.append(unblock_menuitem)
else:
block_menuitem = gtk.ImageMenuItem(_('_Block'))
icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU)
block_menuitem.set_image(icon)
- block_menuitem.connect('activate', self.on_block, None, list_)
+ block_menuitem.connect('activate', self.on_block, list_)
manage_contacts_submenu.append(block_menuitem)
if not gajim.connections[account].privacy_rules_supported:
@@ -5717,7 +5678,7 @@
img.set_from_file(path_to_kbd_input_img)
item.set_image(img)
manage_transport_submenu.append(item)
- item.connect('activate', self.on_rename, titer, path)
+ item.connect('activate', self.on_rename, 'agent', jid, account)
if gajim.account_is_disconnected(account):
item.set_sensitive(False)
@@ -5727,10 +5688,10 @@
# Block
if blocked:
item = gtk.ImageMenuItem(_('_Unblock'))
- item.connect('activate', self.on_unblock, titer, None)
+ item.connect('activate', self.on_unblock, [(contact, account)])
else:
item = gtk.ImageMenuItem(_('_Block'))
- item.connect('activate', self.on_block, titer, None)
+ item.connect('activate', self.on_block, [(contact, account)])
icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU)
item.set_image(icon)