Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/memosonoactivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'memosonoactivity.py')
-rwxr-xr-xmemosonoactivity.py290
1 files changed, 0 insertions, 290 deletions
diff --git a/memosonoactivity.py b/memosonoactivity.py
deleted file mode 100755
index 48783c9..0000000
--- a/memosonoactivity.py
+++ /dev/null
@@ -1,290 +0,0 @@
-#! /usr/bin/env python
-#
-# Copyright (C) 2006, 2007 Simon Schampijer
-#
-# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-
-from gettext import gettext as _
-
-import gobject
-import gtk
-import os
-import logging
-import telepathy
-import telepathy.client
-import hippo
-
-from sugar.activity.activity import Activity
-from sugar.activity.activity import ActivityToolbox
-from sugar.presence import presenceservice
-
-from tubeconn import TubeConnection
-from playview import PlayView
-from buddiespanel import BuddiesPanel
-from infopanel import InfoPanel
-from controller import Controller
-
-
-_logger = logging.getLogger('activity')
-
-class MemosonoActivity(Activity):
- def __init__(self, handle):
- Activity.__init__(self, handle)
-
- _logger.debug('Starting Memosono activity...')
-
- self.set_title(_('Memsosono Activity'))
-
- w = self.get_screen().get_width()
- h = self.get_screen().get_height()
- ### FIXME: do better grid calculation
- if w <= 1024:
- self.pv = PlayView(600, 600, 32)
- else:
- self.pv = PlayView(800, 800, 32)
-
- self.buddies_panel = BuddiesPanel()
-
- self.info_panel = InfoPanel()
-
- vbox = hippo.CanvasBox(spacing=4,
- orientation=hippo.ORIENTATION_VERTICAL)
-
- hbox = hippo.CanvasBox(spacing=4,
- orientation=hippo.ORIENTATION_HORIZONTAL)
-
- hbox.append(self.buddies_panel)
- hbox.append(self.pv, hippo.PACK_EXPAND)
-
- vbox.append(hbox, hippo.PACK_EXPAND)
- vbox.append(self.info_panel, hippo.PACK_END)
-
- canvas = hippo.Canvas()
- canvas.set_root(vbox)
- self.set_canvas(canvas)
- self.show_all()
-
- toolbox = ActivityToolbox(self)
- self.set_toolbox(toolbox)
- toolbox.show()
-
- self.pservice = presenceservice.get_instance()
-
- name, path = self.pservice.get_preferred_connection()
- self.tp_conn_name = name
- self.tp_conn_path = path
- self.conn = telepathy.client.Connection(name, path)
- self.initiating = None
-
- self.ctrl = None
-
- toolbox = ActivityToolbox(self)
- self.set_toolbox(toolbox)
- toolbox.show()
-
- # connect to the in/out events of the memosono activity
- self.connect('focus_in_event', self._focus_in)
- self.connect('focus_out_event', self._focus_out)
- self.connect('destroy', self._cleanup_cb)
-
- self.info_panel.show('To play, share!')
-
- self.connect('shared', self._shared_cb)
-
- owner = self.pservice.get_owner()
- self.owner = owner
-
- if self._shared_activity:
- # we are joining the activity
- self.buddies_panel.add_watcher(owner)
- self.connect('joined', self._joined_cb)
- self._shared_activity.connect('buddy-joined', self._buddy_joined_cb)
- self._shared_activity.connect('buddy-left', self._buddy_left_cb)
- if self.get_shared():
- # oh, OK, we've already joined
- self._joined_cb()
- else:
- # we are creating the activity
- self.buddies_panel.add_player(owner)
-
- def _get_buddy(self, cs_handle):
- """Get a Buddy from a channel specific handle."""
- _logger.debug('Trying to find owner of handle %u...', cs_handle)
- group = self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]
- my_csh = group.GetSelfHandle()
- _logger.debug('My handle in that group is %u', my_csh)
- if my_csh == cs_handle:
- handle = self.conn.GetSelfHandle()
- _logger.debug('CS handle %u belongs to me, %u', cs_handle, handle)
- elif group.GetGroupFlags() & telepathy.CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES:
- handle = group.GetHandleOwners([cs_handle])[0]
- _logger.debug('CS handle %u belongs to %u', cs_handle, handle)
- else:
- handle = cs_handle
- _logger.debug('non-CS handle %u belongs to itself', handle)
-
- # XXX: deal with failure to get the handle owner
- assert handle != 0
-
- # XXX: we're assuming that we have Buddy objects for all contacts -
- # this might break when the server becomes scalable.
- return self.pservice.get_buddy_by_telepathy_handle(self.tp_conn_name,
- self.tp_conn_path, handle)
-
- def _shared_cb(self, activity):
- _logger.debug('My Memosono activity was shared')
- self.initiating = True
- self._setup()
-
- for buddy in self._shared_activity.get_joined_buddies():
- self.buddies_panel.add_watcher(buddy)
-
- self._shared_activity.connect('buddy-joined', self._buddy_joined_cb)
- self._shared_activity.connect('buddy-left', self._buddy_left_cb)
-
- _logger.debug('This is my activity: making a tube...')
- id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferTube(
- telepathy.TUBE_TYPE_DBUS, 'org.fredektop.Telepathy.Tube.Memosono', {})
- _logger.debug('Tube address: %s', self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].GetDBusServerAddress(id))
- self.info_panel.show('Waiting for another player to join')
-
- # FIXME: presence service should be tubes-aware and give us more help
- # with this
- def _setup(self):
- if self._shared_activity is None:
- _logger.error('Failed to share or join activity')
- 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)
-
- def _joined_cb(self, activity):
- if self.ctrl 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 Memosono game')
- self.info_panel.show('Joined a game. Waiting for my turn...')
- 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 _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.ctrl is None and type == telepathy.TUBE_TYPE_DBUS and
- service == 'org.fredektop.Telepathy.Tube.Memosono'):
- if state == telepathy.TUBE_STATE_LOCAL_PENDING:
- self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].AcceptTube(id)
-
- tube_conn = TubeConnection(self.conn,
- self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES],
- id, group_iface=self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP])
- self.ctrl = Controller(tube_conn, self.pv, self.initiating,
- self.buddies_panel, self.info_panel, self.owner,
- self._get_buddy, self)
-
- def _buddy_joined_cb(self, activity, buddy):
- _logger.debug('buddy joined')
- self.buddies_panel.add_watcher(buddy)
-
- def _buddy_left_cb(self, activity, buddy):
- _logger.debug('buddy left')
- self.buddies_panel.remove_watcher(buddy)
-
- def write_file(self, file_path):
- """Store game state in Journal.
-
- Handling the Journal is provided by Activity - we only need
- to define this method.
- """
- _logger.debug(" Write game state. ")
- f = open(file_path, 'w')
- try:
- f.write('erikos won the game')
- finally:
- f.close()
-
- def _focus_in(self, event, data=None):
- if self.ctrl != None:
- self.ctrl.cs.start()
- _logger.debug(" Memosono is visible: start csound server. ")
-
- def _focus_out(self, event, data=None):
- if self.ctrl != None:
- self.ctrl.cs.start()
- _logger.debug(" Memosono is invisible: pause csound server. ")
-
- def _cleanup_cb(self, data=None):
- if self.ctrl != None:
- self.ctrl.cs.quit()
- _logger.debug(" Memosono closes: close csound server. ")
-