45
45
DBusGMainLoop(set_as_default=True)
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]
50
50
def _sanitize_service_name(service_name):
51
return service_name.replace('.', '_')
51
return service_name.replace('.', '_')
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)
56
56
def _build_object_path(bus_name):
57
return '/' + bus_name.replace('.', '/')
57
return '/' + bus_name.replace('.', '/')
59
59
class TubeHandler(dbus.service.Object):
60
"""Listen to coming tube
62
tube_received_cb is called when the tube becomes open
65
def __init__(self, service_name, tube_received_cb):
66
logger.debug('creating TubeHandler')
67
self._tube_received_cb = tube_received_cb
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)
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)
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)
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)
93
params = self._tube_chan[PROPERTIES_IFACE].Get(
94
CHANNEL_INTERFACE_TUBE, 'Parameters')
95
self._process_incoming_tube(params)
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)
103
logger.debug('Tube state changed ->%s' % state)
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)
111
self._tube_chan[CHANNEL_INTERFACE].Close()
114
alias = _get_contact_alias(self._conn, self._peer_handle)
115
logger.debug('Processing incoming tube request')
117
dialog = gtk.Dialog(_('New game request!'), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
60
"""Listen to coming tube
62
tube_received_cb is called when the tube becomes open
65
def __init__(self, service_name, tube_received_cb):
66
logger.debug('creating TubeHandler')
67
self._tube_received_cb = tube_received_cb
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)
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)
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)
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)
93
params = self._tube_chan[PROPERTIES_IFACE].Get(
94
CHANNEL_INTERFACE_TUBE, 'Parameters')
95
self._process_incoming_tube(params)
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)
103
logger.debug('Tube state changed ->%s' % state)
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)
111
self._tube_chan[CHANNEL_INTERFACE].Close()
114
alias = _get_contact_alias(self._conn, self._peer_handle)
115
logger.debug('Processing incoming tube request')
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)
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)
127
align = gtk.Alignment(1, 1, 0, 0)
128
align.set_padding(5, 5, 5, 5)
131
vbox = dialog.get_content_area()
132
vbox.pack_start(align, True, True, 0)
120
dialog.connect('response', reply_cb)
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)
127
align = gtk.Alignment(1, 1, 0, 0)
128
align.set_padding(5, 5, 5, 5)
131
vbox = dialog.get_content_area()
132
vbox.pack_start(align, True, True, 0)