diff options
author | Dan Williams <dcbw@localhost.localdomain> | 2006-07-23 04:56:40 (GMT) |
---|---|---|
committer | Dan Williams <dcbw@localhost.localdomain> | 2006-07-23 04:56:40 (GMT) |
commit | b63e78a174d1db625edfd20ff6ae3fa6a412bde9 (patch) | |
tree | 56dc8cd06a95c4a72b19f4135c6c6d2d112ba570 /sugar | |
parent | 1c35f8d92ca82525c82ede9b543fe603798ee817 (diff) |
Make the PresenceService stuff start to work
Diffstat (limited to 'sugar')
-rw-r--r-- | sugar/p2p/Stream.py | 34 | ||||
-rw-r--r-- | sugar/presence/PresenceService.py | 6 | ||||
-rw-r--r-- | sugar/presence/Service.py | 32 |
3 files changed, 52 insertions, 20 deletions
diff --git a/sugar/p2p/Stream.py b/sugar/p2p/Stream.py index 6a0df2d..9350123 100644 --- a/sugar/p2p/Stream.py +++ b/sugar/p2p/Stream.py @@ -8,6 +8,18 @@ import network from MostlyReliablePipe import MostlyReliablePipe from sugar.presence import Service +def is_multicast_address(address): + """Simple numerical check for whether an IP4 address + is in the range for multicast addresses or not.""" + if not address: + return False + if address[3] != '.': + return False + first = int(float(address[:3])) + if first >= 224 and first <= 239: + return True + return False + class Stream(object): def __init__(self, service): if not service.get_port(): @@ -19,7 +31,7 @@ class Stream(object): self._callback = None def new_from_service(service, start_reader=True): - if service.is_multicast_service(): + if is_multicast_address(service.get_address()): return MulticastStream(service) else: return UnicastStream(service, start_reader) @@ -75,28 +87,14 @@ class UnicastStream(Stream): if start_reader: self.start_reader() - def start_reader(self, update_service_port=True): + def start_reader(self): """Start the stream's reader, which for UnicastStream objects is and XMLRPC server. If there's a port conflict with some other service, the reader will try to find another port to use instead. Returns the port number used for the reader.""" # Set up the reader - started = False - tries = 10 - self._reader = None - while not started and tries > 0: - try: - self._reader = network.GlibXMLRPCServer(("", self._reader_port)) - self._reader.register_function(self._message, "message") - if update_service_port: - self._service.set_port(self._reader_port) # Update the service's port - started = True - except(socket.error): - self._reader_port = random.randint(self._reader_port + 1, 65500) - tries = tries - 1 - if self._reader is None: - print 'Could not start stream reader.' - return self._reader_port + self._reader = network.GlibXMLRPCServer(("", self._reader_port)) + self._reader.register_function(self._message, "message") def _message(self, message): """Called by the XMLRPC server when network data arrives.""" diff --git a/sugar/presence/PresenceService.py b/sugar/presence/PresenceService.py index ac00d1f..5626a7c 100644 --- a/sugar/presence/PresenceService.py +++ b/sugar/presence/PresenceService.py @@ -48,7 +48,7 @@ class PresenceService(gobject.GObject): def __init__(self): gobject.GObject.__init__(self) - self._obcache = ObjectCache() + self._objcache = ObjectCache() self._bus = dbus.SessionBus() self._ps = dbus.Interface(self._bus.get_object(self._PRESENCE_SERVICE, self._PRESENCE_OBJECT_PATH), self._PRESENCE_DBUS_INTERFACE) @@ -174,3 +174,7 @@ class PresenceService(gobject.GObject): return None return self._new_object(buddy_op) + def registerService(self, name, stype, properties={"":""}, address="", port=-1, domain=u"local"): + serv_op = self._ps.registerService(name, stype, properties, address, port, domain) + return self._new_object(serv_op) + diff --git a/sugar/presence/Service.py b/sugar/presence/Service.py index f5e6eae..f798f6e 100644 --- a/sugar/presence/Service.py +++ b/sugar/presence/Service.py @@ -14,12 +14,42 @@ class Service(gobject.GObject): self._ps_del_object = del_obj_cb sobj = bus.get_object(self._PRESENCE_SERVICE, object_path) self._service = dbus.Interface(sobj, self._SERVICE_DBUS_INTERFACE) + self._props = self._service.getProperties() def object_path(self): return self._object_path def getProperties(self): - return self._service.getProperties() + return self._props def getPublishedValue(self, key): value = self._service.getPublishedValue(key) + + def get_name(self): + return self._props['name'] + + def get_type(self): + return self._props['type'] + + def get_domain(self): + return self._props['domain'] + + def get_address(self): + if self._props.has_key('address'): + return self._props['address'] + return None + + def get_activity_id(self): + if self._props.has_key('activityId'): + return self._props['activityId'] + return None + + def get_port(self): + if self._props.has_key('port'): + return self._props['port'] + return None + + def get_source_address(self): + if self._props.has_key('sourceAddress'): + return self._props['sourceAddress'] + return None |