From 483481c586f8087d1759f44484e6eb36e5b199ec Mon Sep 17 00:00:00 2001
From: Yann Leboulanger <asterix@lagaule.org>
Date: Tue, 2 Jan 2007 11:43:57 +0000
Subject: [PATCH] ask transport contact avatars only when transport is
 connected. fixes #2832

---
 src/common/gajim.py  |  4 ++++
 src/config.py        |  6 ++++++
 src/gajim.py         |  5 +++++
 src/roster_window.py | 18 +++++++++++++-----
 4 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/src/common/gajim.py b/src/common/gajim.py
index 78354108df..add7911e58 100644
--- a/src/common/gajim.py
+++ b/src/common/gajim.py
@@ -120,6 +120,10 @@ sleeper_state = {} # whether we pass auto away / xa or not
 #'autoxa': autoxa and use sleeper
 status_before_autoaway = {}
 
+# jid of transport contacts for which we need to ask avatar when transport will
+# be online
+transport_avatar = {} # {transport_jid: [jid_list]}
+
 SHOW_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd',
 	'invisible', 'error']
 
diff --git a/src/config.py b/src/config.py
index 5faca1f17c..8482733594 100644
--- a/src/config.py
+++ b/src/config.py
@@ -1467,6 +1467,7 @@ class AccountModificationWindow:
 				gajim.last_message_time[self.account]
 			gajim.status_before_autoaway[name] = \
 				gajim.status_before_autoaway[self.account]
+			gajim.transport_avatar[name] = gajim.transport_avatar[self.account]
 
 			gajim.contacts.change_account_name(self.account, name)
 			gajim.events.change_account_name(self.account, name)
@@ -1493,6 +1494,7 @@ class AccountModificationWindow:
 			del gajim.encrypted_chats[self.account]
 			del gajim.last_message_time[self.account]
 			del gajim.status_before_autoaway[self.account]
+			del gajim.transport_avatar[self.account]
 			gajim.connections[self.account].name = name
 			gajim.connections[name] = gajim.connections[self.account]
 			del gajim.connections[self.account]
@@ -2054,6 +2056,7 @@ class AccountsWindow:
 			del gajim.encrypted_chats[gajim.ZEROCONF_ACC_NAME]
 			del gajim.last_message_time[gajim.ZEROCONF_ACC_NAME]
 			del gajim.status_before_autoaway[gajim.ZEROCONF_ACC_NAME]
+			del gajim.transport_avatar[gajim.ZEROCONF_ACC_NAME]
 			if len(gajim.connections) >= 2:
 				# Do not merge accounts if only one exists
 				gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') 
@@ -2084,6 +2087,7 @@ class AccountsWindow:
 			gajim.encrypted_chats[gajim.ZEROCONF_ACC_NAME] = []
 			gajim.last_message_time[gajim.ZEROCONF_ACC_NAME] = {}
 			gajim.status_before_autoaway[gajim.ZEROCONF_ACC_NAME] = ''
+			gajim.transport_avatar[gajim.ZEROCONF_ACC_NAME] = {}
 			# refresh accounts window
 			if gajim.interface.instances.has_key('accounts'):
 				gajim.interface.instances['accounts'].init_accounts()
@@ -2587,6 +2591,7 @@ class RemoveAccountWindow:
 		del gajim.encrypted_chats[self.account]
 		del gajim.last_message_time[self.account]
 		del gajim.status_before_autoaway[self.account]
+		del gajim.transport_avatar[self.account]
 		if len(gajim.connections) >= 2: # Do not merge accounts if only one exists
 			gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') 
 		else: 
@@ -3231,6 +3236,7 @@ class AccountCreationWizardWindow:
 		gajim.encrypted_chats[self.account] = []
 		gajim.last_message_time[self.account] = {}
 		gajim.status_before_autoaway[self.account] = ''
+		gajim.transport_avatar[self.account] = {}
 		# refresh accounts window
 		if gajim.interface.instances.has_key('accounts'):
 			gajim.interface.instances['accounts'].init_accounts()
diff --git a/src/gajim.py b/src/gajim.py
index de13062d71..006d19aad8 100755
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -595,6 +595,10 @@ class Interface:
 				# Update existing iter
 				self.roster.draw_contact(ji, account)
 				self.roster.draw_group(_('Transports'), account)
+				if new_show > 1 and ji in gajim.transport_avatar[account]:
+					# transport just signed in. request avatars
+					for jid_ in gajim.transport_avatar[account][ji]:
+						gajim.connections[account].request_vcard(jid_)
 				# transport just signed in/out, don't show popup notifications
 				# for 30s
 				account_ji = account + '/' + ji
@@ -2134,6 +2138,7 @@ class Interface:
 			gajim.encrypted_chats[a] = []
 			gajim.last_message_time[a] = {}
 			gajim.status_before_autoaway[a] = ''
+			gajim.transport_avatar[a] = {}
 
 		self.roster = roster_window.RosterWindow()
 		
diff --git a/src/roster_window.py b/src/roster_window.py
index e38f657749..68085188e9 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -1157,10 +1157,18 @@ class RosterWindow:
 			if gajim.config.get('ask_avatars_on_startup'):
 				pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(ji)
 				if pixbuf == 'ask':
-					jid_with_resource = contact1.jid
-					if contact1.resource:
-						jid_with_resource += '/' + contact1.resource
-					gajim.connections[account].request_vcard(jid_with_resource)
+					transport = gajim.get_transport_name_from_jid(contact1.jid)
+					if not transport or gajim.jid_is_transport(contact1.jid):
+						jid_with_resource = contact1.jid
+						if contact1.resource:
+							jid_with_resource += '/' + contact1.resource
+						gajim.connections[account].request_vcard(jid_with_resource)
+					else:
+						host = gajim.get_server_from_jid(contact1.jid)
+						if not gajim.transport_avatar[account].has_key(host):
+							gajim.transport_avatar[account][host] = [contact1.jid]
+						else:
+							gajim.transport_avatar[account][host].append(contact1.jid)
 			# If we already have a chat window opened, update it with new contact
 			# instance
 			chat_control = gajim.interface.msg_win_mgr.get_control(ji, account)
@@ -4256,7 +4264,7 @@ class RosterWindow:
 			'closed': {}}
 		self.transports_state_images = {'16': {}, '32': {}, 'opened': {},
 			'closed': {}}
-		
+
 		self.last_save_dir = None
 		self.editing_path = None  # path of row with cell in edit mode
 		self.add_new_contact_handler_id = False
-- 
GitLab