diff options
author | Dan Williams <dcbw@redhat.com> | 2006-06-09 21:23:42 (GMT) |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2006-06-09 21:23:42 (GMT) |
commit | d931dca5799ee1e88ce327bf28424f9739f4ad87 (patch) | |
tree | 5ffd9e4588616c4ceb88cf24dd385c4e1921a408 /sugar/presence/Buddy.py | |
parent | c4b112366ce91ddedbb3a7a1c6caa7543b0256c8 (diff) |
Main bits of presence service refactor
Diffstat (limited to 'sugar/presence/Buddy.py')
-rw-r--r-- | sugar/presence/Buddy.py | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/sugar/presence/Buddy.py b/sugar/presence/Buddy.py new file mode 100644 index 0000000..5201a04 --- /dev/null +++ b/sugar/presence/Buddy.py @@ -0,0 +1,127 @@ +import pwd +import os + +import pygtk +pygtk.require('2.0') +import gtk + + +#from sugar import env + +PRESENCE_SERVICE_TYPE = "_presence_olpc._tcp" + + +class Buddy(object): + """Represents another person on the network and keeps track of the + activities and resources they make available for sharing.""" + def __init__(self, service): + self._services = {} + self._nick_name = service.get_name() + self._address = service.get_address() + self._valid = False + self._icon = None + self.add_service(service) + + def add_service(self, service): + """Adds a new service to this buddy's service list.""" + if service.get_type() in self._services.keys(): + return + self._services.keys[service.get_type()] = service + # FIXME: send out signal for new service found + if service.get_type() == PRESENCE_SERVICE_TYPE: + # A buddy isn't valid until its official presence + # service has been found and resolved + self._valid = True + + def remove_service(self, service): + """Remove a service from a buddy; ie, the activity was closed + or the buddy went away.""" + if service.get_type() in self._services.keys(): + del self._services[service.get_type()] + if service.get_type() == PRESENCE_SERVICE_TYPE: + self._valid = False + + def is_valid(self): + """Return whether the buddy is valid or not. A buddy is + not valid until its official presence service has been found + and successfully resolved.""" + return self._valid + + def get_icon_pixbuf(self): + if self._icon: + pbl = gtk.gdk.PixbufLoader() + pbl.write(self._icon) + pbl.close() + return pbl.get_pixbuf() + else: + return None + + def get_icon(self): + """Return the buddies icon, if any.""" + return self._icon + + def get_address(self): + return self._address + + def add_service(self, service): + if service.get_name() != self._nick_name: + return False + if service.get_address() != self._address: + return False + if self._services.has_key(service.get_type()): + return False + self._services[service.get_type()] = service + + def remove_service(self, stype): + if self._services.has_key(stype): + del self._services[stype] + + def get_service(self, stype): + if self._services.has_key(stype): + return self._services[stype] + return None + + def get_nick_name(self): + return self._nick_name + + def set_icon(self, icon): + """Can only set icon for other buddies. The Owner + takes care of setting it's own icon.""" + self._icon = icon + # FIXME: do callbacks for icon-changed + + +class Owner(Buddy): + """Class representing the owner of this machine/instance.""" + def __init__(self): + nick = env.get_nick_name() + if not nick: + nick = pwd.getpwuid(os.getuid())[0] + if not nick or not len(nick): + nick = "n00b" + + Buddy.__init__(self) + + 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.' + + for fname in os.listdir(user_dir): + if not fname.startswith("buddy-icon."): + continue + fd = open(os.path.join(user_dir, fname), "r") + self._icon = fd.read() + fd.close() + break + + def set_icon(self, icon): + """Can only set icon in constructor for now.""" + pass + + def add_service(self, service): + """Do nothing here, since all services we need to know about + are registered with us by our group.""" + pass |