Changeset 7247

Show
Ignore:
Timestamp:
10/15/06 04:09:23 (2 years ago)
Author:
dkirov
Message:

enable utf-8 strings in txt records

Location:
trunk/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/common/zeroconf/zeroconf.py

    r7237 r7247  
    3232                disconnected_CB, error_CB, name, host, port): 
    3333                self.avahi = None 
    34                 self.server = None 
    3534                self.domain = None   # specific domain to browse 
    3635                self.stype = '_presence._tcp'    
     
    5049                self.service_browser = None 
    5150                self.domain_browser = None 
     51                self.bus = None 
    5252                self.server = None 
    5353                self.contacts = {}    # all current local contacts with data 
     
    7575        def new_service_callback(self, interface, protocol, name, stype, domain, flags): 
    7676                gajim.log.debug('Found service %s in domain %s on %i.%i.' % (name, domain, interface, protocol)) 
    77                 # if not self.connected: 
    78                 #       return 
     77                if not self.connected: 
     78                        return 
    7979                 
    8080                # synchronous resolving 
     
    8585        def remove_service_callback(self, interface, protocol, name, stype, domain, flags): 
    8686                gajim.log.debug('Service %s in domain %s on %i.%i disappeared.' % (name, domain, interface, protocol)) 
    87                 # if not self.connected: 
    88                 #       return 
     87                if not self.connected: 
     88                        return 
    8989                if name != self.name: 
    9090                        for key in self.contacts.keys(): 
     
    111111                if domain != "local": 
    112112                        self.browse_domain(interface, protocol, domain) 
    113  
    114         def txt_array_to_dict(self,txt_array): 
    115                 items = {} 
    116  
    117                 for byte_array in txt_array: 
    118                         # 'str' is used for string type in python 
    119                         value = self.avahi.byte_array_to_string(byte_array) 
    120                         poseq = value.find('=') 
    121                         items[value[:poseq]] = value[poseq+1:] 
    122                 return items 
     113         
     114        def txt_array_to_dict(self, txt_array): 
     115                txt_dict = {} 
     116                for els in txt_array: 
     117                        key, val = '', None 
     118                        for c in els: 
     119                                c = chr(c) 
     120                                if val is None: 
     121                                        if c == '=': 
     122                                                val = '' 
     123                                        else: 
     124                                         key += c 
     125                                else: 
     126                                        val += c 
     127                        txt_dict[key] = val.decode('utf-8') 
     128                return txt_dict 
    123129         
    124130        def service_resolved_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags):       
    125131                gajim.log.debug('Service data for service %s in domain %s on %i.%i:' % (name, domain, interface, protocol)) 
    126                 gajim.log.debug('Host %s (%s), port %i, TXT data: %s' % (host, address, port, self.avahi.txt_array_to_string_array(txt))) 
     132                gajim.log.debug('Host %s (%s), port %i, TXT data: %s' % (host, address, port,  
     133                        self.txt_array_to_dict(txt))) 
    127134                if not self.connected: 
    128135                        return 
     
    166173                if str(err) == 'Local name collision': 
    167174                        alternative_name = self.server.GetAlternativeServiceName(self.username) 
     175                        self.disconnect() 
    168176                        self.name_conflictCB(alternative_name) 
    169                 else: 
    170                         self.error_CB(_('Error while adding service. %s') % str(err)) 
     177                        return 
     178                self.error_CB(_('Error while adding service. %s') % str(err)) 
    171179                self.disconnect() 
    172180 
    173181        def server_state_changed_callback(self, state, error): 
    174                 print 'server.state %s' % state 
    175182                if state == self.avahi.SERVER_RUNNING: 
    176183                        self.create_service() 
    177184                elif state == self.avahi.SERVER_COLLISION: 
    178185                        self.entrygroup.Reset() 
    179                 elif state == self.avahi.CLIENT_FAILURE:           # TODO: add error handling (avahi daemon dies...?) 
    180                         print 'CLIENT FAILURE' 
     186                elif state == self.avahi.CLIENT_FAILURE: 
     187                        # does it ever go here? 
     188                        gajim.log.debug('CLIENT FAILURE') 
    181189 
    182190        def entrygroup_state_changed_callback(self, state, error): 
     
    185193                        self.service_add_fail_callback('Local name collision') 
    186194                elif state == self.avahi.ENTRY_GROUP_FAILURE: 
    187                         print 'zeroconf.py: ENTRY_GROUP_FAILURE reached(that should not happen)' 
     195                        gajim.log.debug('zeroconf.py: ENTRY_GROUP_FAILURE reached(that' 
     196                                ' should not happen)') 
    188197 
    189198        # make zeroconf-valid names 
     
    194203                        return 'away' 
    195204                return show 
     205 
     206        def avahi_txt(self): 
     207                utf8_dict = {} 
     208                for key in self.txt: 
     209                        val = self.txt[key] 
     210                        if isinstance(val, unicode): 
     211                                utf8_dict[key] = val.encode('utf-8') 
     212                        else: 
     213                                utf8_dict[key] = val 
     214                return self.avahi.dict_to_txt_array(utf8_dict) 
    196215 
    197216        def create_service(self): 
     
    221240                        self.txt = txt 
    222241                        gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) 
    223                         self.entrygroup.AddService(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', '', self.port, self.avahi.dict_to_txt_array(self.txt), reply_handler=self.service_added_callback, error_handler=self.service_add_fail_callback) 
     242                        self.entrygroup.AddService(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', '', self.port, self.avahi_txt(), reply_handler=self.service_added_callback, error_handler=self.service_add_fail_callback) 
     243                         
    224244                        self.entrygroup.Commit(reply_handler=self.service_committed_callback,  
    225245                                error_handler=self.entrygroup_commit_error_CB) 
     
    248268                                self.entrygroup.Reset() 
    249269                                self.entrygroup.Free() 
     270                                # .Free() has mem leaks 
     271                                obj = self.entrygroup._obj 
     272                                obj._bus = None 
     273                                self.entrygroup._obj = None 
    250274                                self.entrygroup = None 
    251275                                self.announced = False 
     276                                 
    252277                                return True 
    253278                        else: 
     
    262287                if connect != "": 
    263288                        gajim.log.debug('Lost connection to avahi-daemon') 
    264                         try: 
    265                                 self.connected = False 
    266                                 self.disconnect() 
     289                        self.disconnect() 
     290                        if self.disconnected_CB: 
    267291                                self.disconnected_CB() 
    268                         except Exception, e: 
    269                                 print e 
    270292                else: 
    271293                        gajim.log.debug('We are connected to avahi-daemon') 
    272                          
    273                          
    274                          
     294 
    275295        # connect to dbus 
    276296        def connect_dbus(self): 
    277297                try: 
    278                         import avahi, gobject, dbus 
    279                         self.avahi = avahi 
     298                        import dbus 
    280299                except ImportError: 
    281                         gajim.log.debug('Error: python-avahi and python-dbus need to be installed. No zeroconf support.') 
    282                         return False 
    283  
    284                 if self.server: 
     300                        gajim.log.debug('Error: python-dbus needs to be installed. No zeroconf support.') 
     301                        return False 
     302                if self.bus: 
    285303                        return True 
    286304                try: 
     
    289307                                "NameOwnerChanged", "org.freedesktop.DBus",  
    290308                                arg0="org.freedesktop.Avahi") 
     309                except Exception, e: 
     310                        # System bus is not present 
     311                        self.bus = None 
     312                        gajim.log.debug(str(e)) 
     313                        return False 
     314                else: 
     315                        return True 
     316 
     317        # connect to avahi 
     318        def connect_avahi(self): 
     319                if not self.connect_dbus(): 
     320                        return False 
     321                try: 
     322                        import avahi 
     323                        self.avahi = avahi 
     324                except ImportError: 
     325                        gajim.log.debug('Error: python-avahi needs to be installed. No zeroconf support.') 
     326                        return False 
     327 
     328                if self.server: 
     329                        return True 
     330                try: 
    291331                        self.server = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ 
    292332                        self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) 
     
    303343        def connect(self): 
    304344                self.name = self.username + '@' + self.host # service name 
    305                 if not self.connect_dbus(): 
     345                if not self.connect_avahi(): 
    306346                        return False 
    307347                 
     
    329369                        if self.service_browser: 
    330370                                self.service_browser.Free() 
     371                                self.service_browser._obj._bus = None 
     372                                self.service_browser._obj = None 
    331373                        if self.domain_browser: 
    332374                                self.domain_browser.Free() 
     375                                self.domain_browser._obj._bus = None 
     376                                self.domain_browser._obj = None 
    333377                        self.remove_announce() 
     378                        self.server._obj._bus = None 
     379                        self.server._obj = None 
     380                self.server = None 
    334381                self.service_browser = None 
    335382                self.domain_browser = None 
    336                 self.server = None 
    337383 
    338384        # refresh txt data of all contacts manually (no callback available) 
    339385        def resolve_all(self): 
     386                if not self.connected: 
     387                        return 
    340388                for val in self.contacts.values(): 
    341389                        self.server.ResolveService(int(val[C_INTERFACE]), int(val[C_PROTOCOL]), val[C_BARE_NAME], \ 
     
    353401                        self.txt['status'] = self.replace_show(show) 
    354402 
    355                 txt = self.avahi.dict_to_txt_array(self.txt) 
     403                txt = self.avahi_txt() 
    356404                if self.connected and self.entrygroup: 
    357405                        self.entrygroup.UpdateServiceTxt(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype,'', txt, reply_handler=self.service_updated_callback, error_handler=self.error_callback) 
  • trunk/src/vcard.py

    r7183 r7247  
    478478        def fill_personal_page(self): 
    479479                contact = gajim.connections[gajim.ZEROCONF_ACC_NAME].roster.getItem(self.contact.jid) 
     480                for key in ('1st', 'last', 'jid', 'email'): 
     481                        if not contact['txt_dict'].has_key(key): 
     482                                contact['txt_dict'][key] = '' 
    480483                self.xml.get_widget('first_name_label').set_text(contact['txt_dict']['1st']) 
    481484                self.xml.get_widget('last_name_label').set_text(contact['txt_dict']['last'])