[gnome-games/sudoku-tube] Show reason of offer failure



commit f3ae1c5dc68b835b9d33eca6599385298b474564
Author: Zhang Sen <zh jesse gmail com>
Date:   Wed Aug 5 10:51:22 2009 +0800

    Show reason of offer failure

 gnome-sudoku/src/lib/main.py    |   16 ++++++++++++----
 gnome-sudoku/src/lib/tp_tube.py |   24 +++++++++++++++++++-----
 2 files changed, 31 insertions(+), 9 deletions(-)
---
diff --git a/gnome-sudoku/src/lib/main.py b/gnome-sudoku/src/lib/main.py
index 4ad61fe..a10d91b 100644
--- a/gnome-sudoku/src/lib/main.py
+++ b/gnome-sudoku/src/lib/main.py
@@ -68,6 +68,7 @@ class UI (gconf_wrapper.GConfWrapper):
         self._main_grid_vew = None
         self._history_manager = None
         self._tube = None
+        self._is_waiting_for_response = None # this should be extraced out
 
         self.setup_gui()
 
@@ -427,24 +428,31 @@ class UI (gconf_wrapper.GConfWrapper):
             self._tube_offer.connect("offer-failed", self._offer_fail_cb)
 
             self._tube_offer.execute()
+            self._is_waiting_for_response = True
             self._wait_dialog.run()
         else:
             logger.info("None selected")
 
     def _wait_dialog_response_cb(self, dialog, response_id):
-        if response_id in (gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT):
-            self._tube_offer.cancel()
+        if self._is_waiting_for_response:
+            if response_id in (gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT):
+                self._tube_offer.cancel()
         # else don't need to do anything
         self._wait_dialog.destroy()
 
-    def _offer_fail_cb(self, offer):
+    def _offer_fail_cb(self, offer, reason):
+        self._is_waiting_for_response = False
         # clear label and button
         vbox = self._wait_dialog.vbox
         vbox.remove(vbox.get_children()[0])
         action = self._wait_dialog.action_area
         action.remove(action.get_children()[0])
 
-        fail_label = gtk.Label(_("failed"))
+        text = '<span weight="bold" size="larger">Failed</span>\n%s' % reason
+        fail_label = gtk.Label(text)
+        fail_label.set_use_markup(True)
+        fail_label.set_line_wrap(True)
+        fail_label.set_selectable(True)
         fail_label.show()
         self._wait_dialog.vbox.pack_start(fail_label)
         self._wait_dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
diff --git a/gnome-sudoku/src/lib/tp_tube.py b/gnome-sudoku/src/lib/tp_tube.py
index aeaf6c9..e7d12c9 100644
--- a/gnome-sudoku/src/lib/tp_tube.py
+++ b/gnome-sudoku/src/lib/tp_tube.py
@@ -4,6 +4,7 @@ import logging
 
 import dbus
 import gobject
+from gettext import gettext as _
 from telepathy.client.channel import Channel
 from telepathy.interfaces import (
         CHANNEL_INTERFACE,
@@ -25,7 +26,8 @@ class TubeOffer(gobject.GObject):
     __gsignals__ = {
             "offer-succeeded": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
                 (object, object)),
-            "offer-failed": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
+            "offer-failed": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
+                (str,)),
             }
 
     def __init__(self, conn, handle, tube_service):
@@ -56,7 +58,7 @@ class TubeOffer(gobject.GObject):
         if self._tube_state == TUBE_CHANNEL_STATE_REMOTE_PENDING:
             # if tube is already open, it's not _offer_ failed (it's other
             # problems)
-            self.emit("offer-failed")
+            self.emit("offer-failed", _("Tube is closed by peer"))
 
     def cancel(self):
         if self._chan:
@@ -74,8 +76,10 @@ class TubeOffer(gobject.GObject):
         except dbus.exceptions.DBusException as excep:
             error_busname = telepathy.errors.NotImplemented().get_dbus_name()
             if excep.get_dbus_name() == error_busname:
-                logger.error("REQUESTS interface not implemented on %s" %
+                msg = ("REQUESTS interface not implemented on %s" %
                         self._conn.service_name)
+                logger.error(msg)
+                self.emit("offer-failed", msg)
                 return
             else:
                 raise
@@ -87,5 +91,15 @@ class TubeOffer(gobject.GObject):
                 'Closed', self._tube_closed_cb)
 
         logger.debug("offering tube")
-        self._address = self._chan[CHANNEL_TYPE_DBUS_TUBE].Offer({},
-                SOCKET_ACCESS_CONTROL_CREDENTIALS)
+        try:
+            self._address = self._chan[CHANNEL_TYPE_DBUS_TUBE].Offer({},
+                    SOCKET_ACCESS_CONTROL_CREDENTIALS)
+        except dbus.exceptions.DBusException as excep:
+            error_busname = telepathy.errors.NotAvailable().get_dbus_name()
+            if excep.get_dbus_name() == error_busname:
+                msg = str(excep)
+                logger.error(msg)
+                self.emit("offer-failed", msg)
+                return
+            else:
+                raise



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