Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorDan Williams <dcbw@localhost.localdomain>2006-07-26 00:04:15 (GMT)
committer Dan Williams <dcbw@localhost.localdomain>2006-07-26 00:04:15 (GMT)
commit164add907d263a39c8b4b90b0ac0b262445de7fd (patch)
tree0873015efe6ebd0c50985711ada07c215b552a9c /shell
parente5065263a9e9a8e2295d46effab39ce35d7a1349 (diff)
Make shareActivity work
Diffstat (limited to 'shell')
-rw-r--r--shell/ActivitiesModel.py11
-rw-r--r--shell/Owner.py21
-rw-r--r--shell/PresenceService/Activity.py36
-rw-r--r--shell/PresenceService/Buddy.py8
-rw-r--r--shell/PresenceService/PresenceService.py35
-rw-r--r--shell/PresenceService/Service.py4
-rwxr-xr-xshell/Shell.py3
7 files changed, 65 insertions, 53 deletions
diff --git a/shell/ActivitiesModel.py b/shell/ActivitiesModel.py
index 078e0d3..99612f6 100644
--- a/shell/ActivitiesModel.py
+++ b/shell/ActivitiesModel.py
@@ -9,13 +9,13 @@ class ActivityInfo:
self._service = service
def get_id(self):
- activity_id = self._service.get_one_property('activity_id')
+ activity_id = self._service.get_activity_id()
def get_type(self):
return self._service.get_type()
def get_title(self):
- escaped_title = self._service.get_one_property('Title')
+ escaped_title = self._service.get_published_value('Title')
title = xml.sax.saxutils.unescape(escaped_title)
return title
@@ -46,7 +46,8 @@ class ActivitiesModel(gobject.GObject):
def __iter__(self):
return self._activities.__iter__()
- def _on_activity_announced_cb(self, pservice, service, buddy):
+ def _on_activity_announced_cb(self, pservice, activity):
# FIXME We should not hard code activity types here
- if service.get_type() == "_web_olpc._udp":
- self.add_activity(service)
+ services = activity.get_services_of_type("_web_olpc._udp")
+ if len(services) > 0:
+ self.add_activity(services[0])
diff --git a/shell/Owner.py b/shell/Owner.py
index 450fba8..d411eac 100644
--- a/shell/Owner.py
+++ b/shell/Owner.py
@@ -13,13 +13,14 @@ class ShellOwner(object):
runs in the shell and serves up the buddy icon and other stuff. It's the
server portion of the Owner, paired with the client portion in Buddy.py."""
def __init__(self):
- nick = env.get_nick_name()
+ self._nick = env.get_nick_name()
user_dir = env.get_user_dir()
- if not os.path.exists(user_dir):
- try:
- os.makedirs(user_dir)
- except OSError:
- print "Could not create user directory."
+
+ try:
+ os.makedirs(user_dir)
+ except OSError, exc:
+ if exc[0] != 17: # file exists
+ print "Could not create user directory %s: (%d) %s" % (user_dir, exc[0], exc[1])
self._icon = None
for fname in os.listdir(user_dir):
@@ -30,10 +31,12 @@ class ShellOwner(object):
fd.close()
break
- # Create and announce our presence
self._pservice = PresenceService.PresenceService()
- self._service = self._pservice.register_service(nick, PRESENCE_SERVICE_TYPE)
- print "Owner '%s' using port %d" % (nick, self._service.get_port())
+
+ def announce(self):
+ # Create and announce our presence
+ self._service = self._pservice.register_service(self._nick, PRESENCE_SERVICE_TYPE)
+ print "Owner '%s' using port %d" % (self._nick, self._service.get_port())
self._icon_stream = Stream.Stream.new_from_service(self._service)
self._icon_stream.register_reader_handler(self._handle_buddy_icon_request, "get_buddy_icon")
diff --git a/shell/PresenceService/Activity.py b/shell/PresenceService/Activity.py
index f1e6f7c..eda302d 100644
--- a/shell/PresenceService/Activity.py
+++ b/shell/PresenceService/Activity.py
@@ -1,5 +1,9 @@
import dbus
+PRESENCE_SERVICE_TYPE = "_presence_olpc._tcp"
+ACTIVITY_DBUS_OBJECT_PATH = "/org/laptop/Presence/Activities/"
+ACTIVITY_DBUS_INTERFACE = "org.laptop.Presence.Activity"
+
class NotFoundError(Exception):
pass
@@ -10,7 +14,7 @@ class ActivityDBusHelper(dbus.service.Object):
self._object_path = object_path
dbus.service.Object.__init__(self, bus_name, self._object_path)
- @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ @dbus.service.method(ACTIVITY_DBUS_INTERFACE,
in_signature="s", out_signature="ao")
def getServicesOfType(self, stype):
services = self._parent.get_services_of_type(stype)
@@ -21,7 +25,7 @@ class ActivityDBusHelper(dbus.service.Object):
ret.append(serv.object_path())
return ret
- @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ @dbus.service.method(ACTIVITY_DBUS_INTERFACE,
in_signature="", out_signature="ao")
def getServices(self):
services = self._parent.get_services()
@@ -32,12 +36,12 @@ class ActivityDBusHelper(dbus.service.Object):
ret.append(serv.object_path())
return ret
- @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ @dbus.service.method(ACTIVITY_DBUS_INTERFACE,
in_signature="", out_signature="s")
def getId(self):
return self._parent.get_id()
- @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ @dbus.service.method(ACTIVITY_DBUS_INTERFACE,
in_signature="", out_signature="ao")
def getJoinedBuddies(self):
buddies = self._parent.get_joined_buddies()
@@ -48,40 +52,41 @@ class ActivityDBusHelper(dbus.service.Object):
ret.append(buddy.object_path())
return ret
- @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ @dbus.service.signal(ACTIVITY_DBUS_INTERFACE,
signature="o")
def ServiceAppeared(self, object_path):
pass
- @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ @dbus.service.signal(ACTIVITY_DBUS_INTERFACE,
signature="o")
def ServiceDisappeared(self, object_path):
pass
- @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ @dbus.service.signal(ACTIVITY_DBUS_INTERFACE,
signature="o")
def BuddyJoined(self, object_path):
pass
- @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ @dbus.service.signal(ACTIVITY_DBUS_INTERFACE,
signature="o")
def BuddyLeft(self, object_path):
pass
class Activity(object):
- def __init__(self, bus_name, object_id, activity_id):
- if not activity_id:
+ def __init__(self, bus_name, object_id, initial_service):
+ if not initial_service.get_activity_id():
raise ValueError("Service must have a valid Activity ID")
- self._activity_id = activity_id
+ self._activity_id = initial_service.get_activity_id()
self._buddies = []
self._services = {} # service type -> list of Services
- self._services[service.get_type()] = []
self._object_id = object_id
self._object_path = "/org/laptop/Presence/Activities/%d" % self._object_id
self._dbus_helper = ActivityDBusHelper(self, bus_name, self._object_path)
+
+ self.add_service(initial_service)
def object_path(self):
return dbus.ObjectPath(self._object_path)
@@ -99,8 +104,11 @@ class Activity(object):
def get_joined_buddies(self):
buddies = []
- for serv in self._services.values():
- buddies.append(serv.get_owner())
+ for serv_list in self._services.values():
+ for serv in serv_list:
+ owner = serv.get_owner()
+ if not owner in buddies:
+ buddies.append(owner)
return buddies
def add_service(self, service):
diff --git a/shell/PresenceService/Buddy.py b/shell/PresenceService/Buddy.py
index af16eb6..8715280 100644
--- a/shell/PresenceService/Buddy.py
+++ b/shell/PresenceService/Buddy.py
@@ -71,7 +71,7 @@ class BuddyDBusHelper(dbus.service.Object):
in_signature="", out_signature="a{sv}")
def getProperties(self):
props = {}
- props['name'] = self._parent.get_nick_name()
+ props['name'] = self._parent.get_name()
props['ip4_address'] = self._parent.get_address()
props['owner'] = self._parent.is_owner()
return props
@@ -149,6 +149,7 @@ class Buddy(object):
stype = service.get_type()
if stype in self._services.keys():
return False
+ logging.debug("Buddy %s added service type %s id %s" % (self._nick_name, service.get_type(), service.get_activity_id()))
self._services[stype] = service
service.set_owner(self)
@@ -168,6 +169,7 @@ class Buddy(object):
if activity in self._activities.values():
raise RuntimeError("Tried to add activity twice")
found = False
+ logging.debug("Buddy %s looking for actid %s" % (self._nick_name, activity.get_id()))
for serv in self._services.values():
if serv.get_activity_id() == activity.get_id():
found = True
@@ -239,7 +241,7 @@ class Buddy(object):
def get_address(self):
return self._address
- def get_nick_name(self):
+ def get_name(self):
return self._nick_name
def _set_icon(self, icon):
@@ -310,7 +312,7 @@ class BuddyTestCase(unittest.TestCase):
self._DEF_ADDRESS, self._DEF_PORT)
objid = _next_objid()
buddy = Buddy(self._bus_name, objid, service)
- assert buddy.get_nick_name() == self._DEF_NAME, "buddy name wasn't correct after init."
+ assert buddy.get_name() == self._DEF_NAME, "buddy name wasn't correct after init."
assert buddy.get_address() == self._DEF_ADDRESS, "buddy address wasn't correct after init."
assert buddy.object_path() == BUDDY_DBUS_OBJECT_PATH + str(objid)
diff --git a/shell/PresenceService/PresenceService.py b/shell/PresenceService/PresenceService.py
index a3af824..81aa357 100644
--- a/shell/PresenceService/PresenceService.py
+++ b/shell/PresenceService/PresenceService.py
@@ -1,6 +1,7 @@
import avahi, dbus, dbus.glib, gobject
import Buddy
import Service
+import Activity
import random
import logging
from sugar import env
@@ -178,13 +179,15 @@ class PresenceServiceDBusHelper(dbus.service.Object):
@dbus.service.method(_PRESENCE_DBUS_INTERFACE,
in_signature="ssa{ss}sis", out_signature="o")
- def registerService(self, name, stype, properties, address, port, domain):
- service = self._parent.register_service(name, stype, properties, address,
+ def shareActivity(self, activity_id, stype, properties, address, port, domain):
+ service = self._parent.share_activity(activity_id, stype, properties, address,
port, domain)
return service.object_path()
- def shareActivity(self, activity_id, stype, properties, address, port, domain):
- service = self._parent.share_activity(name, stype, properties, address,
+ @dbus.service.method(_PRESENCE_DBUS_INTERFACE,
+ in_signature="ssa{ss}sis", out_signature="o")
+ def registerService(self, name, stype, properties, address, port, domain):
+ service = self._parent.register_service(name, stype, properties, address,
port, domain)
return service.object_path()
@@ -440,7 +443,7 @@ class PresenceService(object):
self._local_addrs[interface] = addr
# Decompose service name if we can
- (actid, buddy_name) = Service._decompose_service_name(full_name)
+ (actid, buddy_name) = Service.decompose_service_name(full_name)
# If we care about the service right now, resolve it
resolve = False
@@ -475,7 +478,7 @@ class PresenceService(object):
return False
# Decompose service name if we can
- (actid, buddy_name) = Service._decompose_service_name(full_name)
+ (actid, buddy_name) = Service.decompose_service_name(full_name)
# Remove the service from the buddy
try:
@@ -546,34 +549,28 @@ class PresenceService(object):
def _new_domain_cb_glue(self, interface, protocol, domain, flags=0):
gobject.idle_add(self._new_domain_cb, interface, protocol, domain, flags)
- def share_activity(self, activity_id, stype, properties=None, address=None, port=None, domain=u"local"):
+ def share_activity(self, activity_id, stype, properties=None, address=None, port=-1, domain=u"local"):
"""Convenience function to share an activity with other buddies."""
if not util.validate_activity_id(activity_id):
raise ValueError("invalid activity id")
- owner_nick = self._owner.get_nick_name()
- real_name = Service.compose_service_name(owner_nick, actid)
+ owner_nick = self._owner.get_name()
+ real_name = Service.compose_service_name(owner_nick, activity_id)
if address and type(address) != type(u""):
raise ValueError("address must be a unicode string.")
if address == None:
# Use random currently unassigned multicast address
address = "232.%d.%d.%d" % (random.randint(0, 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 port != -1 and (type(port) != type(1) or port <= 1024 or port >= 65535):
raise ValueError("port must be a number between 1024 and 65535")
- if not port:
- # random port #
- port = random.randint(5000, 65535)
-
- # Mark the activity as shared
- if stype == activity.get_default_type():
- activity.set_shared()
logging.debug('Share activity %s, type %s, address %s, port %d, properties %s' % (activity_id, stype, address, port, properties))
return self.register_service(real_name, stype, properties, address, port, domain)
- def register_service(self, name, stype, properties={}, address=None, port=None, domain=u"local"):
+ def register_service(self, name, stype, properties={}, address=None, port=-1, domain=u"local"):
"""Register a new service, advertising it to other Buddies on the network."""
- if self.get_owner() and name != self.get_owner().get_nick_name():
+ (actid, person_name) = Service.decompose_service_name(name)
+ if self.get_owner() and person_name != self.get_owner().get_name():
raise RuntimeError("Tried to register a service that didn't have Owner nick as the service name!")
if not domain or not len(domain):
domain = u"local"
diff --git a/shell/PresenceService/Service.py b/shell/PresenceService/Service.py
index 77cd826..6ddc69d 100644
--- a/shell/PresenceService/Service.py
+++ b/shell/PresenceService/Service.py
@@ -34,7 +34,7 @@ def compose_service_name(name, activity_id):
composed = "%s [%s]" % (name, activity_id)
return composed
-def _decompose_service_name(name):
+def decompose_service_name(name):
"""Break a service name into the name and activity ID, if we can."""
if type(name) != type(u""):
raise ValueError("name must be a valid unicode string.")
@@ -127,7 +127,7 @@ class Service(object):
if domain and domain != "local":
raise ValueError("must use the 'local' domain (for now).")
- (actid, real_name) = _decompose_service_name(name)
+ (actid, real_name) = decompose_service_name(name)
self._name = real_name
self._full_name = name
self._stype = stype
diff --git a/shell/Shell.py b/shell/Shell.py
index a7ecea3..1cf1ba5 100755
--- a/shell/Shell.py
+++ b/shell/Shell.py
@@ -56,7 +56,8 @@ class Shell:
bus_name = dbus.service.BusName('com.redhat.Sugar.Shell', bus=session_bus)
ShellDbusService(self, bus_name)
- #self._owner = ShellOwner()
+ self._owner = ShellOwner()
+ self._owner.announce()
self._registry = ActivityRegistry()
self._registry.scan_directory(env.get_activities_dir())