[gnome-games/sudoku-tube] Can send/receive messages
- From: Zhang Sen <zhangsen src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-games/sudoku-tube] Can send/receive messages
- Date: Sun, 28 Jun 2009 09:28:21 +0000 (UTC)
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]