[gnome-games/sudoku-tube] Can send/receive messages



commit b0d563ec70435d7b6c83d922faa6e9113e39fb8c
Author: Zhang Sen <zh jesse gmail com>
Date:   Sun Jun 28 17:26:25 2009 +0800

    Can send/receive messages

 gnome-sudoku/src/lib/Makefile.am     |    1 +
 gnome-sudoku/src/lib/main.py         |   15 ++++++++++++---
 gnome-sudoku/src/lib/networking.py   |   20 ++++++++++++++++++++
 gnome-sudoku/src/lib/tp_tube.py      |   28 +++++++++++++++-------------
 gnome-sudoku/src/lib/tube_handler.py |    2 +-
 5 files changed, 49 insertions(+), 17 deletions(-)
---
diff --git a/gnome-sudoku/src/lib/Makefile.am b/gnome-sudoku/src/lib/Makefile.am
index e69cd56..aa1aaa6 100644
--- a/gnome-sudoku/src/lib/Makefile.am
+++ b/gnome-sudoku/src/lib/Makefile.am
@@ -16,6 +16,7 @@ gnomesudoku_PYTHON = \
 	gnome_sudoku.py	\
 	gsudoku.py	\
 	main.py 	\
+	networking.py	\
 	number_box.py 	\
 	pausable.py	\
 	printing.py	\
diff --git a/gnome-sudoku/src/lib/main.py b/gnome-sudoku/src/lib/main.py
index 08664f5..624bf65 100644
--- a/gnome-sudoku/src/lib/main.py
+++ b/gnome-sudoku/src/lib/main.py
@@ -26,6 +26,7 @@ from defaults import (APPNAME, APPNAME_SHORT, AUTHORS, COPYRIGHT, DESCRIPTION,
 from gtk_goodies import gconf_wrapper, Undo, dialog_extras
 
 import contact_selector
+import networking
 import tp_tube
 import tube_handler
 
@@ -458,8 +459,10 @@ class UI (gconf_wrapper.GConfWrapper):
                 self.gconf[k] = v
         self.player = self.gconf['player']
 
-    def _tube_received_cb(self, *args):
-        print args
+    def _tube_received_cb(self, tube_conn):
+        game_server = tube_conn.get_object(object_path="/Game")
+        print "got reply from server: %s" % \
+                game_server.test("hi there from client")
 
     def new_cb (self, *args):
         if self._close_current_game():
@@ -472,10 +475,16 @@ class UI (gconf_wrapper.GConfWrapper):
         if choice:
             logger.info("selected: %s\nconnection: %s\nhandle: %d" % (
                     choice[2].alias, choice[0].service_name, choice[1]))
-            tp_tube.offer_tube(choice[0], choice[1], self.tube_service)
+            tp_tube.offer_tube(choice[0], choice[1], self.tube_service,
+                    self._tube_open_cb)
         else:
             logger.info("None selected")
 
+    def _tube_open_cb(self, bus, obj_path):
+        """Called when the offered tube is open"""
+        server = networking.GameServer(bus, obj_path, self)
+        logger.info("server created")
+
     def _close_current_game (self):
         """Close current running game
 
diff --git a/gnome-sudoku/src/lib/networking.py b/gnome-sudoku/src/lib/networking.py
new file mode 100644
index 0000000..5e44935
--- /dev/null
+++ b/gnome-sudoku/src/lib/networking.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+
+import logging
+
+import dbus
+
+logger = logging.getLogger("main.server")
+
+class GameServer(dbus.service.Object):
+    """Expose the game on dbus, so the others can listen to it"""
+
+    server_interface = "org.gnome.Sudoku.server"
+    def __init__(self, bus, obj_path, game):
+        super(GameServer, self).__init__(bus, obj_path)
+
+    @dbus.service.method(dbus_interface=server_interface,
+            in_signature='s', out_signature='s')
+    def test(self, message):
+        logger.info("get msg from client: %s" % message)
+        return "hello from server"
diff --git a/gnome-sudoku/src/lib/tp_tube.py b/gnome-sudoku/src/lib/tp_tube.py
index 53dc344..2994819 100644
--- a/gnome-sudoku/src/lib/tp_tube.py
+++ b/gnome-sudoku/src/lib/tp_tube.py
@@ -2,6 +2,7 @@
 
 import logging
 
+import dbus
 from telepathy.client.channel import Channel
 from telepathy.interfaces import (
         CHANNEL_INTERFACE,
@@ -17,22 +18,22 @@ from telepathy.constants import (
 logger = logging.getLogger("main.tp_tube")
 
 
-def tube_state_changed_cb(state):
-    if state == TUBE_CHANNEL_STATE_OPEN:
-        logger.info("Tube state changed ->open")
-        print "export a logic (something like a server), so the receiver can \
-                connect to it"
-    elif state == TUBE_CHANNEL_STATE_REMOTE_PENDING:
-        logger.info("Tube state changed ->remote-pending")
-    else:
-        logger.info("Tube state changed ->%s" % state)
-
-
 def tube_closed_cb():
     logger.info("tube closed")
 
 
-def offer_tube(conn, handle, tube_service):
+def offer_tube(conn, handle, tube_service, tube_open_cb):
+    def tube_state_changed_cb(state):
+        if state == TUBE_CHANNEL_STATE_OPEN:
+            logger.info("Tube state changed ->open")
+            tube_conn = dbus.connection.Connection(address)
+            tube_open_cb(bus=tube_conn, obj_path="/Game")
+        elif state == TUBE_CHANNEL_STATE_REMOTE_PENDING:
+            logger.info("Tube state changed ->remote-pending")
+        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({
@@ -47,4 +48,5 @@ def offer_tube(conn, handle, tube_service):
     chan[CHANNEL_INTERFACE].connect_to_signal('Closed', tube_closed_cb)
 
     logger.debug("offering tube")
-    chan[CHANNEL_TYPE_DBUS_TUBE].Offer({}, SOCKET_ACCESS_CONTROL_CREDENTIALS)
+    address = chan[CHANNEL_TYPE_DBUS_TUBE].Offer({},
+            SOCKET_ACCESS_CONTROL_CREDENTIALS)
diff --git a/gnome-sudoku/src/lib/tube_handler.py b/gnome-sudoku/src/lib/tube_handler.py
index 754f133..d5850bf 100644
--- a/gnome-sudoku/src/lib/tube_handler.py
+++ b/gnome-sudoku/src/lib/tube_handler.py
@@ -63,6 +63,6 @@ class TubeHandler(dbus.service.Object):
             logger.info("Tube state changed ->open")
             tube_conn = dbus.connection.Connection(self.address)
 
-            self._tube_received_cb(self.address, tube_conn)
+            self._tube_received_cb(tube_conn)
         else:
             logger.info("Tube state changed ->%s" % state)



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