remove unneeded BeautifulSoup class
refactor the code so that it's not dup (vcard.get_avatar_pixbuf)
This commit is contained in:
		
							parent
							
								
									9b1881cbbd
								
							
						
					
					
						commit
						17f67e6a90
					
				
					 5 changed files with 83 additions and 1158 deletions
				
			
		
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -211,9 +211,30 @@ class Connection:
 | 
				
			||||||
			For feature: var is mandatory'''
 | 
								For feature: var is mandatory'''
 | 
				
			||||||
		self._discover(common.xmpp.NS_DISCO_INFO, jid, node)
 | 
							self._discover(common.xmpp.NS_DISCO_INFO, jid, node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def node_to_dict(self, node):
 | 
				
			||||||
 | 
							dict = {}
 | 
				
			||||||
 | 
							for info in node.getChildren():
 | 
				
			||||||
 | 
								name = info.getName()
 | 
				
			||||||
 | 
								if name in ('ADR', 'TEL', 'EMAIL'): # we can have several
 | 
				
			||||||
 | 
									if not dict.has_key(name):
 | 
				
			||||||
 | 
										dict[name] = []
 | 
				
			||||||
 | 
									entry = {}
 | 
				
			||||||
 | 
									for c in info.getChildren():
 | 
				
			||||||
 | 
										 entry[c.getName()] = c.getData()
 | 
				
			||||||
 | 
									dict[name].append(entry)
 | 
				
			||||||
 | 
								elif info.getChildren() == []:
 | 
				
			||||||
 | 
									dict[name] = info.getData()
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									dict[name] = {}
 | 
				
			||||||
 | 
									for c in info.getChildren():
 | 
				
			||||||
 | 
										 dict[name][c.getName()] = c.getData()
 | 
				
			||||||
 | 
							return dict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def _vCardCB(self, con, vc):
 | 
						def _vCardCB(self, con, vc):
 | 
				
			||||||
		"""Called when we receive a vCard
 | 
							"""Called when we receive a vCard
 | 
				
			||||||
		Parse the vCard and send it to plugins"""
 | 
							Parse the vCard and send it to plugins"""
 | 
				
			||||||
 | 
							if not vc.getTag('vCard'):
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
		frm_iq = vc.getFrom()
 | 
							frm_iq = vc.getFrom()
 | 
				
			||||||
		our_jid = gajim.get_jid_from_account(self.name)
 | 
							our_jid = gajim.get_jid_from_account(self.name)
 | 
				
			||||||
		resource = ''
 | 
							resource = ''
 | 
				
			||||||
| 
						 | 
					@ -222,30 +243,15 @@ class Connection:
 | 
				
			||||||
			resource = frm_iq.getResource()
 | 
								resource = frm_iq.getResource()
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			frm = our_jid
 | 
								frm = our_jid
 | 
				
			||||||
		vcard = {'jid': frm, 'resource': resource}
 | 
					 | 
				
			||||||
		if not vc.getTag('vCard'):
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		if vc.getTag('vCard').getNamespace() == common.xmpp.NS_VCARD:
 | 
							if vc.getTag('vCard').getNamespace() == common.xmpp.NS_VCARD:
 | 
				
			||||||
			card = vc.getChildren()[0]
 | 
								card = vc.getChildren()[0]
 | 
				
			||||||
			path_to_file = os.path.join(gajim.VCARDPATH, frm)
 | 
								path_to_file = os.path.join(gajim.VCARDPATH, frm)
 | 
				
			||||||
			fil = open(path_to_file, 'w')
 | 
								fil = open(path_to_file, 'w')
 | 
				
			||||||
			fil.write(str(card))
 | 
								fil.write(str(card))
 | 
				
			||||||
			fil.close()
 | 
								fil.close()
 | 
				
			||||||
			for info in card.getChildren():
 | 
								vcard = self.node_to_dict(card)
 | 
				
			||||||
				name = info.getName()
 | 
								vcard['jid'] = frm
 | 
				
			||||||
				if name in ('ADR', 'TEL', 'EMAIL'): # we can have several
 | 
								vcard['resource'] = resource
 | 
				
			||||||
					if not vcard.has_key(name):
 | 
					 | 
				
			||||||
						vcard[name] = []
 | 
					 | 
				
			||||||
					entry = {}
 | 
					 | 
				
			||||||
					for c in info.getChildren():
 | 
					 | 
				
			||||||
						 entry[c.getName()] = c.getData()
 | 
					 | 
				
			||||||
					vcard[name].append(entry)
 | 
					 | 
				
			||||||
				elif info.getChildren() == []:
 | 
					 | 
				
			||||||
					vcard[name] = info.getData()
 | 
					 | 
				
			||||||
				else:
 | 
					 | 
				
			||||||
					vcard[name] = {}
 | 
					 | 
				
			||||||
					for c in info.getChildren():
 | 
					 | 
				
			||||||
						 vcard[name][c.getName()] = c.getData()
 | 
					 | 
				
			||||||
			if frm == our_jid:
 | 
								if frm == our_jid:
 | 
				
			||||||
				if vcard.has_key('PHOTO') and type(vcard['PHOTO']) == type({}) and \
 | 
									if vcard.has_key('PHOTO') and type(vcard['PHOTO']) == type({}) and \
 | 
				
			||||||
				vcard['PHOTO'].has_key('BINVAL'):
 | 
									vcard['PHOTO'].has_key('BINVAL'):
 | 
				
			||||||
| 
						 | 
					@ -1861,8 +1867,21 @@ class Connection:
 | 
				
			||||||
			common.xmpp.NS_VERSION)
 | 
								common.xmpp.NS_VERSION)
 | 
				
			||||||
		self.to_be_sent.append(iq)
 | 
							self.to_be_sent.append(iq)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def get_cached_vcard(self, jid):
 | 
				
			||||||
 | 
							j = gajim.get_jid_without_resource(jid)
 | 
				
			||||||
 | 
							path_to_file = os.path.join(gajim.VCARDPATH, j)
 | 
				
			||||||
 | 
							if os.path.isfile(path_to_file):
 | 
				
			||||||
 | 
								# We have the vcard cached
 | 
				
			||||||
 | 
								f = open(path_to_file)
 | 
				
			||||||
 | 
								c = f.read()
 | 
				
			||||||
 | 
								card = common.xmpp.Node(node = c)
 | 
				
			||||||
 | 
								vcard = self.node_to_dict(card)
 | 
				
			||||||
 | 
								vcard['jid'] = j
 | 
				
			||||||
 | 
								vcard['resource'] = gajim.get_resource_from_jid(jid)
 | 
				
			||||||
 | 
								return vcard
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def request_vcard(self, jid = None):
 | 
						def request_vcard(self, jid = None):
 | 
				
			||||||
		'''request the VCARD and return the iq'''
 | 
							'''request the VCARD'''
 | 
				
			||||||
		if not self.connection:
 | 
							if not self.connection:
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		iq = common.xmpp.Iq(typ = 'get')
 | 
							iq = common.xmpp.Iq(typ = 'get')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										44
									
								
								src/gajim.py
									
										
									
									
									
								
							
							
						
						
									
										44
									
								
								src/gajim.py
									
										
									
									
									
								
							| 
						 | 
					@ -26,8 +26,6 @@ import sys
 | 
				
			||||||
