Empty addresses are valid, meaning the buddy own address.

For group (multicast) services publisher_address != service_address,
introduce the distinction in the API and in the avahi announcement.
This commit is contained in:
Marco Pesenti Gritti 2006-06-17 22:06:20 -04:00
parent 53f00b05b1
commit 6d7940949a
3 changed files with 20 additions and 7 deletions

View File

@ -1,4 +1,5 @@
import base64 import base64
import logging
import pygtk import pygtk
pygtk.require('2.0') pygtk.require('2.0')
@ -65,7 +66,8 @@ class Buddy(gobject.GObject):
True if the service was successfully added, and False if it was not.""" True if the service was successfully added, and False if it was not."""
if service.get_name() != self._nick_name: if service.get_name() != self._nick_name:
return False return False
if service.get_address() != self._address: if service.get_publisher_address() != self._address:
logging.error('Service publisher and buddy address doesnt match: %s %s' % (service.get_publisher_address(), self._address))
return False return False
if service.get_type() in self._services.keys(): if service.get_type() in self._services.keys():
return False return False

View File

@ -322,6 +322,9 @@ class PresenceService(gobject.GObject):
if resolve and not adv in self._resolve_queue: if resolve and not adv in self._resolve_queue:
self._resolve_queue.append(adv) self._resolve_queue.append(adv)
gobject.idle_add(self._resolve_service, adv) gobject.idle_add(self._resolve_service, adv)
else:
logging.debug("Do not resolve service '%s' of type '%s', we don't care about it." % (name, full_stype))
return False return False
def _service_appeared_cb_glue(self, interface, protocol, name, stype, domain, flags): def _service_appeared_cb_glue(self, interface, protocol, name, stype, domain, flags):
@ -507,17 +510,17 @@ class PresenceService(gobject.GObject):
real_stype = Service.compose_service_type(stype, uid) real_stype = Service.compose_service_type(stype, uid)
if address and type(address) != type(""): if address and type(address) != type(""):
raise ValueError("address must be a valid string.") raise ValueError("address must be a valid string.")
if not address: if address == None:
# Use random currently unassigned multicast address # Use random currently unassigned multicast address
address = "232.%d.%d.%d" % (random.randint(0, 254), random.randint(1, 254), address = "232.%d.%d.%d" % (random.randint(0, 254), random.randint(1, 254),
random.randint(1, 254)) random.randint(1, 254))
if port and (type(port) != type(1) or port <= 1024 or port >= 65535): if port and (type(port) != type(1) or port <= 1024 or port >= 65535):
raise ValueError("port must be a number between 1024 and 65535") raise ValueError("port must be a number between 1024 and 65535")
if not port: if not port:
# random port # # random port #
port = random.randint(5000, 65535) port = random.randint(5000, 65535)
logging.debug('Share activity %s, address %s, port %d' % (stype, address, port))
service = Service.Service(name=owner_nick, stype=real_stype, domain="local", service = Service.Service(name=owner_nick, stype=real_stype, domain="local",
address=address, port=port, properties=properties) address=address, port=port, properties=properties)
# Publish it to the world # Publish it to the world
@ -536,6 +539,7 @@ class PresenceService(gobject.GObject):
raise ValueError("invalid service port.") raise ValueError("invalid service port.")
rs_props = service.get_properties() rs_props = service.get_properties()
rs_domain = service.get_domain() rs_domain = service.get_domain()
rs_address = service.get_address()
if not rs_domain or not len(rs_domain): if not rs_domain or not len(rs_domain):
rs_domain = "" rs_domain = ""
logging.debug("registered service name '%s' type '%s' on port %d with args %s" % (rs_name, rs_stype, rs_port, rs_props)) logging.debug("registered service name '%s' type '%s' on port %d with args %s" % (rs_name, rs_stype, rs_port, rs_props))
@ -543,6 +547,8 @@ class PresenceService(gobject.GObject):
try: try:
group = dbus.Interface(self._bus.get_object(avahi.DBUS_NAME, self._server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP) group = dbus.Interface(self._bus.get_object(avahi.DBUS_NAME, self._server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP)
info = ["%s=%s" % (k, v) for k, v in rs_props.items()] info = ["%s=%s" % (k, v) for k, v in rs_props.items()]
if rs_address and len(rs_address):
info.append("address=%s" % (rs_address))
group.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, 0, rs_name, rs_stype, group.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, 0, rs_name, rs_stype,
rs_domain, "", # let Avahi figure the 'host' out rs_domain, "", # let Avahi figure the 'host' out
dbus.UInt16(rs_port), info,) dbus.UInt16(rs_port), info,)

View File

@ -92,12 +92,16 @@ class Service(object):
self._full_stype = full_stype self._full_stype = full_stype
self._activity_stype = short_stype self._activity_stype = short_stype
self._domain = domain self._domain = domain
self._address = None
self.set_address(address)
self._port = -1 self._port = -1
self.set_port(port) self.set_port(port)
self._properties = {} self._properties = {}
self.set_properties(properties) self.set_properties(properties)
self._publisher_address = address
self._address = None
if self._properties.has_key('address'):
self.set_address(self._properties['address'])
else:
self.set_address(address)
# Ensure that an ActivityUID tag, if given, matches # Ensure that an ActivityUID tag, if given, matches
# what we expect from the service type # what we expect from the service type
@ -166,6 +170,9 @@ class Service(object):
raise ValueError("must specify a valid port number.") raise ValueError("must specify a valid port number.")
self._port = port self._port = port
def get_publisher_address(self):
return self._publisher_address
def get_address(self): def get_address(self):
return self._address return self._address
@ -173,8 +180,6 @@ class Service(object):
if address is not None: if address is not None:
if type(address) != type("") and type(address) != type(u""): if type(address) != type("") and type(address) != type(u""):
raise ValueError("must specify a valid address.") raise ValueError("must specify a valid address.")
if not len(address):
raise ValueError("must specify a valid address.")
if address and type(address) == type(u""): if address and type(address) == type(u""):
address = address.encode() address = address.encode()
self._address = address self._address = address