Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/activity/activity.py
diff options
context:
space:
mode:
Diffstat (limited to 'sugar/activity/activity.py')
-rw-r--r--sugar/activity/activity.py115
1 files changed, 115 insertions, 0 deletions
diff --git a/sugar/activity/activity.py b/sugar/activity/activity.py
new file mode 100644
index 0000000..befcc31
--- /dev/null
+++ b/sugar/activity/activity.py
@@ -0,0 +1,115 @@
+# Copyright (C) 2006, Red Hat, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+import logging
+
+import gtk
+
+from sugar.presence import PresenceService
+from sugar.activity.activityservice import ActivityService
+from sugar import env
+
+class Activity(gtk.Window):
+ """Base Activity class that all other Activities derive from."""
+
+ def __init__(self, activity_handle):
+ gtk.Window.__init__(self)
+
+ self.connect('destroy', self._destroy_cb)
+
+ self._shared = False
+ self._activity_id = None
+ self._service = None
+ self._pservice = PresenceService.get_instance()
+
+ self.realize()
+
+ group = gtk.Window()
+ group.realize()
+ self.window.set_group(group.window)
+
+ self._bus = ActivityService(self)
+
+ def start(self, activity_id):
+ """Start the activity."""
+ if self._activity_id != None:
+ logging.warning('The activity has been already started.')
+ return
+
+ self._activity_id = activity_id
+
+ self.present()
+
+ def get_type(self):
+ """Gets the activity type."""
+ return env.get_bundle_service_name()
+
+ def get_default_type(self):
+ """Gets the type of the default activity network service"""
+ return env.get_bundle_default_type()
+
+ def get_shared(self):
+ """Returns TRUE if the activity is shared on the mesh."""
+ return self._shared
+
+ def get_id(self):
+ """Get the unique activity identifier."""
+ return self._activity_id
+
+ def join(self, activity_ps):
+ """Join an activity shared on the network."""
+ if self._activity_id != None:
+ logging.warning('The activity has been already started.')
+ return
+ self._activity_id = activity_ps.get_id()
+
+ self._shared = True
+
+ # Publish the default service, it's a copy of
+ # one of those we found on the network.
+ default_type = self.get_default_type()
+ services = activity_ps.get_services_of_type(default_type)
+ if len(services) > 0:
+ service = services[0]
+ addr = service.get_address()
+ port = service.get_port()
+ properties = service.get_published_values()
+ self._service = self._pservice.share_activity(
+ self, default_type, properties, addr, port)
+ else:
+ logging.error('Cannot join the activity')
+
+ self.present()
+
+ def share(self):
+ """Share the activity on the network."""
+ logging.debug('Share activity %s on the network.' % self.get_id())
+
+ default_type = self.get_default_type()
+ self._service = self._pservice.share_activity(self, default_type)
+ self._shared = True
+
+ def execute(self, command, args):
+ """Execute the given command with args"""
+ return False
+
+ def _destroy_cb(self, window):
+ if self._bus:
+ del self._bus
+ self._bus = None
+ if self._service:
+ self._pservice.unregister_service(self._service)