[gnome-games/sudoku-tube] Check if interface is available befor use it



commit 784b839c8ff157d5c6d3385cec7f8c5c180d40aa
Author: Zhang Sen <zh jesse gmail com>
Date:   Thu Jul 2 18:15:28 2009 +0800

    Check if interface is available befor use it
    
    * CONNECTION_INTERFACE_SIMPLE_PRESENCE not available in tp-idle
    * CONNECTION_INTERFACE_REQUESTS available but not implemented in tp-salut

 gnome-sudoku/src/lib/contact_selector.py |   20 +++++++++++++-------
 gnome-sudoku/src/lib/tp_tube.py          |   18 +++++++++++++-----
 2 files changed, 26 insertions(+), 12 deletions(-)
---
diff --git a/gnome-sudoku/src/lib/contact_selector.py b/gnome-sudoku/src/lib/contact_selector.py
index 54489a4..175681b 100644
--- a/gnome-sudoku/src/lib/contact_selector.py
+++ b/gnome-sudoku/src/lib/contact_selector.py
@@ -61,14 +61,20 @@ class ContactList:
         self._conn.call_when_ready(self._connection_ready_cb)
 
     def _connection_ready_cb(self, conn):
-        """Request Channel from conn when it's ready"""
-        assert self._conn == conn
-        logger.debug("Connection is ready: %s" % self._conn.service_name)
+        logger.info("Connection is ready: %s" % conn.service_name)
         # TODO react to connection status change
-        # TODO is this needed?
-        #   if CONNECTION_INTERFACE_SIMPLE_PRESENCE in conn.interfaces:
-        self._conn[CONNECTION_INTERFACE_SIMPLE_PRESENCE].connect_to_signal(
-                "PresencesChanged", self._contact_presence_changed_cb)
+
+        if CONNECTION_INTERFACE_SIMPLE_PRESENCE not in conn:
+            logger.warning("SIMPLE_PRESENCE interface not available on %s" %
+                    conn.service_name)
+            return
+        if CONNECTION_INTERFACE_REQUESTS not in conn:
+            logger.warning("REQUESTS interface not available on %s" %
+                    conn.service_name)
+            return
+
+        conn[CONNECTION_INTERFACE_SIMPLE_PRESENCE].connect_to_signal(
+            "PresencesChanged", self._contact_presence_changed_cb)
         self._ensure_channel()
 
     def _ensure_channel(self):
diff --git a/gnome-sudoku/src/lib/tp_tube.py b/gnome-sudoku/src/lib/tp_tube.py
index 2994819..5061bb2 100644
--- a/gnome-sudoku/src/lib/tp_tube.py
+++ b/gnome-sudoku/src/lib/tp_tube.py
@@ -14,6 +14,7 @@ from telepathy.constants import (
         SOCKET_ACCESS_CONTROL_CREDENTIALS,
         TUBE_CHANNEL_STATE_OPEN,
         TUBE_CHANNEL_STATE_REMOTE_PENDING)
+from telepathy.errors import NotImplemented
 
 logger = logging.getLogger("main.tp_tube")
 
@@ -33,14 +34,21 @@ def offer_tube(conn, handle, tube_service, tube_open_cb):
         else:
             logger.info("Tube state changed ->%s" % state)
 
-
-    # TODO: check if contact supports our tube
-    logger.debug("create tube channel")
-    path, props = conn[CONNECTION_INTERFACE_REQUESTS].CreateChannel({
+    logger.debug("creating tube channel")
+    request = {
         CHANNEL_INTERFACE + ".ChannelType": CHANNEL_TYPE_DBUS_TUBE,
         CHANNEL_INTERFACE + ".TargetHandleType": HANDLE_TYPE_CONTACT,
         CHANNEL_INTERFACE + ".TargetHandle": handle,
-        CHANNEL_TYPE_DBUS_TUBE + ".ServiceName": tube_service})
+        CHANNEL_TYPE_DBUS_TUBE + ".ServiceName": tube_service}
+    try:
+        path, props = conn[CONNECTION_INTERFACE_REQUESTS].CreateChannel(request)
+    except dbus.exceptions.DBusException as excep:
+        if excep.get_dbus_name() == NotImplemented().get_dbus_name():
+            logger.error("REQUESTS interface not implemented on %s" %
+                    conn.service_name)
+            return
+        else:
+            raise
 
     chan = Channel(conn.service_name, path)
     chan[CHANNEL_INTERFACE_TUBE].connect_to_signal('TubeChannelStateChanged',



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