~alexlauni/tictactoe/trunk

« back to all changes in this revision

Viewing changes to tictactoe/tubehandler.py

  • Committer: Alex Launi
  • Date: 2009-09-25 22:45:52 UTC
  • Revision ID: alex.launi@gmail.com-20090925224552-v2g2569t7tobjvos
Make tictactoe resizable and tabs->spaces

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
from telepathy.client.conn import Connection
30
30
from telepathy.client.channel import Channel
31
31
from telepathy.constants import (
32
 
                TUBE_STATE_OPEN,
33
 
                SOCKET_ACCESS_CONTROL_CREDENTIALS)
 
32
        TUBE_STATE_OPEN,
 
33
        SOCKET_ACCESS_CONTROL_CREDENTIALS)
34
34
from telepathy.interfaces import (
35
 
                CHANNEL_INTERFACE,
36
 
                CHANNEL_INTERFACE_TUBE,
37
 
                CHANNEL_TYPE_DBUS_TUBE,
38
 
                CONN_INTERFACE_ALIASING)
 
35
        CHANNEL_INTERFACE,
 
36
        CHANNEL_INTERFACE_TUBE,
 
37
        CHANNEL_TYPE_DBUS_TUBE,
 
38
        CONN_INTERFACE_ALIASING)
39
39
 
40
40
import gettext
41
41
 
45
45
DBusGMainLoop(set_as_default=True)
46
46
 
47
47
def _get_contact_alias(conn, handle):
48
 
        return conn[CONN_INTERFACE_ALIASING].RequestAliases([handle])[0]
 
48
    return conn[CONN_INTERFACE_ALIASING].RequestAliases([handle])[0]
49
49
 
50
50
def _sanitize_service_name(service_name):
51
 
        return service_name.replace('.', '_')
 
51
    return service_name.replace('.', '_')
52
52
 
53
53
def _build_bus_name(service_name):
54
 
        return "org.gnome.Empathy.DTubeHandler.%s" % _sanitize_service_name(service_name)
 
54
    return "org.gnome.Empathy.DTubeHandler.%s" % _sanitize_service_name(service_name)
55
55
 
56
56
def _build_object_path(bus_name):
57
 
        return '/' + bus_name.replace('.', '/')
 
57
    return '/' + bus_name.replace('.', '/')
58
58
 
59
59
class TubeHandler(dbus.service.Object):
60
 
        """Listen to coming tube
61
 
 
62
 
        tube_received_cb is called when the tube becomes open
63
 
        """
64
 
 
65
 
        def __init__(self, service_name, tube_received_cb):
66
 
                logger.debug('creating TubeHandler')
67
 
                self._tube_received_cb = tube_received_cb
68
 
 
69
 
                bus_name = _build_bus_name(service_name)
70
 
                obj_path = _build_object_path(bus_name)
71
 
                logger.debug('Bus name: %s' % bus_name)
72
 
                logger.debug('Object path: %s' % obj_path)
73
 
 
74
 
                bus = dbus.SessionBus()
75
 
                # this bus_name has to be retained, so make it a instance attribute
76
 
                self.busname = dbus.service.BusName(bus_name, bus)
77
 
                super(TubeHandler, self).__init__(bus, obj_path)
78
 
 
79
 
        @dbus.service.method(dbus_interface="org.gnome.Empathy.TubeHandler", in_signature='soouu', out_signature='')
80
 
        def HandleTube(self, bus_name, connection, channel, handle_type, handle):
81
 
                """Called when we are offered a tube"""
82
 
                logger.debug('Tube received on %s' % channel)
83
 
                self._bus_name = bus_name
84
 
                self._channel = channel
85
 
                self._peer_handle = handle
86
 
                self._conn = Connection(bus_name, connection, ready_handler=self._ready_handler)
87
 
 
88
 
        def _ready_handler(self, conn):
89
 
                self._tube_chan = Channel(self._bus_name, self._channel)
90
 
                self._tube_chan[CHANNEL_INTERFACE_TUBE].connect_to_signal(
91
 
                        'TubeChannelStateChanged', self._tube_state_changed_cb)
92
 
 
93
 
                params = self._tube_chan[PROPERTIES_IFACE].Get(
94
 
                        CHANNEL_INTERFACE_TUBE, 'Parameters')
95
 
                self._process_incoming_tube(params)
96
 
 
97
 
        def _tube_state_changed_cb(self, state):
98
 
                if state == TUBE_STATE_OPEN:
99
 
                        logger.debug('Tube state changed ->open')
100
 
                        bus = dbus.connection.Connection(self._address)
101
 
                        self._tube_received_cb(bus, self._tube_chan)
102
 
                else:
103
 
                        logger.debug('Tube state changed ->%s' % state)
104
 
 
105
 
        def _process_incoming_tube(self, params):
106
 
                def reply_cb(dialog, response_id):
107
 
                        if response_id == gtk.RESPONSE_ACCEPT:
