diff options
| author | Huang Peng <shawn.p.huang@gmail.com> | 2008-09-27 14:06:01 +0800 |
|---|---|---|
| committer | Huang Peng <shawn.p.huang@gmail.com> | 2008-09-27 14:06:01 +0800 |
| commit | 0b0ded27bda2a2c9ffdff6395018341d193d0f42 (patch) | |
| tree | 15d3e2dbf8d5146465c2189e5d92c20a3b8eb705 /daemon | |
| parent | 4b20a204d7ce986f2ef407374320c8a3617ce582 (diff) | |
| download | ibus-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.py | 29 | ||||
| -rw-r--r-- | daemon/connection.py | 20 |
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 |
