diff options
| author | Robert McQueen <robot101@debian.org> | 2005-11-15 17:19:19 +0000 | 
|---|---|---|
| committer | Robert McQueen <robot101@debian.org> | 2005-11-15 17:19:19 +0000 | 
| commit | b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebf (patch) | |
| tree | 66eb4e5670d802aee918f8bd3c4674482de0990c /python | |
| parent | d4595960e9edc679cb2656d3ff59d2f899b0f16b (diff) | |
2005-11-15  Robert McQueen  <robot101@debian.org>
	* bus/driver.c, bus/services.c, bus/services.h: Add a ReleaseName
	method to org.freedesktop.DBus to release a bus name or give up
	waiting in the queue for it.
	* dbus/dbus-bus.c, dbus/dbus-bus.h, dbus/dbus-shared.h: Add a
	dbus_bus_release_name method to send the ReleaseName method calls.
	Add constants for the return values to dbus/dbus-shared.h.
	* doc/dbus-specification.xml: Document the new ReleaseName method
	in the specification.
	* python/dbus_bindings.pyx: Add a low-level python binding for the
	release name method.
	* python/exceptions.py, python/service.py: Make freeing BusName
	objects release the name. Add a NameExistsException, and fix a
	bug with creating UnknownMethodException.
	* test/python/test-client.py: Add tests for freeing BusName
	objects causing names to be released.
Diffstat (limited to 'python')
| -rw-r--r-- | python/dbus_bindings.pyx | 33 | ||||
| -rw-r--r-- | python/exceptions.py | 10 | ||||
| -rw-r--r-- | python/service.py | 11 | 
3 files changed, 39 insertions, 15 deletions
diff --git a/python/dbus_bindings.pyx b/python/dbus_bindings.pyx index 75e448ee..8b1b221b 100644 --- a/python/dbus_bindings.pyx +++ b/python/dbus_bindings.pyx @@ -1710,10 +1710,10 @@ def bus_get_unix_user(Connection connection, service_name):      return retval -#These are defines, not enums so they aren't auto generated -DBUS_START_REPLY_SUCCESS = 0  -DBUS_START_REPLY_ALREADY_RUNNING = 1  -     +# these are defines, not enums, so they aren't auto generated +DBUS_START_REPLY_SUCCESS = 0 +DBUS_START_REPLY_ALREADY_RUNNING = 1 +  def bus_start_service_by_name(Connection connection, service_name, flags=0):      cdef DBusError error      dbus_error_init(&error) @@ -1771,9 +1771,30 @@ def bus_request_name(Connection connection, service_name, flags=0):          errormsg = error.message          dbus_error_free(&error)          raise DBusException, errormsg -         +      return retval -     + +RELEASE_NAME_REPLY_RELEASED = 1 +RELEASE_NAME_REPLY_NON_EXISTENT = 2 +RELEASE_NAME_REPLY_NOT_OWNER = 3 + +def bus_release_name(Connection connection, service_name): +    cdef DBusError error +    dbus_error_init(&error) +    cdef int retval +    cdef DBusConnection *conn + +    conn = connection._get_conn() +    retval = dbus_bus_release_name(conn, +                                   service_name, +                                   &error) +    if dbus_error_is_set(&error): +        errormsg = error.message +        dbus_error_free(&error) +        raise DBusException, errormsg + +    return retval +  def bus_name_has_owner(Connection connection, service_name):      cdef DBusError error      dbus_error_init(&error) diff --git a/python/exceptions.py b/python/exceptions.py index 5cb8d5a3..2b01b96e 100644 --- a/python/exceptions.py +++ b/python/exceptions.py @@ -17,9 +17,13 @@ class ValidationException(DBusException):  class IntrospectionParserException(DBusException):      def __init__(self, msg=''): -            DBusException.__init__(self, "Error parsing introspect data: %s"%msg) +        DBusException.__init__(self, "Error parsing introspect data: %s"%msg)  class UnknownMethodException(DBusException): -    def __init__(self, msg=''): -        DBusException.__init__("Unknown method: %s"%msg) +    def __init__(self, method): +        DBusException.__init__(self, "Unknown method: %s"%method) + +class NameExistsException(DBusException): +    def __init__(self, name): +        DBusException.__init__(self, "Bus name already exists: %s"%name) diff --git a/python/service.py b/python/service.py index 6c3561ad..e5a7002b 100644 --- a/python/service.py +++ b/python/service.py @@ -1,9 +1,9 @@ - -import dbus_bindings  +import dbus_bindings  import _dbus  import operator  import traceback +from exceptions import NameExistsException  from exceptions import UnknownMethodException  from decorators import method  from decorators import signal @@ -31,13 +31,13 @@ class BusName(object):              # because you can't put flags in, but... who knows?              pass          elif retval == dbus_bindings.REQUEST_NAME_REPLY_EXISTS: -            raise dbus_bindings.DBusException('requested name %s already exists' % name) +            raise NameExistsException(name)          elif retval == dbus_bindings.REQUEST_NAME_REPLY_ALREADY_OWNER:              # if this is a shared bus which is being used by someone              # else in this process, this can happen legitimately              pass          else: -            raise dbus_bindings.DBusException('requesting name %s returned unexpected value %s' % (name, retval)) +            raise RuntimeError('requesting bus name %s returned unexpected value %s' % (name, retval))          # and create the object          bus_name = object.__new__(cls) @@ -57,8 +57,7 @@ class BusName(object):      # we can delete the low-level name here because these objects      # are guaranteed to exist only once for each bus name      def __del__(self): -        # FIXME: we don't have this function yet :) -        #dbus_bindings.bus_release_name(self._bus.get_connection(), self._named_service) +        dbus_bindings.bus_release_name(self._bus.get_connection(), self._name)          pass      def get_bus(self):  | 
