diff options
-rw-r--r-- | org/freedesktop/dbus/AbstractConnection.java | 12 | ||||
-rw-r--r-- | org/freedesktop/dbus/DBusConnection.java | 3 | ||||
-rw-r--r-- | org/freedesktop/dbus/exceptions/UnknownTypeCodeException.java | 3 | ||||
-rw-r--r-- | org/freedesktop/dbus/test/test.java | 53 | ||||
-rw-r--r-- | translations/en_GB.po | 2 |
5 files changed, 63 insertions, 10 deletions
diff --git a/org/freedesktop/dbus/AbstractConnection.java b/org/freedesktop/dbus/AbstractConnection.java index 5cdc27e..0bbc502 100644 --- a/org/freedesktop/dbus/AbstractConnection.java +++ b/org/freedesktop/dbus/AbstractConnection.java @@ -111,11 +111,6 @@ public abstract class AbstractConnection } catch (Exception e) { if (EXCEPTION_DEBUG && Debug.debug) Debug.print(Debug.ERR, e); if (e instanceof FatalException) { - try { - handleMessage(new org.freedesktop.DBus.Local.Disconnected("/")); - } catch (Exception ee) { - if (EXCEPTION_DEBUG && Debug.debug) Debug.print(Debug.ERR, ee); - } disconnect(); } } @@ -560,6 +555,13 @@ public abstract class AbstractConnection */ public void disconnect() { + if (Debug.debug) Debug.print(Debug.INFO, "Sending disconnected signal"); + try { + handleMessage(new org.freedesktop.DBus.Local.Disconnected("/")); + } catch (Exception ee) { + if (EXCEPTION_DEBUG && Debug.debug) Debug.print(Debug.ERR, ee); + } + if (Debug.debug) Debug.print(Debug.INFO, "Disconnecting Abstract Connection"); // run all pending tasks. while (runnables.size() > 0) diff --git a/org/freedesktop/dbus/DBusConnection.java b/org/freedesktop/dbus/DBusConnection.java index 43a5b04..49453e0 100644 --- a/org/freedesktop/dbus/DBusConnection.java +++ b/org/freedesktop/dbus/DBusConnection.java @@ -639,7 +639,8 @@ public class DBusConnection extends AbstractConnection _dbus.RemoveMatch(rule.toString()); } catch (DBusExecutionException DBEe) { if (EXCEPTION_DEBUG && Debug.debug) Debug.print(Debug.ERR, DBEe); - throw new DBusException(DBEe.getMessage()); + if (!"org.freedesktop.DBus.Local.Disconnected".equals(DBEe.getType())) + throw new DBusException(DBEe.getMessage()); } } } diff --git a/org/freedesktop/dbus/exceptions/UnknownTypeCodeException.java b/org/freedesktop/dbus/exceptions/UnknownTypeCodeException.java index b00f5b6..9441e70 100644 --- a/org/freedesktop/dbus/exceptions/UnknownTypeCodeException.java +++ b/org/freedesktop/dbus/exceptions/UnknownTypeCodeException.java @@ -9,12 +9,13 @@ Full licence texts are included in the COPYING file with this program. */ package org.freedesktop.dbus.exceptions; +import static org.freedesktop.dbus.Gettext._; @SuppressWarnings("serial") public class UnknownTypeCodeException extends DBusException implements NonFatalException { public UnknownTypeCodeException(byte code) { - super("Code "+code+" is not a valid D-Bus type."); + super(_("Not a valid D-Bus type code: ") + code); } } diff --git a/org/freedesktop/dbus/test/test.java b/org/freedesktop/dbus/test/test.java index 0ade1e6..cc84490 100644 --- a/org/freedesktop/dbus/test/test.java +++ b/org/freedesktop/dbus/test/test.java @@ -37,6 +37,7 @@ import org.freedesktop.dbus.UInt64; import org.freedesktop.dbus.Variant; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; +import org.freedesktop.dbus.exceptions.NotConnected; import org.freedesktop.DBus; import org.freedesktop.DBus.Error.MatchRuleInvalid; @@ -333,6 +334,34 @@ class renamedsignalhandler implements DBusSigHandler<TestSignalInterface2.TestRe } /** + * Disconnect handler + */ +class disconnecthandler implements DBusSigHandler<DBus.Local.Disconnected> +{ + private DBusConnection conn; + private renamedsignalhandler sh; + public disconnecthandler(DBusConnection conn, renamedsignalhandler sh) + { + this.conn = conn; + this.sh = sh; + } + /** Handling a signal */ + public void handle(DBus.Local.Disconnected t) + { + if (false == test.done6) { + test.done6 = true; + System.out.println("Handling disconnect, unregistering handler"); + try { + conn.removeSigHandler(TestSignalInterface2.TestRenamedSignal.class, sh); + } catch (DBusException DBe) { + DBe.printStackTrace(); + } + } + } +} + + +/** * Typed signal handler */ class pathsignalhandler implements DBusSigHandler<TestSignalInterface.TestPathSignal> @@ -456,6 +485,7 @@ public class test public static boolean done3 = false; public static boolean done4 = false; public static boolean done5 = false; + public static boolean done6 = false; public static void fail(String message) { System.out.println("Test Failed: "+message); @@ -483,10 +513,13 @@ public class test DBus dbus = clientconn.getRemoteObject("org.freedesktop.DBus", "/org/freedesktop/DBus", DBus.class); System.out.print("Listening for signals..."); + signalhandler sigh = new signalhandler(); + renamedsignalhandler rsh = new renamedsignalhandler(); try { /** This registers an instance of the test class as the signal handler for the TestSignal class. */ - clientconn.addSigHandler(TestSignalInterface.TestSignal.class, new signalhandler()); - clientconn.addSigHandler(TestSignalInterface2.TestRenamedSignal.class, new renamedsignalhandler()); + clientconn.addSigHandler(TestSignalInterface.TestSignal.class, sigh); + clientconn.addSigHandler(TestSignalInterface2.TestRenamedSignal.class, rsh); + clientconn.addSigHandler(DBus.Local.Disconnected.class, new disconnecthandler(clientconn, rsh)); String source = dbus.GetNameOwner("foo.bar.Test"); clientconn.addSigHandler(TestSignalInterface.TestArraySignal.class, source, peer, new arraysignalhandler()); clientconn.addSigHandler(TestSignalInterface.TestObjectSignal.class, new objectsignalhandler()); @@ -849,6 +882,19 @@ public class test System.out.println("Disconnecting"); /** Disconnect from the bus. */ clientconn.disconnect(); + + System.out.println("Trying to do things after disconnection"); + + /** Remove sig handler */ + clientconn.removeSigHandler(TestSignalInterface.TestSignal.class, sigh); + + /** Call a method when disconnected */ + try { + System.out.println("getName() suceeded and returned: "+tri.getName()); + fail("Should not succeed when disconnected"); + } catch (NotConnected NC) { + System.out.println("getName() failed with exception "+NC); + } clientconn = null; serverconn.disconnect(); serverconn = null; @@ -858,9 +904,10 @@ public class test if (!done3) fail("Signal handler 3 failed to be run"); if (!done4) fail("Callback handler failed to be run"); if (!done5) fail("Signal handler R failed to be run"); + if (!done6) fail("Disconnect handler failed to be run"); } catch (Exception e) { e.printStackTrace(); - fail("Unexpected Exception Occurred"); + fail("Unexpected Exception Occurred: "+e); }} } diff --git a/translations/en_GB.po b/translations/en_GB.po index b0383dc..c567f53 100644 --- a/translations/en_GB.po +++ b/translations/en_GB.po @@ -149,6 +149,8 @@ msgid "Not an object exported by this connection and no remote specified" msgstr "Not an object exported by this connection and no remote specified" msgid "Not a primitive type" msgstr "Not a primitive type" +msgid "Not a valid D-Bus type code: " +msgstr "Not a valid D-Bus type code: " msgid "Not a wrapper type" msgstr "Not a wrapper type" msgid "Not Connected" |