Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/presence/Buddy.py
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2006-06-09 21:23:42 (GMT)
committer Dan Williams <dcbw@redhat.com>2006-06-09 21:23:42 (GMT)
commitd931dca5799ee1e88ce327bf28424f9739f4ad87 (patch)
tree5ffd9e4588616c4ceb88cf24dd385c4e1921a408 /sugar/presence/Buddy.py
parentc4b112366ce91ddedbb3a7a1c6caa7543b0256c8 (diff)
Main bits of presence service refactor
Diffstat (limited to 'sugar/presence/Buddy.py')
-rw-r--r--sugar/presence/Buddy.py127
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