[gnome-games/sudoku-tube] Block the initiator until the receiver decides



commit 7babc621836157357289ed8daeccafc10cdef7aa
Author: Zhang Sen <zh jesse gmail com>
Date:   Fri Aug 14 19:02:51 2009 +0800

    Block the initiator until the receiver decides

 gnome-sudoku/src/lib/main.py         |   34 +--------------------------
 gnome-sudoku/src/lib/tube_handler.py |   41 +++++++++++++++++++++++++++++----
 2 files changed, 38 insertions(+), 37 deletions(-)
---
diff --git a/gnome-sudoku/src/lib/main.py b/gnome-sudoku/src/lib/main.py
index 09e23a4..fb5764b 100644
--- a/gnome-sudoku/src/lib/main.py
+++ b/gnome-sudoku/src/lib/main.py
@@ -79,7 +79,7 @@ class SudokuGame(gconf_wrapper.GConfWrapper):
         self.setup_gui()
 
         self.tube_handler = tube_handler.TubeHandler(self._tube_service,
-                tube_received_cb=self._tube_incoming_cb)
+                tube_received_cb=self._process_accepted_tube)
 
         self.timer = timer.ActiveTimer(self.w)
         self.won = False
@@ -516,38 +516,8 @@ class SudokuGame(gconf_wrapper.GConfWrapper):
         self._wait_dialog.vbox.pack_start(fail_label)
         self._wait_dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
 
-    def _tube_incoming_cb(self, bus, tube, params):
-        """Called when we receive a tube"""
-
-        def reply_cb(dialog, response_id):
-            if response_id == gtk.RESPONSE_ACCEPT:
-                self._process_accepted_tube(bus, tube, puzzle)
-            else:
-                print 'do nothing; reply to initiator'
-
-        try:
-            puzzle = params['puzzle']
-        except KeyError:
-            logger.error("expected parameter missing from %s" % params)
-            return # do nothing
-
-        puzzle = str(puzzle)
-        logger.debug('got offer: %s' % puzzle)
-
-        dialog = gtk.Dialog("New game offer",
-                self.w,
-                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT,
-                    gtk.STOCK_NO, gtk.RESPONSE_REJECT))
-        label = gtk.Label("<get-contact> wants to play with you")
-        label.show()
-        dialog.vbox.pack_start(label)
-        dialog.connect("response", reply_cb)
-        dialog.run()
-        dialog.destroy()
-
     def _process_accepted_tube(self, bus, tube, puzzle):
-        """User has decided to accept the tube
+        """User has accepted the tube
         """
 
         assert self._is_initiator is None
diff --git a/gnome-sudoku/src/lib/tube_handler.py b/gnome-sudoku/src/lib/tube_handler.py
index 54683fb..d04c141 100644
--- a/gnome-sudoku/src/lib/tube_handler.py
+++ b/gnome-sudoku/src/lib/tube_handler.py
@@ -4,6 +4,7 @@ import logging
 
 import dbus
 import dbus.service
+import gtk
 from dbus import PROPERTIES_IFACE
 from dbus.mainloop.glib import DBusGMainLoop
 
@@ -13,6 +14,7 @@ from telepathy.constants import (
         TUBE_STATE_OPEN,
         SOCKET_ACCESS_CONTROL_CREDENTIALS)
 from telepathy.interfaces import (
+        CHANNEL_INTERFACE,
         CHANNEL_INTERFACE_TUBE,
         CHANNEL_TYPE_DBUS_TUBE)
 
@@ -61,15 +63,44 @@ class TubeHandler(dbus.service.Object):
         self._tube_chan[CHANNEL_INTERFACE_TUBE].connect_to_signal(
                 'TubeChannelStateChanged', self._tube_state_changed_cb)
 
-        self._address = self._tube_chan[CHANNEL_TYPE_DBUS_TUBE].Accept(
-                SOCKET_ACCESS_CONTROL_CREDENTIALS)
+        params = self._tube_chan[PROPERTIES_IFACE].Get(
+                CHANNEL_INTERFACE_TUBE, 'Parameters')
+        self._process_incoming_tube(params)
 
     def _tube_state_changed_cb(self, state):
         if state == TUBE_STATE_OPEN:
             logger.debug("Tube state changed ->open")
             bus = dbus.connection.Connection(self._address)
-            params = self._tube_chan[PROPERTIES_IFACE].Get(
-                    CHANNEL_INTERFACE_TUBE, 'Parameters')
-            self._tube_received_cb(bus, self._tube_chan, params)
+            self._tube_received_cb(bus, self._tube_chan, self._puzzle)
         else:
             logger.debug("Tube state changed ->%s" % state)
+
+    def _process_incoming_tube(self, params):
+        def reply_cb(dialog, response_id):
+            if response_id == gtk.RESPONSE_ACCEPT:
+                logger.debug("accept tube")
+                self._address = self._tube_chan[CHANNEL_TYPE_DBUS_TUBE].Accept(
+                        SOCKET_ACCESS_CONTROL_CREDENTIALS)
+            else:
+                logger.debug("deny tube offer")
+                self._tube_chan[CHANNEL_INTERFACE].Close()
+        try:
+            puzzle = params['puzzle']
+        except KeyError:
+            logger.error("expected parameter missing from %s" % params)
+            return # do nothing
+
+        self._puzzle = str(puzzle)
+        logger.debug('got offer: %s' % self._puzzle)
+
+        dialog = gtk.Dialog("New game offer",
+                parent=None,
+                flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+                buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT,
+                    gtk.STOCK_NO, gtk.RESPONSE_REJECT))
+        label = gtk.Label("<get-contact> wants to play with you")
+        label.show()
+        dialog.vbox.pack_start(label)
+        dialog.connect("response", reply_cb)
+        dialog.run()
+        dialog.destroy()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]