Show
Ignore:
Timestamp:
09/04/07 20:32:31 (15 months ago)
Author:
asterix
Message:

ask vcard to rela jid in muc if we knows it

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/gajim_0.11.1/src/common/connection_handlers.py

    r8699 r8709  
    797797                self.vcard_shas = {} # sha of contacts 
    798798                self.room_jids = [] # list of gc jids so that vcard are saved in a folder 
     799                self.groupchat_jids = {} # {ID : groupchat_jid} 
    799800                 
    800801        def add_sha(self, p, send_caps = True): 
     
    895896                return vcard 
    896897 
    897         def request_vcard(self, jid = None, is_fake_jid = False): 
    898                 '''request the VCARD. If is_fake_jid is True, it means we request a vcard 
    899                 to a fake jid, like in private messages in groupchat''' 
     898        def request_vcard(self, jid = None, groupchat_jid = None): 
     899                '''request the VCARD. If groupchat_jid is not nul, it means we request a vcard 
     900                to a fake jid, like in private messages in groupchat. jid can be the 
     901                real jid of the contact, but we want to consider it comes from a fake jid''' 
    900902                if not self.connection: 
    901903                        return 
     
    910912                if not j: 
    911913                        j = gajim.get_jid_from_account(self.name) 
    912                 self.awaiting_answers[id] = (VCARD_ARRIVED, j) 
    913                 if is_fake_jid: 
    914                         room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) 
     914                self.awaiting_answers[id] = (VCARD_ARRIVED, j, groupchat_jid) 
     915                if groupchat_jid: 
     916                        room_jid, nick = gajim.get_room_and_nick_from_fjid(groupchat_jid) 
    915917                        if not room_jid in self.room_jids: 
    916918                                self.room_jids.append(room_jid) 
     919                        self.groupchat_jids[id] = groupchat_jid 
    917920                self.connection.send(iq) 
    918                         #('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...}) 
    919921 
    920922        def send_vcard(self, vcard): 
     
    9991001                        # it knows it arrived 
    10001002                        jid = self.awaiting_answers[id][1] 
     1003                        groupchat_jid = self.awaiting_answers[id][2] 
     1004                        frm = jid 
     1005                        if groupchat_jid: 
     1006                                # We do as if it comes from the fake_jid 
     1007                                frm = groupchat_jid 
    10011008                        our_jid = gajim.get_jid_from_account(self.name) 
    10021009                        if iq_obj.getType() == 'error' and jid == our_jid: 
     
    10041011                                self.vcard_supported = False 
    10051012                        if not iq_obj.getTag('vCard') or iq_obj.getType() == 'error': 
    1006                                 if jid and jid != our_jid: 
     1013                                if frm and frm != our_jid: 
    10071014                                        # Write an empty file 
    1008                                         self.save_vcard_to_hd(jid, '') 
    1009                                         self.dispatch('VCARD', {'jid': jid}) 
    1010                                 elif jid == our_jid: 
    1011                                         self.dispatch('MYVCARD', {'jid': jid}) 
     1015                                        self.save_vcard_to_hd(frm, '') 
     1016                                        self.dispatch('VCARD', {'jid': frm}) 
     1017                                elif frm == our_jid: 
     1018                                        self.dispatch('MYVCARD', {'jid': frm}) 
    10121019                elif self.awaiting_answers[id][0] == AGENT_REMOVED: 
    10131020                        jid = self.awaiting_answers[id][1] 
     
    10521059                if not vc.getTag('vCard').getNamespace() == common.xmpp.NS_VCARD: 
    10531060                        return 
     1061                id = vc.getID() 
    10541062                frm_iq = vc.getFrom() 
    10551063                our_jid = gajim.get_jid_from_account(self.name) 
    10561064                resource = '' 
    1057                 if frm_iq: 
     1065                if id in self.groupchat_jids: 
     1066                        who = self.groupchat_jids[id] 
     1067                        frm, resource = gajim.get_room_and_nick_from_fjid(who) 
     1068                        del self.groupchat_jids[id] 
     1069                elif frm_iq: 
    10581070                        who = helpers.get_full_jid_from_iq(vc) 
    10591071                        frm, resource = gajim.get_room_and_nick_from_fjid(who) 
     
    11271139                        self.connection.send(p) 
    11281140                else: 
     1141                        #('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...}) 
    11291142                        self.dispatch('VCARD', vcard) 
    11301143 
     
    16551668                                if gajim.config.get('log_contact_status_changes') and self.name\ 
    16561669                                not in no_log_for and jid_stripped not in no_log_for: 
    1657                                         gc_c = gajim.contacts.get_gc_contact(self.name, jid_stripped, resource) 
     1670                                        gc_c = gajim.contacts.get_gc_contact(self.name, jid_stripped, 
     1671                                                resource) 
    16581672                                        st = status or '' 
    16591673                                        if gc_c: 
     
    16731687                                                puny_nick = helpers.sanitize_filename(resource) 
    16741688                                                gajim.interface.remove_avatar_files(jid_stripped, puny_nick) 
    1675                                         if self.vcard_shas.has_key(who): # Verify sha cached in mem 
    1676                                                 if avatar_sha != self.vcard_shas[who]: 
    1677                                                         # avatar has been updated 
    1678                                                         self.request_vcard(who, True) 
    1679                                         else: # Verify sha cached in hdd 
    1680                                                 cached_vcard = self.get_cached_vcard(who, True) 
    1681                                                 if cached_vcard and cached_vcard.has_key('PHOTO') and \ 
    1682                                                 cached_vcard['PHOTO'].has_key('SHA'): 
    1683                                                         cached_sha = cached_vcard['PHOTO']['SHA'] 
    1684                                                 else: 
    1685                                                         cached_sha = '' 
    1686                                                 if cached_sha != avatar_sha: 
    1687                                                         # avatar has been updated 
    1688                                                         # sha in mem will be updated later 
    1689                                                         self.request_vcard(who, True) 
    1690                                                 else: 
    1691                                                         # save sha in mem NOW 
    1692                                                         self.vcard_shas[who] = avatar_sha 
     1689                                        # if it's a gc presence, don't ask vcard here. We may ask it to 
     1690                                        # real jid in gui part. 
    16931691                                self.dispatch('GC_NOTIFY', (jid_stripped, show, status, resource, 
    16941692                                        prs.getRole(), prs.getAffiliation(), prs.getJid(), 
    16951693                                        prs.getReason(), prs.getActor(), prs.getStatusCode(), 
    1696                                         prs.getNewNick())) 
     1694                                        prs.getNewNick(), avatar_sha)) 
    16971695                        return 
    16981696