Changeset 7247
- Timestamp:
- 10/15/06 04:09:23 (2 years ago)
- Location:
- trunk/src
- Files:
-
- 2 modified
-
common/zeroconf/zeroconf.py (modified) (15 diffs)
-
vcard.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/common/zeroconf/zeroconf.py
r7237 r7247 32 32 disconnected_CB, error_CB, name, host, port): 33 33 self.avahi = None 34 self.server = None35 34 self.domain = None # specific domain to browse 36 35 self.stype = '_presence._tcp' … … 50 49 self.service_browser = None 51 50 self.domain_browser = None 51 self.bus = None 52 52 self.server = None 53 53 self.contacts = {} # all current local contacts with data … … 75 75 def new_service_callback(self, interface, protocol, name, stype, domain, flags): 76 76 gajim.log.debug('Found service %s in domain %s on %i.%i.' % (name, domain, interface, protocol)) 77 #if not self.connected:78 #return77 if not self.connected: 78 return 79 79 80 80 # synchronous resolving … … 85 85 def remove_service_callback(self, interface, protocol, name, stype, domain, flags): 86 86 gajim.log.debug('Service %s in domain %s on %i.%i disappeared.' % (name, domain, interface, protocol)) 87 #if not self.connected:88 #return87 if not self.connected: 88 return 89 89 if name != self.name: 90 90 for key in self.contacts.keys(): … … 111 111 if domain != "local": 112 112 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 123 129 124 130 def service_resolved_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): 125 131 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))) 127 134 if not self.connected: 128 135 return … … 166 173 if str(err) == 'Local name collision': 167 174 alternative_name = self.server.GetAlternativeServiceName(self.username) 175 self.disconnect() 168 176 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)) 171 179 self.disconnect() 172 180 173 181 def server_state_changed_callback(self, state, error): 174 print 'server.state %s' % state175 182 if state == self.avahi.SERVER_RUNNING: 176 183 self.create_service() 177 184 elif state == self.avahi.SERVER_COLLISION: 178 185 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') 181 189 182 190 def entrygroup_state_changed_callback(self, state, error): … … 185 193 self.service_add_fail_callback('Local name collision') 186 194 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)') 188 197 189 198 # make zeroconf-valid names … … 194 203 return 'away' 195 204 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) 196 215 197 216 def create_service(self): … … 221 240 self.txt = txt 222 241 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 224 244 self.entrygroup.Commit(reply_handler=self.service_committed_callback, 225 245 error_handler=self.entrygroup_commit_error_CB) … … 248 268 self.entrygroup.Reset() 249 269 self.entrygroup.Free() 270 # .Free() has mem leaks 271 obj = self.entrygroup._obj 272 obj._bus = None 273 self.entrygroup._obj = None 250 274 self.entrygroup = None 251 275 self.announced = False 276 252 277 return True 253 278 else: … … 262 287 if connect != "": 263 288 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: 267 291 self.disconnected_CB() 268 except Exception, e:269 print e270 292 else: 271 293 gajim.log.debug('We are connected to avahi-daemon') 272 273 274 294 275 295 # connect to dbus 276 296 def connect_dbus(self): 277 297 try: 278 import avahi, gobject, dbus 279 self.avahi = avahi 298 import dbus 280 299 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: 285 303 return True 286 304 try: … … 289 307 "NameOwnerChanged", "org.freedesktop.DBus", 290 308 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: 291 331 self.server = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ 292 332 self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) … … 303 343 def connect(self): 304 344 self.name = self.username + '@' + self.host # service name 305 if not self.connect_ dbus():345 if not self.connect_avahi(): 306 346 return False 307 347 … … 329 369 if self.service_browser: 330 370 self.service_browser.Free() 371 self.service_browser._obj._bus = None 372 self.service_browser._obj = None 331 373 if self.domain_browser: 332 374 self.domain_browser.Free() 375 self.domain_browser._obj._bus = None 376 self.domain_browser._obj = None 333 377 self.remove_announce() 378 self.server._obj._bus = None 379 self.server._obj = None 380 self.server = None 334 381 self.service_browser = None 335 382 self.domain_browser = None 336 self.server = None337 383 338 384 # refresh txt data of all contacts manually (no callback available) 339 385 def resolve_all(self): 386 if not self.connected: 387 return 340 388 for val in self.contacts.values(): 341 389 self.server.ResolveService(int(val[C_INTERFACE]), int(val[C_PROTOCOL]), val[C_BARE_NAME], \ … … 353 401 self.txt['status'] = self.replace_show(show) 354 402 355 txt = self.avahi .dict_to_txt_array(self.txt)403 txt = self.avahi_txt() 356 404 if self.connected and self.entrygroup: 357 405 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 478 478 def fill_personal_page(self): 479 479 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] = '' 480 483 self.xml.get_widget('first_name_label').set_text(contact['txt_dict']['1st']) 481 484 self.xml.get_widget('last_name_label').set_text(contact['txt_dict']['last'])
