diff options
-rw-r--r-- | ChangeLog | 42 | ||||
-rw-r--r-- | doc/TODO | 13 | ||||
-rw-r--r-- | python/Makefile.am | 34 | ||||
-rw-r--r-- | python/__init__.py | 5 | ||||
-rw-r--r-- | python/_dbus.py | 19 | ||||
-rw-r--r-- | python/dbus_bindings.pxd.in | 8 | ||||
-rw-r--r-- | python/dbus_bindings.pyx (renamed from python/dbus_bindings.pyx.in) | 36 | ||||
-rw-r--r-- | python/dbus_glib_bindings.pyx | 19 | ||||
-rw-r--r-- | python/examples/example-service.py | 19 | ||||
-rw-r--r-- | python/examples/example-signal-emitter.py | 15 | ||||
-rw-r--r-- | python/examples/gconf-proxy-service.py | 2 | ||||
-rw-r--r-- | python/examples/gconf-proxy-service2.py | 2 | ||||
-rw-r--r-- | python/glib.py | 15 | ||||
-rw-r--r-- | python/service.py (renamed from python/services.py) | 12 |
14 files changed, 172 insertions, 69 deletions
@@ -1,3 +1,45 @@ +2005-07-12 John (J5) Palmieri <johnp@redhat.com> + * python/dbus_bindings.pyx.in: removed + + * python/dbus_bindings.pyx: Added. + - Fixed some memleaks (patch from + Sean Meiners <sean.meiners@linspireinc.com>) + - Broke out the #include "dbus_h_wrapper.h" and put it in its + own pxd file (Pyrex definition) + - Broke out glib dependancies into its own pyx module + + * python/dbus_bindings.pdx: Added. + - Defines C class Connection for exporting to other modules + + * python/dbus_glib_bindings.pyx: Added. + - New module to handle lowlevel dbus-glib mainloop integration + + * python/glib.py: Added. + - Registers the glib mainloop when you import this module + + * python/services.py: Removed (renamed to service.py) + + * python/service.py: Added. + - (class Server): renamed Name + + * python/__init__.py: Bump ro version (0,41,0) + -don't import the decorators or service module + by default. These now reside in the dbus.service namespace + + * python/_dbus.py (Bus::__init__): Add code run the main loop + setup function on creation + + * python/examples/example-service.py, + python/examples/example-signal-emitter.py: update examples + + * python/examples/gconf-proxy-service.py, + python/examples/gconf-proxy-service2.py: TODO fix these up + + * doc/TODO: Addition + - Added a Python Bindings 1.0 section + - added "Add match on args or match on details to match rules" + + 2005-07-12 Colin Walters <walters@verbum.org> * glib/examples/statemachine/Makefile.am (statemachine-server-glue.h) @@ -25,6 +25,8 @@ Important for 1.0 - Add a test case for handling the Ping message + - Add match on args or match on details to match rules + Important for 1.0 GLib Bindings === @@ -32,6 +34,17 @@ Important for 1.0 GLib Bindings - Add support for getting sender +Important for 1.0 Python bindings +=== + + - Hammer down API + + - Fix removing of signals from the match tree + + - Fix refcounting and userdata lifecycles + + - Write a generic mainloop + Might as Well for 1.0 === diff --git a/python/Makefile.am b/python/Makefile.am index b5ee4243..81a8367a 100644 --- a/python/Makefile.am +++ b/python/Makefile.am @@ -1,30 +1,42 @@ SUBDIRS=examples -INCLUDES=-I$(top_builddir) -I$(top_builddir)/dbus $(DBUS_CLIENT_CFLAGS) $(DBUS_GLIB_CFLAGS) $(DBUS_GLIB_TOOL_CFLAGS) $(PYTHON_INCLUDES) -DDBUS_COMPILATION=1 +INCLUDES=-I$(top_builddir) -I$(top_builddir)/dbus $(DBUS_CLIENT_CFLAGS) $(PYTHON_INCLUDES) -DDBUS_COMPILATION=1 dbusdir = $(pythondir)/dbus -dbus_PYTHON = __init__.py _dbus.py decorators.py exceptions.py services.py proxies.py _util.py types.py matchrules.py +dbus_PYTHON = __init__.py _dbus.py decorators.py exceptions.py service.py proxies.py _util.py types.py matchrules.py glib.py dbusbindingsdir = $(pyexecdir)/dbus -dbusbindings_LTLIBRARIES = dbus_bindings.la +dbusbindings_LTLIBRARIES = dbus_bindings.la dbus_glib_bindings.la dbus_bindings_la_LDFLAGS = -module -avoid-version -fPIC -export-symbols-regex initdbus_bindings -dbus_bindings_la_LIBADD = $(top_builddir)/dbus/libdbus-1.la $(top_builddir)/glib/libdbus-glib-1.la +dbus_bindings_la_LIBADD = $(top_builddir)/dbus/libdbus-1.la nodist_dbus_bindings_la_SOURCES = dbus_bindings.c +dbus_glib_bindings_la_LDFLAGS = -module -avoid-version -fPIC -export-symbols-regex initdbus_glib_bindings +dbus_glib_bindings_la_LIBADD = $(top_builddir)/dbus/libdbus-1.la $(top_builddir)/glib/libdbus-glib-1.la +dbus_glib_bindings_la_CFLAGS = $(DBUS_GLIB_CFLAGS) $(DBUS_GLIB_TOOL_CFLAGS) +nodist_dbus_glib_bindings_la_SOURCES = dbus_glib_bindings.c + EXTRA_DIST = \ dbus_h_wrapper.h \ - dbus_bindings.pyx.in \ + dbus_bindings.pyx \ + dbus_glib_bindings.pyx \ + dbus_bindings.pxd \ extract.py CLEANFILES = \ - dbus_bindings.pyx \ - dbus_bindings.c + dbus_bindings.pxd \ + dbus_bindings.c \ + dbus_glib_bindings.c + +dbus_bindings.pxd: dbus_bindings.pxd.in extract.py + -$(PYTHON) extract.py dbus_bindings.pxd.in -I$(top_builddir) > dbus_bindings.pxd -dbus_bindings.pyx: dbus_bindings.pyx.in extract.py - -$(PYTHON) extract.py dbus_bindings.pyx.in -I$(top_builddir) > dbus_bindings.pyx +dbus_bindings.c: dbus_bindings.pyx dbus_bindings.pxd + -pyrexc dbus_bindings.pyx -dbus_bindings.c: dbus_bindings.pyx - -pyrexc dbus_bindings.pyx +dbus_glib_bindings.c: dbus_glib_bindings.pyx dbus_bindings.pxd + -pyrexc dbus_glib_bindings.pyx + diff --git a/python/__init__.py b/python/__init__.py index ebeb4208..069a432b 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -1,6 +1,5 @@ from _dbus import * -from decorators import * -from services import * from types import * -version = (0, 40, 2) +version = (0, 41, 0) +_dbus_main_loop_setup_function = None diff --git a/python/_dbus.py b/python/_dbus.py index d559ce18..d52aa8fc 100644 --- a/python/_dbus.py +++ b/python/_dbus.py @@ -42,7 +42,8 @@ print(dbus_object.ListServices()) """ import dbus_bindings -from decorators import * + +import dbus from proxies import * from exceptions import * from services import * @@ -51,13 +52,6 @@ from matchrules import * import re import inspect -_threads_initialized = 0 -def init_gthreads (): - global _threads_initialized - if not _threads_initialized: - dbus_bindings.init_gthreads () - _threads_initialized = 1 - class Bus: """A connection to a DBus daemon. @@ -76,13 +70,16 @@ class Bus: START_REPLY_SUCCESS = dbus_bindings.DBUS_START_REPLY_SUCCESS START_REPLY_ALREADY_RUNNING = dbus_bindings.DBUS_START_REPLY_ALREADY_RUNNING - def __init__(self, bus_type=TYPE_SESSION, glib_mainloop=True): + def __init__(self, bus_type=TYPE_SESSION, use_default_mainloop=True): self._connection = dbus_bindings.bus_get(bus_type) self._connection.add_filter(self._signal_func) self._match_rule_tree = SignalMatchTree() - if (glib_mainloop): - self._connection.setup_with_g_main() + + if use_default_mainloop: + func = getattr(dbus, "_dbus_mainloop_setup_function", None) + if func != None: + func(self) def get_connection(self): return self._connection diff --git a/python/dbus_bindings.pxd.in b/python/dbus_bindings.pxd.in new file mode 100644 index 00000000..f1707208 --- /dev/null +++ b/python/dbus_bindings.pxd.in @@ -0,0 +1,8 @@ +#include "dbus_h_wrapper.h" + +cdef class Connection: + cdef DBusConnection *conn + + cdef __cinit__(self, address, DBusConnection *_conn) + cdef _set_conn(self, DBusConnection *conn) + cdef DBusConnection *_get_conn(self) diff --git a/python/dbus_bindings.pyx.in b/python/dbus_bindings.pyx index 34341c4a..608ef544 100644 --- a/python/dbus_bindings.pyx.in +++ b/python/dbus_bindings.pyx @@ -15,21 +15,11 @@ cdef extern from "sys/types.h": cdef extern from "sys/cdefs.h": ctypedef __signed -#include "dbus_h_wrapper.h" - cdef extern from "stdlib.h": cdef void *malloc(size_t size) cdef void free(void *ptr) cdef void *calloc(size_t nmemb, size_t size) -cdef extern from "dbus-glib.h": - ctypedef struct GMainContext - cdef void dbus_connection_setup_with_g_main (DBusConnection *connection, - GMainContext *context) - cdef void dbus_server_setup_with_g_main (DBusServer *server, - GMainContext *context) - cdef void dbus_g_thread_init () - cdef extern from "Python.h": void Py_XINCREF (object) void Py_XDECREF (object) @@ -153,7 +143,6 @@ class Dictionary(dict): dict.__init__(value) #forward delcerations -cdef class Connection cdef class Message cdef class PendingCall cdef class Watch @@ -203,12 +192,11 @@ cdef DBusHandlerResult cmessage_function_handler (DBusConnection *connection, PyGILState_Release(gil) cdef class Connection: - cdef DBusConnection *conn - def __init__(self, address=None, Connection _conn=None): cdef DBusConnection *c_conn cdef char *c_address c_conn=NULL + self.conn = NULL if (_conn != None): c_conn = _conn.conn @@ -229,6 +217,9 @@ cdef class Connection: if dbus_error_is_set(&error): raise DBusException, error.message + def __del__(self): + if self.conn != NULL: + dbus_connection_unref(self.conn) cdef _set_conn(self, DBusConnection *conn): self.conn = conn @@ -239,9 +230,6 @@ cdef class Connection: def get_unique_name(self): return bus_get_unique_name(self) - def setup_with_g_main(self): - dbus_connection_setup_with_g_main(self.conn, NULL) - def disconnect(self): dbus_connection_disconnect(self.conn) @@ -497,6 +485,7 @@ cdef class PendingCall: cdef DBusPendingCall *pending_call def __init__(self, PendingCall _pending_call=None): + self.pending_call = NULL if (_pending_call != None): self.__cinit__(_pending_call.pending_call) @@ -504,6 +493,10 @@ cdef class PendingCall: self.pending_call = _pending_call dbus_pending_call_ref(self.pending_call) + def __del__(self): + if self.pending_call != NULL: + dbus_pending_call_unref(self.pending_call) + cdef DBusPendingCall *_get_pending_call(self): return self.pending_call @@ -1125,6 +1118,8 @@ cdef class Message: Message reply_to=None, error_name=None, error_message=None, _create=1): + self.msg = NULL + cdef char *cservice cdef char *ciface cdef DBusMessage *cmsg @@ -1150,6 +1145,10 @@ cdef class Message: elif message_type == MESSAGE_TYPE_ERROR: cmsg = reply_to._get_msg() self.msg = dbus_message_new_error(cmsg, error_name, error_message) + + def __del__(self): + if self.msg != NULL: + dbus_message_unref(self.msg) def type_to_name(self, type): if type == MESSAGE_TYPE_SIGNAL: @@ -1339,9 +1338,6 @@ cdef class Server: if dbus_error_is_set(&error): raise DBusException, error.message - def setup_with_g_main (self): - dbus_server_setup_with_g_main(self.server, NULL) - def disconnect(self): dbus_server_disconnect(self.server) @@ -1490,5 +1486,3 @@ def bus_remove_match(Connection connection, rule): if dbus_error_is_set(&error): raise DBusException, error.message -def init_gthreads (): - dbus_g_thread_init () diff --git a/python/dbus_glib_bindings.pyx b/python/dbus_glib_bindings.pyx new file mode 100644 index 00000000..314fadad --- /dev/null +++ b/python/dbus_glib_bindings.pyx @@ -0,0 +1,19 @@ +cdef extern from "dbus.h": + ctypedef struct DBusConnection + +cdef extern from "dbus-glib.h": + ctypedef struct GMainContext + cdef void dbus_connection_setup_with_g_main (DBusConnection *connection, + GMainContext *context) + cdef void dbus_g_thread_init () + +cimport dbus_bindings +import dbus_bindings + +def setup_with_g_main(conn): + cdef dbus_bindings.Connection connection + connection = conn + dbus_connection_setup_with_g_main(connection._get_conn(), NULL) + +def init_gthreads (): + dbus_g_thread_init () diff --git a/python/examples/example-service.py b/python/examples/example-service.py index 9963454f..9e2f193b 100644 --- a/python/examples/example-service.py +++ b/python/examples/example-service.py @@ -1,29 +1,32 @@ #!/usr/bin/env python import dbus +import dbus.service + +import dbus.glib import pygtk import gtk -class SomeObject(dbus.Object): - def __init__(self, service): - dbus.Object.__init__(self, "/SomeObject", service) +class SomeObject(dbus.service.Object): + def __init__(self, name): + dbus.service.Object.__init__(self, "/SomeObject", name) - @dbus.method("org.designfu.SampleInterface") + @dbus.service.method("org.designfu.SampleInterface") def HelloWorld(self, hello_message): print (str(hello_message)) return ["Hello", " from example-service.py"] - @dbus.method("org.designfu.SampleInterface") + @dbus.service.method("org.designfu.SampleInterface") def GetTuple(self): return ("Hello Tuple", " from example-service.py") - @dbus.method("org.designfu.SampleInterface") + @dbus.service.method("org.designfu.SampleInterface") def GetDict(self): return {"first": "Hello Dict", "second": " from example-service.py"} session_bus = dbus.SessionBus() -service = dbus.Service("org.designfu.SampleService", bus=session_bus) -object = SomeObject(service) +name = dbus.service.Name("org.designfu.SampleService", bus=session_bus) +object = SomeObject(name) gtk.main() diff --git a/python/examples/example-signal-emitter.py b/python/examples/example-signal-emitter.py index 428f1440..64c7f177 100644 --- a/python/examples/example-signal-emitter.py +++ b/python/examples/example-signal-emitter.py @@ -1,26 +1,27 @@ #!/usr/bin/env python import dbus +import dbus.service import gtk -class TestObject(dbus.Object): - def __init__(self, service): - dbus.Object.__init__(self, "/org/designfu/TestService/object", service) +class TestObject(dbus.service.Object): + def __init__(self, name): + dbus.service.Object.__init__(self, "/org/designfu/TestService/object", name) - @dbus.signal('org.designfu.TestService') + @dbus.service.signal('org.designfu.TestService') def HelloSignal(self, message): # The signal is emitted when this method exits # You can have code here if you wish pass - @dbus.method('org.designfu.TestService') + @dbus.service.method('org.designfu.TestService') def emitHelloSignal(self): #you emit signals by calling the signal's skeleton method self.HelloSignal("Hello") return "Signal emitted" session_bus = dbus.SessionBus() -service = dbus.Service("org.designfu.TestService", bus=session_bus) -object = TestObject(service) +name = dbus.service.Name("org.designfu.TestService", bus=session_bus) +object = TestObject(name) gtk.main() diff --git a/python/examples/gconf-proxy-service.py b/python/examples/gconf-proxy-service.py index 18c8047f..b9bdef14 100644 --- a/python/examples/gconf-proxy-service.py +++ b/python/examples/gconf-proxy-service.py @@ -1,5 +1,5 @@ #!/usr/bin/env python - +#FIXME: Doesn't work with the new bindings import dbus import gtk diff --git a/python/examples/gconf-proxy-service2.py b/python/examples/gconf-proxy-service2.py index 3667a853..ba8d249b 100644 --- a/python/examples/gconf-proxy-service2.py +++ b/python/examples/gconf-proxy-service2.py @@ -1,5 +1,5 @@ #!/usr/bin/env python - +#FIXME: doesn't work with the new bindings import dbus import gtk diff --git a/python/glib.py b/python/glib.py new file mode 100644 index 00000000..8e781422 --- /dev/null +++ b/python/glib.py @@ -0,0 +1,15 @@ +import dbus +import dbus_glib_bindings + +def _setup_with_g_main(conn): + dbus_glib_bindings.setup_with_g_main(conn._connection) + +_dbus_gthreads_initialized = False +def init_threads(): + global _dbus_gthreads_initialized + if not _dbus_gthreads_initialized: + dbus_glib_bindings.init_gthreads () + _dbus_gthreads_initialized = True + + +setattr(dbus, "_dbus_mainloop_setup_function", _setup_with_g_main) diff --git a/python/services.py b/python/service.py index 7e0b58b7..fc044af0 100644 --- a/python/services.py +++ b/python/service.py @@ -2,10 +2,10 @@ from decorators import * import dbus_bindings -class Service: - """A base class for exporting your own Services across the Bus +class Name: + """A base class for exporting your own Named Services across the Bus - Just inherit from Service, providing the name of your service + Just inherit from Name, providing the name of your service (e.g. org.designfu.SampleService). """ def __init__(self, named_service, bus=None): @@ -155,10 +155,10 @@ class Object: """ __metaclass__ = ObjectType - def __init__(self, object_path, service): + def __init__(self, object_path, name): self._object_path = object_path - self._service = service - self._bus = service.get_bus() + self._name = name + self._bus = name.get_bus() self._connection = self._bus.get_connection() |