[PATCH 11/17] Convert _BusDaemonMixin and _MethodCallMixin
into base classes BusConnection and Connection.
John (J5) Palmieri
johnp at redhat.com
Mon Apr 30 14:55:06 PDT 2007
righteous!!!
On Mon, 2007-04-30 at 11:56 +0100, Simon McVittie wrote:
> Also add method activate_name_owner() for proxies to use (so they don't need
> to be aware of whether the connection is a bus daemon or not), and stop using
> deprecated get_connection method.
>
> diff --git a/dbus/_dbus.py b/dbus/_dbus.py
> index fc070ae..48c623b 100644
> --- a/dbus/_dbus.py
> +++ b/dbus/_dbus.py
> @@ -37,14 +37,12 @@ from _dbus_bindings import BUS_DAEMON_NAME, BUS_DAEMON_PATH,\
> validate_member_name, validate_interface_name,\
> validate_bus_name, validate_object_path,\
> BUS_SESSION, BUS_SYSTEM, BUS_STARTER,\
> - Connection as _Connection,\
> DBUS_START_REPLY_SUCCESS, \
> DBUS_START_REPLY_ALREADY_RUNNING, \
> SignalMessage,\
> HANDLER_RESULT_NOT_YET_HANDLED,\
> HANDLER_RESULT_HANDLED
> -from dbus.bus import _BusDaemonMixin
> -from dbus.connection import _MethodCallMixin
> +from dbus.bus import BusConnection
> from dbus.proxies import ProxyObject
>
> try:
> @@ -228,7 +226,7 @@ class SignalMatch(object):
> **self._args_match)
>
>
> -class Bus(_Connection, _MethodCallMixin, _BusDaemonMixin):
> +class Bus(BusConnection):
> """A connection to a DBus daemon.
>
> One of three possible standard buses, the SESSION, SYSTEM,
> @@ -324,7 +322,7 @@ class Bus(_Connection, _MethodCallMixin, _BusDaemonMixin):
> t = self._bus_type
> if self.__class__._shared_instances[t] is self:
> del self.__class__._shared_instances[t]
> - _Connection.close(self)
> + super(BusConnection, self).close()
>
> def get_connection(self):
> """(Deprecated - in new code, just use self)
> diff --git a/dbus/bus.py b/dbus/bus.py
> index 6899b12..e5356d2 100644
> --- a/dbus/bus.py
> +++ b/dbus/bus.py
> @@ -1,5 +1,3 @@
> -"""Bus mixin, for use within dbus-python only. See `_BusMixin`."""
> -
> # Copyright (C) 2007 Collabora Ltd. <http://www.collabora.co.uk/>
> #
> # Licensed under the Academic Free License version 2.1
> @@ -21,15 +19,33 @@
> from _dbus_bindings import validate_interface_name, validate_member_name,\
> validate_bus_name, validate_object_path,\
> validate_error_name,\
> + DBusException, \
> BUS_DAEMON_NAME, BUS_DAEMON_PATH, BUS_DAEMON_IFACE
> +from dbus.connection import Connection
>
>
> -class _BusDaemonMixin(object):
> +class BusConnection(Connection):
> """This mixin provides simple blocking wrappers for various methods on
> the org.freedesktop.DBus bus-daemon object, to reduce the amount of C
> code we need.
> """
>
> + def activate_name_owner(self, bus_name):
> + if (bus_name is not None and bus_name[:1] != ':'
> + and bus_name != BUS_DAEMON_NAME):
> + try:
> + return self.get_name_owner(bus_name)
> + except DBusException, e:
> + # FIXME: detect whether it's NameHasNoOwner, but properly
> + #if not str(e).startswith('org.freedesktop.DBus.Error.NameHasNoOwner:'):
> + # raise
> + # it might not exist: try to start it
> + self.start_service_by_name(bus_name)
> + return self.get_name_owner(bus_name)
> + else:
> + # already unique
> + return bus_name
> +
> def get_unix_user(self, bus_name):
> """Get the numeric uid of the process owning the given bus name.
>
> diff --git a/dbus/connection.py b/dbus/connection.py
> index 36a9a7b..b78e221 100644
> --- a/dbus/connection.py
> +++ b/dbus/connection.py
> @@ -1,7 +1,3 @@
> -"""Method-call mixin for use within dbus-python only.
> -See `_MethodCallMixin`.
> -"""
> -
> # Copyright (C) 2007 Collabora Ltd. <http://www.collabora.co.uk/>
> #
> # Licensed under the Academic Free License version 2.1
> @@ -22,7 +18,7 @@ See `_MethodCallMixin`.
>
> import logging
>
> -from _dbus_bindings import Connection, ErrorMessage, \
> +from _dbus_bindings import Connection as _Connection, ErrorMessage, \
> MethodCallMessage, MethodReturnMessage, \
> DBusException, LOCAL_PATH, LOCAL_IFACE
>
> @@ -34,7 +30,22 @@ def _noop(*args, **kwargs):
> pass
>
>
> -class _MethodCallMixin(object):
> +class Connection(_Connection):
> +
> + def activate_name_owner(self, bus_name):
> + """Return the unique name for the given bus name, activating it
> + if necessary and possible.
> +
> + If the name is already unique or this connection is not to a
> + bus daemon, just return it.
> +
> + :Returns: a bus name. If the given `bus_name` exists, the returned
> + name identifies its current owner; otherwise the returned name
> + does not exist.
> + :Raises DBusException: if the implementation has failed
> + to activate the given bus name.
> + """
> + return bus_name
>
> def call_async(self, bus_name, object_path, dbus_interface, method,
> signature, args, reply_handler, error_handler,
> diff --git a/dbus/proxies.py b/dbus/proxies.py
> index e2a1aed..5934b56 100644
> --- a/dbus/proxies.py
> +++ b/dbus/proxies.py
> @@ -202,23 +202,8 @@ class ProxyObject(object):
> _dbus_bindings.validate_object_path(object_path)
> self.__dbus_object_path__ = object_path
>
> - # XXX: assumes it's a bus daemon
> - if (named_service is not None and named_service[:1] != ':'
> - and named_service != BUS_DAEMON_NAME
> - and not follow_name_owner_changes):
> - bus_object = bus.get_object(BUS_DAEMON_NAME, BUS_DAEMON_PATH)
> - try:
> - self._named_service = bus_object.GetNameOwner(named_service,
> - dbus_interface=BUS_DAEMON_IFACE)
> - except DBusException, e:
> - # FIXME: detect whether it's NameHasNoOwner, but properly
> - #if not str(e).startswith('org.freedesktop.DBus.Error.NameHasNoOwner:'):
> - # raise
> - # it might not exist: try to start it
> - bus_object.StartServiceByName(named_service,
> - _dbus_bindings.UInt32(0))
> - self._named_service = bus_object.GetNameOwner(named_service,
> - dbus_interface=BUS_DAEMON_IFACE)
> + if not follow_name_owner_changes:
> + self._named_service = bus.activate_name_owner(named_service)
>
> #PendingCall object for Introspect call
> self._pending_introspect = None
> @@ -433,7 +418,7 @@ class ProxyObject(object):
> this won't be a problem.
> """
>
> - ret = self.ProxyMethodClass(self, self._bus.get_connection(),
> + ret = self.ProxyMethodClass(self, self._bus,
> self._named_service,
> self.__dbus_object_path__, member,
> dbus_interface)
> _______________________________________________
> dbus mailing list
> dbus at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dbus
More information about the dbus
mailing list