108
 
                                self._address = self._tube_chan[CHANNEL_TYPE_DBUS_TUBE].Accept(
109
 
                                        SOCKET_ACCESS_CONTROL_CREDENTIALS)
110
 
                        else:
111
 
                                self._tube_chan[CHANNEL_INTERFACE].Close()
112
 
                        dialog.destroy()
113
 
 
114
 
                alias = _get_contact_alias(self._conn, self._peer_handle)
115
 
                logger.debug('Processing incoming tube request')
116
 
                
117
 
                dialog = gtk.Dialog(_('New game request!'), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
 
60
    """Listen to coming tube
 
61
 
 
62
    tube_received_cb is called when the tube becomes open
 
63
    """
 
64
 
 
65
    def __init__(self, service_name, tube_received_cb):
 
66
        logger.debug('creating TubeHandler')
 
67
        self._tube_received_cb = tube_received_cb
 
68
 
 
69
        bus_name = _build_bus_name(service_name)
 
70
        obj_path = _build_object_path(bus_name)
 
71
        logger.debug('Bus name: %s' % bus_name)
 
72
        logger.debug('Object path: %s' % obj_path)
 
73
 
 
74
        bus = dbus.SessionBus()
 
75
        # this bus_name has to be retained, so make it a instance attribute
 
76
        self.busname = dbus.service.BusName(bus_name, bus)
 
77
        super(TubeHandler, self).__init__(bus, obj_path)
 
78
 
 
79
    @dbus.service.method(dbus_interface="org.gnome.Empathy.TubeHandler", in_signature='soouu', out_signature='')
 
80
    def HandleTube(self, bus_name, connection, channel, handle_type, handle):
 
81
        """Called when we are offered a tube"""
 
82
        logger.debug('Tube received on %s' % channel)
 
83
        self._bus_name = bus_name
 
84
        self._channel = channel
 
85
        self._peer_handle = handle
 
86
        self._conn = Connection(bus_name, connection, ready_handler=self._ready_handler)
 
87
 
 
88
    def _ready_handler(self, conn):
 
89
        self._tube_chan = Channel(self._bus_name, self._channel)
 
90
        self._tube_chan[CHANNEL_INTERFACE_TUBE].connect_to_signal(
 
91
            'TubeChannelStateChanged', self._tube_state_changed_cb)
 
92
 
 
93
        params = self._tube_chan[PROPERTIES_IFACE].Get(
 
94
            CHANNEL_INTERFACE_TUBE, 'Parameters')
 
95
        self._process_incoming_tube(params)
 
96
 
 
97
    def _tube_state_changed_cb(self, state):
 
98
        if state == TUBE_STATE_OPEN:
 
99
            logger.debug('Tube state changed ->open')
 
100
            bus = dbus.connection.Connection(self._address)
 
101
            self._tube_received_cb(bus, self._tube_chan)
 
102
        else:
 
103
            logger.debug('Tube state changed ->%s' % state)
 
104
 
 
105
    def _process_incoming_tube(self, params):
 
106
        def reply_cb(dialog, response_id):
 
107
            if response_id == gtk.RESPONSE_ACCEPT:
 
108
                self._address = self._tube_chan[CHANNEL_TYPE_DBUS_TUBE].Accept(
 
109
                    SOCKET_ACCESS_CONTROL_CREDENTIALS)
 
110
            else:
 
111
                self._tube_chan[CHANNEL_INTERFACE].Close()
 
112
            dialog.destroy()
 
113
 
 
114
        alias = _get_contact_alias(self._conn, self._peer_handle)
 
115
        logger.debug('Processing incoming tube request')
 
116
 
 
117
        dialog = gtk.Dialog(_('New game request!'), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
118
118
                     (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
119
119
                      gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
120
 
                dialog.connect('response', reply_cb)
121
 
 
122
 
                label = gtk.Label()
123
 
                label.set_line_wrap(True)
124
 
                label.set_markup(_('<big><b>%s would like to play a game of tic tac toe with you! Would you like to play?</b></big>') % alias)
125
 
                label.show()
126
 
 
127
 
                align = gtk.Alignment(1, 1, 0, 0)
128
 
                align.set_padding(5, 5, 5, 5)
129
 
                align.add(label)
130
 
 
131
 
                vbox = dialog.get_content_area()
132
 
                vbox.pack_start(align, True, True, 0)
133
 
                vbox.show_all()
134
 
 
135
 
                dialog.run()
 
120
        dialog.connect('response', reply_cb)
 
121
 
 
122
        label = gtk.Label()
 
123
        label.set_line_wrap(True)
 
124
        label.set_markup(_('<big><b>%s would like to play a game of tic tac toe with you! Would you like to play?</b></big>') % alias)
 
125
        label.show()
 
126
 
 
127
        align = gtk.Alignment(1, 1, 0, 0)
 
128
        align.set_padding(5, 5, 5, 5)
 
129
        align.add(label)
 
130
 
 
131
        vbox = dialog.get_content_area()
 
132
        vbox.pack_start(align, True, True, 0)
 
133
        vbox.show_all()
 
134
 
 
135
        dialog.run()