import pygtk
 | 
					import pygtk
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import common.BeautifulSoup as BeautifulSoup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from common import i18n
 | 
					from common import i18n
 | 
				
			||||||
i18n.init()
 | 
					i18n.init()
 | 
				
			||||||
_ = i18n._
 | 
					_ = i18n._
 | 
				
			||||||
| 
						 | 
					@ -78,6 +76,8 @@ import base64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from common import socks5
 | 
					from common import socks5
 | 
				
			||||||
import gtkgui_helpers
 | 
					import gtkgui_helpers
 | 
				
			||||||
 | 
					import vcard
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import common.sleepy
 | 
					import common.sleepy
 | 
				
			||||||
import check_for_new_version
 | 
					import check_for_new_version
 | 
				
			||||||
| 
						 | 
					@ -947,41 +947,17 @@ class Interface:
 | 
				
			||||||
	def handle_event_vcard_not_published(self, account, array):
 | 
						def handle_event_vcard_not_published(self, account, array):
 | 
				
			||||||
		dialogs.InformationDialog(_('vCard publication failed'), _('There was an error while publishing your personal information, try again later.'))
 | 
							dialogs.InformationDialog(_('vCard publication failed'), _('There was an error while publishing your personal information, try again later.'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def get_avatar_pixbuf(self, jid):
 | 
						def get_avatar_pixbuf_from_cache(self, account, jid):
 | 
				
			||||||
		'''checks if jid has avatar and if that avatar is valid image
 | 
							'''checks if jid has avatar cached and if that avatar is valid image
 | 
				
			||||||
		(can be shown)'''
 | 
							(can be shown)'''
 | 
				
			||||||
		if jid not in os.listdir(gajim.VCARDPATH):
 | 
							if jid not in os.listdir(gajim.VCARDPATH):
 | 
				
			||||||
			return
 | 
								return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		path_to_file = os.path.join(gajim.VCARDPATH, jid)
 | 
							vcard_dict = gajim.connections[account].get_cached_vcard(jid)
 | 
				
			||||||
		vcard_data = open(path_to_file).read()
 | 
							if not vcard_dict.has_key('PHOTO'):
 | 
				
			||||||
		xmldoc = BeautifulSoup.BeautifulSoup(vcard_data)
 | 
								return None
 | 
				
			||||||
		
 | 
							pix, _t, _t = vcard.get_avatar_pixbuf(vcard_dict['PHOTO'])
 | 
				
			||||||
		# check for BINVAL
 | 
							return pix
 | 
				
			||||||
		if isinstance(xmldoc.vcard.photo.binval, BeautifulSoup.NullType):
 | 
					 | 
				
			||||||
			# no BINVAL, check for EXTVAL
 | 
					 | 
				
			||||||
			if isinstance(xmldoc.vcard.photo.extval, BeautifulSoup.NullType):
 | 
					 | 
				
			||||||
				return # no EXTVAL, contact has no avatar in his vcard
 | 
					 | 
				
			||||||
			else:
 | 
					 | 
				
			||||||
				# we have EXTVAL
 | 
					 | 
				
			||||||
				url = xmldoc.vcard.photo.extval
 | 
					 | 
				
			||||||
				try:
 | 
					 | 
				
			||||||
					fd = urllib.urlopen(url)
 | 
					 | 
				
			||||||
					img_decoded = fd.read()
 | 
					 | 
				
			||||||
				except:
 | 
					 | 
				
			||||||
					img_decoded = None
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		else:
 | 
					 | 
				
			||||||
			# we have BINVAL
 | 
					 | 
				
			||||||
			try:
 | 
					 | 
				
			||||||
				text = xmldoc.vcard.photo.binval.string
 | 
					 | 
				
			||||||
				img_decoded = base64.decodestring(text)
 | 
					 | 
				
			||||||
			except:
 | 
					 | 
				
			||||||
				img_decoded = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if img_decoded is not None:
 | 
					 | 
				
			||||||
			pixbuf = gtkgui_helpers.get_pixbuf_from_data(img_decoded)
 | 
					 | 
				
			||||||
			return pixbuf
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	def read_sleepy(self):	
 | 
						def read_sleepy(self):	
 | 
				
			||||||
		'''Check idle status and change that status if needed'''
 | 
							'''Check idle status and change that status if needed'''
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,7 +131,8 @@ class TabbedChatWindow(chat.Chat):
 | 
				
			||||||
		'''we enter the eventbox area so we under conditions add a timeout
 | 
							'''we enter the eventbox area so we under conditions add a timeout
 | 
				
			||||||
		to show a bigger avatar after 0.5 sec'''
 | 
							to show a bigger avatar after 0.5 sec'''
 | 
				
			||||||
		jid = self.get_active_jid()
 | 
							jid = self.get_active_jid()
 | 
				
			||||||
		avatar_pixbuf = gajim.interface.get_avatar_pixbuf(jid)
 | 
							avatar_pixbuf = gajim.interface.get_avatar_pixbuf_from_cache(self.account,
 | 
				
			||||||
 | 
								jid)
 | 
				
			||||||
		avatar_w = avatar_pixbuf.get_width()
 | 
							avatar_w = avatar_pixbuf.get_width()
 | 
				
			||||||
		avatar_h = avatar_pixbuf.get_height()
 | 
							avatar_h = avatar_pixbuf.get_height()
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
| 
						 | 
					@ -155,7 +156,8 @@ class TabbedChatWindow(chat.Chat):
 | 
				
			||||||
		'''resizes the avatar, if needed, so it has at max half the screen size
 | 
							'''resizes the avatar, if needed, so it has at max half the screen size
 | 
				
			||||||
		and shows it'''
 | 
							and shows it'''
 | 
				
			||||||
		jid = self.get_active_jid()
 | 
							jid = self.get_active_jid()
 | 
				
			||||||
		avatar_pixbuf = gajim.interface.get_avatar_pixbuf(jid)
 | 
							avatar_pixbuf = gajim.interface.get_avatar_pixbuf_from_cache(self.account,
 | 
				
			||||||
 | 
								jid)
 | 
				
			||||||
		screen_w = gtk.gdk.screen_width()
 | 
							screen_w = gtk.gdk.screen_width()
 | 
				
			||||||
		screen_h = gtk.gdk.screen_height()
 | 
							screen_h = gtk.gdk.screen_height()
 | 
				
			||||||
		avatar_w = avatar_pixbuf.get_width()
 | 
							avatar_w = avatar_pixbuf.get_width()
 | 
				
			||||||
| 
						 | 
					@ -293,7 +295,8 @@ class TabbedChatWindow(chat.Chat):
 | 
				
			||||||
		# we assume contact has no avatar
 | 
							# we assume contact has no avatar
 | 
				
			||||||
		scaled_buf = None
 | 
							scaled_buf = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pixbuf = gajim.interface.get_avatar_pixbuf(jid)
 | 
							pixbuf = gajim.interface.get_avatar_pixbuf_from_cache(self.account,
 | 
				
			||||||
 | 
								jid)
 | 
				
			||||||
		if pixbuf is not None:
 | 
							if pixbuf is not None:
 | 
				
			||||||
			# resize to a width / height for the avatar not to have distortion
 | 
								# resize to a width / height for the avatar not to have distortion
 | 
				
			||||||
			# (keep aspect ratio)
 | 
								# (keep aspect ratio)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										47
									
								
								src/vcard.py
									
										
									
									
									
								
							
							
						
						
									
										47
									
								
								src/vcard.py
									
										
									
									
									
								
							| 
						 | 
					@ -39,6 +39,31 @@ gtk.glade.textdomain (APP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GTKGUI_GLADE = 'gtkgui.glade'
 | 
					GTKGUI_GLADE = 'gtkgui.glade'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_avatar_pixbuf(photo):
 | 
				
			||||||
 | 
						'''return the pixbuf of the image
 | 
				
			||||||
 | 
						photo is a dictionary containing PHOTO information'''
 | 
				
			||||||
 | 
						if not isinstance(photo, dict):
 | 
				
			||||||
 | 
							return None, None, None
 | 
				
			||||||
 | 
						img_decoded = None
 | 
				
			||||||
 | 
						if photo.has_key('BINVAL') and photo.has_key('TYPE'):
 | 
				
			||||||
 | 
							img_encoded = photo['BINVAL']
 | 
				
			||||||
 | 
							avatar_encoded = img_encoded
 | 
				
			||||||
 | 
							avatar_mime_type = photo['TYPE']
 | 
				
			||||||
 | 
							try:
 | 
				
			||||||
 | 
								img_decoded = base64.decodestring(img_encoded)
 | 
				
			||||||
 | 
							except:
 | 
				
			||||||
 | 
								pass
 | 
				
			||||||
 | 
						elif photo.has_key('EXTVAL'):
 | 
				
			||||||
 | 
							url = photo['EXTVAL']
 | 
				
			||||||
 | 
							try:
 | 
				
			||||||
 | 
								fd = urllib.urlopen(url)
 | 
				
			||||||
 | 
								img_decoded = fd.read()
 | 
				
			||||||
 | 
							except:
 | 
				
			||||||
 | 
								pass
 | 
				
			||||||
 | 
						if img_decoded:
 | 
				
			||||||
 | 
							return gtkgui_helpers.get_pixbuf_from_data(img_decoded), avatar_encoded, avatar_mime_type
 | 
				
			||||||
 | 
						return None, None, None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VcardWindow:
 | 
					class VcardWindow:
 | 
				
			||||||
	'''Class for contact's information window'''
 | 
						'''Class for contact's information window'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -201,26 +226,8 @@ class VcardWindow:
 | 
				
			||||||
	def set_values(self, vcard):
 | 
						def set_values(self, vcard):
 | 
				
			||||||
		for i in vcard.keys():
 | 
							for i in vcard.keys():
 | 
				
			||||||
			if i == 'PHOTO':
 | 
								if i == 'PHOTO':
 | 
				
			||||||
				if not isinstance(vcard[i], dict):
 | 
									pixbuf, self.avatar_encoded, self.avatar_mime_type = \
 | 
				
			||||||
					continue
 | 
										get_avatar_pixbuf(vcard[i])
 | 
				
			||||||
				img_decoded = None
 | 
					 | 
				
			||||||
				if vcard[i].has_key('BINVAL') and vcard[i].has_key('TYPE'):
 | 
					 | 
				
			||||||
					img_encoded = vcard[i]['BINVAL']
 | 
					 | 
				
			||||||
					self.avatar_encoded = img_encoded
 | 
					 | 
				
			||||||
					self.avatar_mime_type = vcard[i]['TYPE']
 | 
					 | 
				
			||||||
					try:
 | 
					 | 
				
			||||||
						img_decoded = base64.decodestring(img_encoded)
 | 
					 | 
				
			||||||
					except:
 | 
					 | 
				
			||||||
						pass
 | 
					 | 
				
			||||||
				elif vcard[i].has_key('EXTVAL'):
 | 
					 | 
				
			||||||
					url = vcard[i]['EXTVAL']
 | 
					 | 
				
			||||||
					try:
 | 
					 | 
				
			||||||
						fd = urllib.urlopen(url)
 | 
					 | 
				
			||||||
						img_decoded = fd.read()
 | 
					 | 
				
			||||||
					except:
 | 
					 | 
				
			||||||
						pass
 | 
					 | 
				
			||||||
				if img_decoded:
 | 
					 | 
				
			||||||
					pixbuf = gtkgui_helpers.get_pixbuf_from_data(img_decoded)
 | 
					 | 
				
			||||||
				image = self.xml.get_widget('PHOTO_image')
 | 
									image = self.xml.get_widget('PHOTO_image')
 | 
				
			||||||
				image.set_from_pixbuf(pixbuf)
 | 
									image.set_from_pixbuf(pixbuf)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue