From ce07cfe7593188183ce261bde48f179869f6027a Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 7 Jun 2005 08:50:47 +0000 Subject: [PATCH] vcard is now fixed: we use lists for ADR, TEL EMAIL entry cause we can have several --- src/common/connection.py | 38 +++++++++++--------- src/vcard.py | 76 ++++++++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 46 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index ad15d6922..4ef69a25c 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -174,12 +174,20 @@ class Connection: if vc.getTag('vCard').getNamespace() == common.xmpp.NS_VCARD: card = vc.getChildren()[0] for info in card.getChildren(): - if info.getChildren() == []: - vcard[info.getName()] = info.getData() - else: - vcard[info.getName()] = {} + name = info.getName() + if name in ['ADR', 'TEL', 'EMAIL']: # we can have several + if not vcard.has_key(name): + vcard[name] = [] + entry = {} for c in info.getChildren(): - vcard[info.getName()][c.getName()] = c.getData() + 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 vc.getID() in self.myVCardID: self.myVCardID.remove(vc.getID()) self.dispatch('MYVCARD', vcard) @@ -893,22 +901,20 @@ class Connection: def send_vcard(self, vcard): if not self.connection: return - print vcard iq = common.xmpp.Iq(typ = 'set') iq2 = iq.setTag(common.xmpp.NS_VCARD + ' vCard') - for i in vcard.keys(): + for i in vcard: if i == 'jid': continue if type(vcard[i]) == type({}): - for j in vcard[i].keys(): - if type(vcard[i][j]) == type({}): - iq3 = iq2.addChild(i) - iq3.addChild(j) - for k in vcard[i][j]: - iq3.addChild(k).setData(vcard[i][j][k]) - else: - iq3 = iq2.addChild(i) - iq3.addChild(j).setData(vcard[i][j]) + iq3 = iq2.addChild(i) + for j in vcard[i]: + iq3.addChild(j).setData(vcard[i][j]) + elif type(vcard[i]) == type([]): + for j in vcard[i]: + iq3 = iq2.addChild(i) + for k in j: + iq3.addChild(k).setData(j[k]) else: iq2.addChild(i).setData(vcard[i]) self.connection.send(iq) diff --git a/src/vcard.py b/src/vcard.py index f6afef78e..bd2872826 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -135,39 +135,41 @@ class Vcard_window: def set_values(self, vcard): for i in vcard.keys(): - if type(vcard[i]) == type({}): - if i == 'PHOTO': - img_decoded = None - if vcard[i].has_key('BINVAL'): - 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: - pixbufloader = gtk.gdk.PixbufLoader() - pixbufloader.write(img_decoded) - pixbufloader.close() - pixbuf = pixbufloader.get_pixbuf() - image = self.xml.get_widget('PHOTO_image') - image.set_from_pixbuf(pixbuf) - continue - add_on = '' - if i == 'ADR' or i == 'TEL' or i == 'EMAIL': + if i == 'PHOTO': + img_decoded = None + if vcard[i].has_key('BINVAL'): + 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: + pixbufloader = gtk.gdk.PixbufLoader() + pixbufloader.write(img_decoded) + pixbufloader.close() + pixbuf = pixbufloader.get_pixbuf() + image = self.xml.get_widget('PHOTO_image') + image.set_from_pixbuf(pixbuf) + continue + if i == 'ADR' or i == 'TEL' or i == 'EMAIL': + for entry in vcard[i]: add_on = '_HOME' - if 'WORK' in vcard[i]: + if 'WORK' in entry: add_on = '_WORK' + for j in entry.keys(): + self.set_value(i + add_on + '_' + j + '_entry', entry[j]) + if type(vcard[i]) == type({}): for j in vcard[i].keys(): - self.set_value(i + add_on + '_' + j + '_entry', vcard[i][j]) + self.set_value(i + '_' + j + '_entry', vcard[i][j]) else: if i == 'DESC': self.xml.get_widget('DESC_textview').get_buffer().set_text( @@ -242,6 +244,19 @@ class Vcard_window: '''Add an information to the vCard dictionary''' entries = entry.split('_') loc = vcard + if len(entries) == 3: # We need to use lists + if not loc.has_key(entries[0]): + loc[entries[0]] = [] + found = False + for e in loc[entries[0]]: + if entries[1] in e: + found = True + break + if found: + e[entries[2]] = txt + else: + loc[entries[0]].append({entries[1]: '', entries[2]: txt}) + return vcard while len(entries) > 1: if not loc.has_key(entries[0]): loc[entries[0]] = {} @@ -306,6 +321,7 @@ class Vcard_window: for e in entries: self.xml.get_widget(e + '_entry').set_text('') self.xml.get_widget('DESC_textview').get_buffer().set_text('') + self.xml.get_widget('PHOTO_image').set_from_pixbuf(None) gajim.connections[self.account].request_vcard(self.jid) else: Error_dialog(_('You are not connected to the server'),