From f5d3ebdc108980580569f32352cdb9c6de3a401c Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Mon, 02 Feb 2009 10:39:23 +0000 Subject: Rename files --- (limited to 'activity.py') diff --git a/activity.py b/activity.py new file mode 100644 index 0000000..b272763 --- /dev/null +++ b/activity.py @@ -0,0 +1,285 @@ +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +from sugar.activity import activity +from sugar.presence import presenceservice +from sugar.presence.tubeconn import TubeConnection +import telepathy +import telepathy.client +from dbus import Interface +from dbus.service import method, signal +from dbus.gobject_service import ExportedGObject +from gettext import gettext as _ + +from sugar.activity.activity import get_activity_root + +import montage +import lessons +import document +import char +import ground +import sound +from toolbars import * + +SERVICE = 'org.freedesktop.Telepathy.Tube.Connect' +IFACE = SERVICE +PATH = '/org/freedesktop/Telepathy/Tube/Connect' + +#TMPDIR = os.path.join(get_activity_root(), 'tmp') + +class CartoonBuilderActivity(activity.Activity): + def __init__(self, handle): + activity.Activity.__init__(self,handle) + + self.notebook = gtk.Notebook() + self.notebook.show() + self.notebook.props.show_border = False + self.notebook.props.show_tabs = False + # XXX do it after(possible) read_file() invoking + # have to rely on calling read_file() from map_cb in sugar-toolkit + self.notebook.connect_after('map', self._map_cb) + + self.montage = montage.View() + self.notebook.append_page(self.montage) + self.lessons = lessons.View() + self.lessons.show() + self.notebook.append_page(self.lessons) + + toolbox = activity.ActivityToolbox(self) + toolbox.show() + toolbox.connect('current-toolbar-changed', self._toolbar_changed_cb) + self.set_toolbox(toolbox) + + montage_bar = MontageToolbar() + montage_bar.show() + toolbox.add_toolbar(_('Montage'), montage_bar) + + lessons_bar = LessonsToolbar() + lessons_bar.show() + toolbox.add_toolbar(_('Lessons'), lessons_bar) + + toolbox.set_current_toolbar(1) + self.set_canvas(self.notebook) + + """ + # mesh stuff + self.pservice = presenceservice.get_instance() + owner = self.pservice.get_owner() + self.owner = owner + try: + name, path = self.pservice.get_preferred_connection() + self.tp_conn_name = name + self.tp_conn_path = path + self.conn = telepathy.client.Connection(name, path) + except TypeError: + pass + self.initiating = None + + #sharing stuff + self.game = None + self.connect('shared', self._shared_cb) + if self._shared_activity: + # we are joining the activity + self.connect('joined', self._joined_cb) + if self.get_shared(): + # oh, OK, we've already joined + self._joined_cb() + else: + # we are creating the activity + pass + """ + + def read_file(self, filepath): + document.load(filepath) + char.load() + ground.load() + sound.load() + + def write_file(self, filepath): + document.save(filepath) + + def _map_cb(self, widget): + self.montage.restore() + + def _toolbar_changed_cb(self, widget, index): + if index == 2: + self.notebook.set_current_page(1) + else: + self.notebook.set_current_page(0) + + + + + + + + def _shared_cb(self,activity): + self.initiating = True + self._setup() + id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube( + SERVICE, {}) + #self.app.export.set_label('Shared Me') + + def _joined_cb(self,activity): + if self.game is not None: + return + + if not self._shared_activity: + return + + #for buddy in self._shared_activity.get_joined_buddies(): + # self.buddies_panel.add_watcher(buddy) + + #logger.debug('Joined an existing Connect game') + #self.app.export.set_label('Joined You') + self.initiating = False + self._setup() + + #logger.debug('This is not my activity: waiting for a tube...') + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].ListTubes( + reply_handler=self._list_tubes_reply_cb, + error_handler=self._list_tubes_error_cb) + + def _setup(self): + if self._shared_activity is None: + return + + bus_name, conn_path, channel_paths = self._shared_activity.get_channels() + + # Work out what our room is called and whether we have Tubes already + room = None + tubes_chan = None + text_chan = None + for channel_path in channel_paths: + channel = telepathy.client.Channel(bus_name, channel_path) + htype, handle = channel.GetHandle() + if htype == telepathy.HANDLE_TYPE_ROOM: + #logger.debug('Found our room: it has handle#%d "%s"', + # handle, self.conn.InspectHandles(htype, [handle])[0]) + room = handle + ctype = channel.GetChannelType() + if ctype == telepathy.CHANNEL_TYPE_TUBES: + #logger.debug('Found our Tubes channel at %s', channel_path) + tubes_chan = channel + elif ctype == telepathy.CHANNEL_TYPE_TEXT: + #logger.debug('Found our Text channel at %s', channel_path) + text_chan = channel + + if room is None: + #logger.error("Presence service didn't create a room") + return + if text_chan is None: + #logger.error("Presence service didn't create a text channel") + return + + # Make sure we have a Tubes channel - PS doesn't yet provide one + if tubes_chan is None: + #logger.debug("Didn't find our Tubes channel, requesting one...") + tubes_chan = self.conn.request_channel(telepathy.CHANNEL_TYPE_TUBES, + telepathy.HANDLE_TYPE_ROOM, room, True) + + self.tubes_chan = tubes_chan + self.text_chan = text_chan + + tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal('NewTube', + self._new_tube_cb) + + def _list_tubes_reply_cb(self, tubes): + for tube_info in tubes: + self._new_tube_cb(*tube_info) + + def _list_tubes_error_cb(self, e): + #logger.error('ListTubes() failed: %s', e) + pass + + def _new_tube_cb(self, id, initiator, type, service, params, state): + #logger.debug('New tube: ID=%d initator=%d type=%d service=%s ' + # 'params=%r state=%d', id, initiator, type, service, + # params, state) + + if (self.game is None and type == telepathy.TUBE_TYPE_DBUS and + service == SERVICE): + if state == telepathy.TUBE_STATE_LOCAL_PENDING: + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].AcceptDBusTube(id) + + tube_conn = TubeConnection(self.conn, + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES], + id, group_iface=self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]) + self.game = ConnectGame(tube_conn, self.initiating, self) + +class ConnectGame(ExportedGObject): + def __init__(self,tube, is_initiator, activity): + super(ConnectGame,self).__init__(tube,PATH) + self.tube = tube + self.is_initiator = is_initiator + self.entered = False + self.activity = activity + + self.ordered_bus_names=[] + self.tube.watch_participants(self.participant_change_cb) + + def participant_change_cb(self, added, removed): + if not self.entered: + if self.is_initiator: + self.add_hello_handler() + else: + self.Hello() + self.entered = True + + @signal(dbus_interface=IFACE,signature='') + def Hello(self): + """Request that this player's Welcome method is called to bring it + up to date with the game state. + """ + + @method(dbus_interface=IFACE, in_signature='s', out_signature='') + def Welcome(self, sdata): + #sdata is the zip file contents + #self.activity.app.lessonplans.set_label('got data to restore') + self.activity.app.restore(str(sdata)) + + def add_hello_handler(self): + self.tube.add_signal_receiver(self.hello_cb, 'Hello', IFACE, + path=PATH, sender_keyword='sender') + + def hello_cb(self, sender=None): + self.tube.get_object(sender, PATH).Welcome(self.activity.app.getsdata(),dbus_interface=IFACE) + +""" + def getsdata(self): + #self.lessonplans.set_label('getting sdata') + # THE BELOW SHOULD WORK BUT DOESN'T + #zf = StringIO.StringIO() + #self.savetozip(zf) + #zf.seek(0) + #sdata = zf.read() + #zf.close() + # END OF STUFF THAT DOESN'T WORK + sdd = {} + tmpbgpath = os.path.join(TMPDIR,'back.png') + self.bgpixbuf.save(tmpbgpath,'png') + sdd['pngdata'] = file(tmpbgpath).read() + os.remove(tmpbgpath) + sdd['fgpixbufpaths'] = self.fgpixbufpaths + #sdd['fgpixbufs'] = [] + #count = 1 + #for pixbuf in self.fgpixbufs: + # filename = '%02d.png' % count + # filepath = os.path.join(TMPDIR,filename) + # pixbuf.save(filepath,'png') + # sdd['fgpixbufs'].append(file(filepath).read()) + # os.remove(filepath) + # count += 1 + return pickle.dumps(sdd) +""" -- cgit v0.9.1