diff options
Diffstat (limited to 'sugar/activity/activity.py')
-rw-r--r-- | sugar/activity/activity.py | 115 |
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) |