summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorHuang Peng <shawn.p.huang@gmail.com>2008-09-27 14:06:01 +0800
committerHuang Peng <shawn.p.huang@gmail.com>2008-09-27 14:06:01 +0800
commit0b0ded27bda2a2c9ffdff6395018341d193d0f42 (patch)
tree15d3e2dbf8d5146465c2189e5d92c20a3b8eb705 /daemon
parent4b20a204d7ce986f2ef407374320c8a3617ce582 (diff)
downloadibus-0b0ded27bda2a2c9ffdff6395018341d193d0f42.tar.gz
ibus-0b0ded27bda2a2c9ffdff6395018341d193d0f42.tar.xz
ibus-0b0ded27bda2a2c9ffdff6395018341d193d0f42.zip
Add message routing feature for ibus.
Diffstat (limited to 'daemon')
-rw-r--r--daemon/_dbus.py29
-rw-r--r--daemon/connection.py20
2 files changed, 38 insertions, 11 deletions
diff --git a/daemon/_dbus.py b/daemon/_dbus.py
index 4da52c8..bfbe079 100644
--- a/daemon/_dbus.py
+++ b/daemon/_dbus.py
@@ -30,6 +30,10 @@ class DBusReal(ibus.Object):
self.__name_dict = dict()
self.__id = 0
+ def add_connection(self, ibusconn):
+ ibusconn.connect("dbus-message", self.__dbus_message_cb)
+ ibusconn.connect("destroy", self.__ibusconn_destroy_cb)
+
def register_connection(self, ibusconn):
name = ibusconn.get_unique_name()
if name:
@@ -38,7 +42,6 @@ class DBusReal(ibus.Object):
name = ":1.%d" % self.__id
self.__unique_name_dict[name] = ibusconn
ibusconn.set_unique_name(name)
- ibusconn.connect("destroy", self.__ibusconn_destroy_cb)
return name
def list_names(self):
@@ -101,6 +104,20 @@ class DBusReal(ibus.Object):
ibusconn.remove_name(name)
return 1
+ def __dbus_message_cb(self, ibusconn, message):
+ dest = message.get_destination()
+ message.set_sender(ibusconn.get_unique_name())
+ if dest.startswith(":"):
+ destconn = self.__unique_name_dict.get(dest, None)
+ else:
+ destconn = self.__name_dict.get(dest, None)
+
+ if destconn == None:
+ raise ibus.IBusException("Can not find the destination(%s)" % dest)
+
+ destconn.send_message(message)
+ return True
+
def __ibusconn_destroy_cb(self, ibusconn):
name = ibusconn.get_unique_name()
if name:
@@ -123,12 +140,16 @@ class DBus(dbus.service.Object):
def __init__(self, ibusconn):
super(DBus, self).__init__(ibusconn.get_dbusconn(), dbus.BUS_DAEMON_PATH)
self.__ibusconn = ibusconn
- self.__name = ""
+ self.__name = DBus.__bus.register_connection(self.__ibusconn)
+ self.__active = False
+ self.__bus.add_connection(ibusconn)
@method(out_signature="s")
def Hello(self):
- self.__name = DBus.__bus.register_connection(self.__ibusconn)
- return self.__name
+ if not self.__active:
+ self.__active = True
+ return self.__name
+ raise ibus.IBusException("Already handled an Hello message")
@method(out_signature="as")
def ListNames(self):
diff --git a/daemon/connection.py b/daemon/connection.py
index 3357a47..2974bd2 100644
--- a/daemon/connection.py
+++ b/daemon/connection.py
@@ -29,8 +29,13 @@ class Connection(ibus.Object):
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_BOOLEAN,
(gobject.TYPE_PYOBJECT, )
+ ),
+ "dbus-message" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_BOOLEAN,
+ (gobject.TYPE_PYOBJECT, )
)
- }
+ }
def __init__(self, dbusconn):
super(Connection, self).__init__()
self.__dbusconn = dbusconn
@@ -48,10 +53,11 @@ class Connection(ibus.Object):
return dbus.lowlevel.HANDLER_RESULT_NOT_YET_HANDLED
if message.get_type() == 4: # is signal
- if self.dispatch_dbus_signal(message):
+ if self.emit("dbus-signal", message):
return dbus.lowlevel.HANDLER_RESULT_HANDLED
-
- return dbus.lowlevel.HANDLER_RESULT_HANDLED
+ if self.emit("dbus-message", message):
+ return dbus.lowlevel.HANDLER_RESULT_HANDLED
+ return dbus.lowlevel.HANDLER_RESULT_NOT_YET_HANDLED
def get_object(self, path):
return self.__dbusconn.get_object("no.name", path)
@@ -59,15 +65,15 @@ class Connection(ibus.Object):
def emit_dbus_signal(self, name, *args):
message = dbus.lowlevel.SignalMessage(ibus.IBUS_PATH, ibus.IBUS_IFACE, name)
message.append(*args)
+ self.send_message(message)
+
+ def send_message(self, message):
self.__dbusconn.send_message(message)
self.__dbusconn.flush()
def do_destroy(self):
self.__dbusconn = None
- def dispatch_dbus_signal(self, message):
- return self.emit("dbus-signal", message)
-
def config_add_watch(self, key):
if key in self.__config_watch:
return False