3 # jdahlin is the most coolest and awesomest person in the world
4 # and wrote all the good parts of this code. all the bad parts
5 # where python conditionals have a ( ) around them, thus violating
6 # PEP-8 were written by the lame wannabe python programmer seth
8 #include "dbus_h_wrapper.h"
10 cdef extern from "stdlib.h":
11 cdef void *malloc(size_t size)
12 cdef void free(void *ptr)
13 cdef void *calloc(size_t nmemb, size_t size)
15 cdef extern from "dbus-glib.h":
16 ctypedef struct GMainContext
17 cdef void dbus_connection_setup_with_g_main (DBusConnection *connection,
18 GMainContext *context)
19 cdef void dbus_server_setup_with_g_main (DBusServer *server,
20 GMainContext *context)
21 cdef void dbus_g_thread_init ()
23 cdef extern from "Python.h":
24 void Py_XINCREF (object)
25 void Py_XDECREF (object)
26 object PyString_FromStringAndSize(char *, int)
28 ctypedef struct DBusError:
38 ctypedef struct DBusMessageIter:
54 ctypedef struct DBusObjectPathVTable:
55 DBusObjectPathUnregisterFunction unregister_function
56 DBusObjectPathMessageFunction message_function
57 void (* dbus_internal_pad1) (void *)
58 void (* dbus_internal_pad2) (void *)
59 void (* dbus_internal_pad3) (void *)
60 void (* dbus_internal_pad4) (void *)
63 _user_data_references = [ ]
65 class DBusException(Exception):
68 class ConnectionError(Exception):
71 class ObjectPath(str):
72 def __init__(self, value):
76 def __init__(self, value):
83 cdef class PendingCall
85 cdef class MessageIter
87 cdef void cunregister_function_handler (DBusConnection *connection,
90 tup = <object>user_data
91 assert (type(tup) == list)
94 conn.__cinit__(None, connection)
99 cdef DBusHandlerResult cmessage_function_handler (DBusConnection *connection,
105 tup = <object>user_data
106 assert (type(tup) == list)
108 message = Message(_create=0)
109 message._set_msg(msg)
112 conn.__cinit__(None, connection)
116 retval = function(*args)
118 retval = DBUS_HANDLER_RESULT_HANDLED
122 cdef class Connection:
123 cdef DBusConnection *conn
125 def __init__(self, address=None, Connection _conn=None):
126 cdef DBusConnection *c_conn
132 if (address != None or _conn != None):
133 self.__cinit__(c_address, c_conn)
135 # hack to be able to pass in a c pointer to the constructor
136 # while still alowing python programs to create a Connection object
137 cdef __cinit__(self, address, DBusConnection *_conn):
139 dbus_error_init(&error)
142 dbus_connection_ref(self.conn)
144 self.conn = dbus_connection_open(address,
146 if dbus_error_is_set(&error):
147 raise DBusException, error.message
150 cdef _set_conn(self, DBusConnection *conn):
153 cdef DBusConnection *_get_conn(self):
156 def get_base_service(self):
157 return bus_get_base_service(self)
159 def setup_with_g_main(self):
160 dbus_connection_setup_with_g_main(self.conn, NULL)
162 def disconnect(self):
163 dbus_connection_disconnect(self.conn)
165 def get_is_connected(self):
166 return dbus_connection_get_is_connected(self.conn)
168 def get_is_authenticated(self):
169 return dbus_connection_get_is_authenticated(self.conn)
172 dbus_connection_flush(self.conn)
174 def borrow_message(self):
176 m = Message(_create=0)
177 m._set_msg(dbus_connection_borrow_message(self.conn))
180 def return_message(self, Message message):
181 cdef DBusMessage *msg
182 msg = message._get_msg()
183 dbus_connection_return_message(self.conn, msg)
185 def steal_borrowed_message(self, Message message):
186 cdef DBusMessage *msg
187 msg = message._get_msg()
188 dbus_connection_steal_borrowed_message(self.conn,
191 def pop_message(self):
192 cdef DBusMessage *msg
195 msg = dbus_connection_pop_message(self.conn)
197 m = Message(_create=0)
203 def get_dispatch_status(self):
204 return dbus_connection_get_dispatch_status(self.conn)
207 return dbus_connection_dispatch(self.conn)
209 def send(self, Message message):
210 #cdef dbus_uint32_t client_serial
211 #if type(message) != Message:
213 cdef DBusMessage *msg
214 msg = message._get_msg()
215 retval = dbus_connection_send(self.conn,
220 def send_with_reply(self, Message message, timeout_milliseconds):
221 cdef dbus_bool_t retval
222 cdef DBusPendingCall *cpending_call
224 cdef DBusMessage *msg
225 cdef PendingCall pending_call
227 dbus_error_init(&error)
231 msg = message._get_msg()
233 retval = dbus_connection_send_with_reply(self.conn,
236 timeout_milliseconds)
238 if dbus_error_is_set(&error):
239 raise DBusException, error.message
241 if (cpending_call != NULL):
242 pending_call = PendingCall()
243 pending_call.__cinit__(cpending_call)
247 return (retval, pending_call)
249 def send_with_reply_and_block(self, Message message,
250 timeout_milliseconds=0):
251 cdef DBusMessage * retval
253 cdef DBusMessage *msg
256 dbus_error_init(&error)
258 msg = message._get_msg()
260 retval = dbus_connection_send_with_reply_and_block(
263 timeout_milliseconds,
266 if dbus_error_is_set(&error):
267 raise DBusException, error.message
272 m = Message(_create=0)
276 def set_watch_functions(self, add_function, remove_function, data):
279 def set_timeout_functions(self, add_function, remove_function, data):
282 def set_wakeup_main_function(self, wakeup_main_function, data):
285 # FIXME: set_dispatch_status_function, get_unix_user, set_unix_user_function
287 def add_filter(self, filter_function):
288 user_data = [ filter_function ]
289 global _user_data_references
290 _user_data_references.append(user_data)
292 return dbus_connection_add_filter(self.conn,
293 cmessage_function_handler,
298 #FIXME: remove_filter
299 # this is pretty tricky, we want to only remove the filter
300 # if we truly have no more calls to our message_function_handler...ugh
302 def set_data(self, slot, data):
305 def get_data(self, slot):
308 def set_max_message_size(self, size):
309 dbus_connection_set_max_message_size(self.conn, size)
311 def get_max_message_size(self):
312 return dbus_connection_get_max_message_size(self.conn)
314 def set_max_received_size(self, size):
315 dbus_connection_set_max_received_size(self.conn, size)
317 def get_max_received_size(self):
318 return dbus_connection_get_max_received_size(self.conn)
320 def get_outgoing_size(self):
321 return dbus_connection_get_outgoing_size(self.conn)
323 # preallocate_send, free_preallocated_send, send_preallocated
325 def register_object_path(self, path, unregister_cb, message_cb):
326 cdef DBusObjectPathVTable cvtable
328 cvtable.unregister_function = cunregister_function_handler
329 cvtable.message_function = cmessage_function_handler
331 user_data = [message_cb, unregister_cb]
332 global _user_data_references
333 _user_data_references.append(user_data)
335 return dbus_connection_register_object_path(self.conn, path, &cvtable,
338 def register_fallback(self, path, unregister_cb, message_cb):
339 cdef DBusObjectPathVTable cvtable
341 cvtable.unregister_function = cunregister_function_handler
342 cvtable.message_function = cmessage_function_handler
344 user_data = [message_cb, unregister_cb]
345 global _user_data_references
346 _user_data_references.append(user_data)
348 return dbus_connection_register_fallback(self.conn, path, &cvtable,
351 #FIXME: unregister_object_path , see problems with remove_filter
353 def list_registered (self, parent_path):
354 cdef char **cchild_entries
355 cdef dbus_bool_t retval
357 retval = dbus_connection_list_registered(self.conn, parent_path, &cchild_entries)
360 #FIXME: raise out of memory exception?
366 while (cchild_entries[i] != NULL):
367 child_entries.append(cchild_entries[i])
370 dbus_free_string_array(cchild_entries)
375 cdef class PendingCall:
376 cdef DBusPendingCall *pending_call
378 def __init__(self, PendingCall _pending_call=None):
379 if (_pending_call != None):
380 self.__cinit__(_pending_call.pending_call)
382 cdef void __cinit__(self, DBusPendingCall *_pending_call):
383 self.pending_call = _pending_call
384 dbus_pending_call_ref(self.pending_call)
386 cdef DBusPendingCall *_get_pending_call(self):
387 return self.pending_call
390 dbus_pending_call_cancel(self.pending_call)
392 def get_completed(self):
393 return dbus_pending_call_get_completed(self.pending_call)
397 message = Message(_create=0)
398 message._set_msg(dbus_pending_call_get_reply(self.pending_call))
402 dbus_pending_call_block(self.pending_call)
405 cdef DBusWatch* watch
410 cdef __cinit__(self, DBusWatch *cwatch):
414 return dbus_watch_get_fd(self.watch)
416 # FIXME: not picked up correctly by extract.py
417 #def get_flags(self):
418 # return dbus_watch_get_flags(self.watch)
420 def handle(self, flags):
421 return dbus_watch_handle(self.watch, flags)
423 def get_enabled(self):
424 return dbus_watch_get_enabled(self.watch)
426 cdef class MessageIter:
427 cdef DBusMessageIter *iter
428 cdef DBusMessageIter real_iter
431 self.iter = &self.real_iter
433 cdef __cinit__(self, DBusMessageIter *iter):
434 self.real_iter = iter[0]
436 cdef DBusMessageIter *_get_iter(self):
440 return dbus_message_iter_has_next(self.iter)
443 return dbus_message_iter_next(self.iter)
446 arg_type = self.get_arg_type()
448 if arg_type == TYPE_INVALID:
449 raise TypeError, 'Invalid arg type in MessageIter'
450 elif arg_type == TYPE_NIL:
452 elif arg_type == TYPE_STRING:
453 retval = self.get_string()
454 elif arg_type == TYPE_INT32:
455 retval = self.get_int32()
456 elif arg_type == TYPE_UINT32:
457 retval = self.get_uint32()
458 elif arg_type == TYPE_INT64:
459 retval = self.get_int64()
460 elif arg_type == TYPE_UINT64:
461 retval = self.get_uint64()
462 elif arg_type == TYPE_DOUBLE:
463 retval = self.get_double()
464 elif arg_type == TYPE_BYTE:
465 retval = self.get_byte()
466 elif arg_type == TYPE_BOOLEAN:
467 retval = self.get_boolean()
468 elif arg_type == TYPE_ARRAY:
469 array_type = self.get_array_type()
471 if array_type == TYPE_STRING:
472 retval = self.get_string_array()
473 elif array_type == TYPE_OBJECT_PATH:
474 retval = self.get_object_path_array()
475 elif array_type == TYPE_BYTE:
476 retval = self.get_byte_array()
477 elif array_type == TYPE_INT32:
478 retval = self.get_int32_array()
479 elif array_type == TYPE_UINT32:
480 retval = self.get_uint32_array()
481 elif array_type == TYPE_INT64:
482 retval = self.get_int64_array()
483 elif array_type == TYPE_UINT64:
484 retval = self.get_uint64_array()
485 elif array_type == TYPE_DOUBLE:
486 retval = self.get_double_array()
488 raise TypeError, "Unknown array type %d in MessageIter" % (array_type)
489 elif arg_type == TYPE_DICT:
490 retval = self.get_dict()
491 elif arg_type == TYPE_OBJECT_PATH:
492 retval = self.get_object_path()
494 raise TypeError, 'Unknown arg type %d in MessageIter' % (arg_type)
499 cdef DBusMessageIter c_dict_iter
500 cdef MessageIter dict_iter
502 dbus_message_iter_init_dict_iterator(self.iter, &c_dict_iter)
504 dict_iter = MessageIter()
505 dict_iter.__cinit__(&c_dict_iter)
512 key = dict_iter.get_dict_key()
513 value = dict_iter.get()
515 if not dict_iter.has_next():
521 def get_arg_type(self):
522 return dbus_message_iter_get_arg_type(self.iter)
524 def get_array_type(self):
525 return dbus_message_iter_get_array_type(self.iter)
527 # FIXME: implement get_byte
529 # return dbus_message_iter_get_byte(self.iter)
531 def get_boolean(self):
532 return dbus_message_iter_get_boolean(self.iter)
535 return dbus_message_iter_get_int32(self.iter)
537 def get_uint32(self):
538 return dbus_message_iter_get_uint32(self.iter)
541 return dbus_message_iter_get_int64(self.iter)
543 def get_uint64(self):
544 return dbus_message_iter_get_uint64(self.iter)
546 def get_double(self):
547 return dbus_message_iter_get_double(self.iter)
549 def get_string(self):
550 return dbus_message_iter_get_string(self.iter)
552 def get_object_path(self):
553 object_path_string = dbus_message_iter_get_object_path(self.iter)
554 return ObjectPath(object_path_string)
556 def get_dict_key(self):
557 return dbus_message_iter_get_dict_key(self.iter)
559 # FIXME: implement dbus_message_iter_init_array_iterator
561 def get_byte_array(self):
563 cdef unsigned char *bytearray
565 dbus_message_iter_get_byte_array(self.iter, &bytearray, <int*>&len)
566 python_string = PyString_FromStringAndSize(<char *>bytearray, len)
569 # FIXME: implement dbus_message_iter_get_boolean_array
571 def get_int32_array(self):
573 cdef dbus_int32_t *retval
575 dbus_message_iter_get_int32_array(self.iter, &retval, <int*>&len)
577 for i from 0 <= i < len:
578 python_list.append(retval[i])
581 def get_uint32_array(self):
583 cdef dbus_uint32_t *retval
585 dbus_message_iter_get_uint32_array(self.iter, &retval, <int*>&len)
587 for i from 0 <= i < len:
588 python_list.append(retval[i])
591 def get_int64_array(self):
593 cdef dbus_int64_t *retval
595 dbus_message_iter_get_int64_array(self.iter, &retval, <int*>&len)
597 for i from 0 <= i < len:
598 python_list.append(retval[i])
601 def get_uint64_array(self):
603 cdef dbus_uint64_t *retval
605 dbus_message_iter_get_uint64_array(self.iter, &retval, <int*>&len)
607 for i from 0 <= i < len:
608 python_list.append(retval[i])
611 def get_double_array(self):
615 dbus_message_iter_get_double_array(self.iter, &retval, <int*>&len)
617 for i from 0 <= i < len:
618 python_list.append(retval[i])
622 def get_string_array(self):
626 dbus_message_iter_get_string_array(self.iter, &retval, <int*>&len)
628 for i from 0 <= i < len:
629 list.append(retval[i])
632 def get_object_path_array(self):
636 dbus_message_iter_get_object_path_array(self.iter, &retval, <int*>&len)
638 for i from 0 <= i < len:
639 list.append(ObjectPath(retval[i]))
642 # dbus_message_append_iter_init included in class Message
644 #FIXME: handle all the different types?
645 def append(self, value):
646 value_type = type(value)
648 if value_type == bool:
649 retval = self.append_boolean(value)
650 elif value_type == int:
651 retval = self.append_int32(value)
652 elif value_type == long:
653 retval = self.append_int64(value)
654 elif value_type == str:
655 retval = self.append_string(value)
656 elif value_type == float:
657 retval = self.append_double(value)
658 elif value_type == dict:
659 retval = self.append_dict(value)
660 elif value_type == list:
662 # Empty lists are currently not supported, returning None instead
663 retval = self.append(None)
665 list_type = type(value[0])
667 self.append_string_array(value)
668 elif list_type == int:
669 self.append_int32_array(value)
670 elif list_type == long:
671 self.append_int64_array(value)
672 elif list_type == float:
673 self.append_double_array(value)
674 elif isinstance(value[0], ObjectPath):
675 self.append_object_path_array(value)
677 raise TypeError, "List of unknown type '%s'" % (list_type)
678 elif value_type == None.__class__:
679 retval = self.append_nil()
680 elif isinstance(value, ObjectPath):
681 retval = self.append_object_path(value)
682 elif isinstance(value, ByteArray):
683 retval = self.append_byte_array(value)
685 raise TypeError, "Argument of unknown type '%s'" % (value_type)
689 def append_nil(self):
690 return dbus_message_iter_append_nil(self.iter)
692 def append_boolean(self, value):
693 return dbus_message_iter_append_boolean(self.iter, value)
695 def append_byte(self, value):
696 if type(value) != str or len(value) != 1:
698 return dbus_message_iter_append_byte(self.iter, ord(value))
700 def append_int32(self, value):
701 return dbus_message_iter_append_int32(self.iter, value)
703 def append_uint32(self, value):
704 return dbus_message_iter_append_uint32(self.iter, value)
706 def append_int64(self, value):
707 return dbus_message_iter_append_int64(self.iter, value)
709 def append_uint64(self, value):
710 return dbus_message_iter_append_uint64(self.iter, value)
712 def append_double(self, value):
713 return dbus_message_iter_append_double(self.iter, value)
715 def append_string(self, value):
716 return dbus_message_iter_append_string(self.iter, value)
718 def append_dict_key(self, value):
719 return dbus_message_iter_append_dict_key(self.iter, value)
721 def append_object_path(self, value):
722 return dbus_message_iter_append_object_path(self.iter, value)
724 # FIXME: append_array, append_boolean_array, append_uint32_array,
725 # append_uint64_array
727 def append_dict(self, python_dict):
728 cdef DBusMessageIter c_dict_iter
729 cdef MessageIter dict_iter
731 dbus_message_iter_append_dict(self.iter, &c_dict_iter)
733 dict_iter = MessageIter()
734 dict_iter.__cinit__(&c_dict_iter)
736 for key, value in python_dict.iteritems():
738 raise TypeError, "DBus dict keys must be strings"
739 dict_iter.append_dict_key(key)
740 dict_iter.append(value)
742 def append_byte_array(self, python_list):
743 cdef unsigned char * value
746 length = len(python_list)
747 value = <unsigned char*>malloc(length * sizeof(unsigned char))
748 for i from 0 <= i < length:
749 item = python_list[i]
750 if type(item) != str or len(item) != 1:
753 return dbus_message_iter_append_byte_array(self.iter, value, length)
755 def append_int32_array(self, python_list):
756 cdef dbus_int32_t *value
759 length = len(python_list)
760 value = <dbus_int32_t*>malloc(length * sizeof(dbus_int32_t))
761 for i from 0 <= i < length:
762 item = python_list[i]
763 if type(item) != int:
766 return dbus_message_iter_append_int32_array(self.iter, value, length)
768 def append_int64_array(self, python_list):
769 cdef dbus_int64_t *value
772 length = len(python_list)
773 value = <dbus_int64_t*>malloc(length * sizeof(dbus_int64_t))
774 for i from 0 <= i < length:
775 item = python_list[i]
776 if type(item) != int:
779 return dbus_message_iter_append_int64_array(self.iter, value, length)
781 def append_double_array(self, python_list):
785 length = len(python_list)
786 value = <double*>malloc(length * sizeof(double))
787 for i from 0 <= i < length:
788 item = python_list[i]
789 if type(item) != float:
792 return dbus_message_iter_append_double_array(self.iter, value, length)
794 def append_object_path_array(self, list):
799 value = <char**>malloc(length * sizeof(char *))
800 for i from 0 <= i < length:
802 if not isinstance(item, ObjectPath):
806 return dbus_message_iter_append_object_path_array(self.iter, value, length)
808 def append_string_array(self, python_list):
811 cdef dbus_bool_t return_code
813 length = len(python_list)
814 value = <char**>malloc(length * sizeof(char *))
815 for i from 0 <= i < length:
816 item = python_list[i]
817 if type(item) != str:
820 return dbus_message_iter_append_string_array(self.iter, value, length)
822 (MESSAGE_TYPE_INVALID, MESSAGE_TYPE_METHOD_CALL, MESSAGE_TYPE_METHOD_RETURN, MESSAGE_TYPE_ERROR, MESSAGE_TYPE_SIGNAL) = range(5)
823 (TYPE_INVALID, TYPE_NIL, TYPE_BYTE, TYPE_BOOLEAN, TYPE_INT32, TYPE_UINT32, TYPE_INT64, TYPE_UINT64, TYPE_DOUBLE, TYPE_STRING, TYPE_CUSTOM, TYPE_ARRAY, TYPE_DICT, TYPE_OBJECT_PATH) = (0, ord('v'), ord('y'), ord('b'), ord('i'), ord('u'), ord('x'), ord('t'), ord('d'), ord('s'), ord('c'), ord('a'), ord('m'), ord('o'))
824 (HANDLER_RESULT_HANDLED, HANDLER_RESULT_NOT_YET_HANDLED, HANDLER_RESULT_NEED_MEMORY) = range(3)
827 cdef DBusMessage *msg
829 def __init__(self, message_type=MESSAGE_TYPE_INVALID,
830 service=None, path=None, interface=None, method=None,
831 Message method_call=None,
833 Message reply_to=None, error_name=None, error_message=None,
836 cdef DBusMessage *cmsg
838 if (service == None):
846 if message_type == MESSAGE_TYPE_METHOD_CALL:
847 self.msg = dbus_message_new_method_call(cservice, path, interface, method)
848 elif message_type == MESSAGE_TYPE_METHOD_RETURN:
849 cmsg = method_call._get_msg()
850 self.msg = dbus_message_new_method_return(cmsg)
851 elif message_type == MESSAGE_TYPE_SIGNAL:
852 self.msg = dbus_message_new_signal(path, interface, name)
853 elif message_type == MESSAGE_TYPE_ERROR:
854 cmsg = reply_to._get_msg()
855 self.msg = dbus_message_new_error(cmsg, error_name, error_message)
857 def type_to_name(self, type):
858 if type == MESSAGE_TYPE_SIGNAL:
860 elif type == MESSAGE_TYPE_METHOD_CALL:
862 elif type == MESSAGE_TYPE_METHOD_RETURN:
863 return "method return"
864 elif type == MESSAGE_TYPE_ERROR:
867 return "(unknown message type)"
870 message_type = self.get_type()
871 sender = self.get_sender()
874 sender = "(no sender)"
876 if (message_type == MESSAGE_TYPE_METHOD_CALL) or (message_type == MESSAGE_TYPE_SIGNAL):
877 retval = '%s interface=%s; member=%s; sender=%s' % (self.type_to_name(message_type),
878 self.get_interface(),
881 elif message_type == MESSAGE_TYPE_METHOD_RETURN:
882 retval = '%s sender=%s' % (self.type_to_name(message_type),
884 elif message_type == MESSAGE_TYPE_ERROR:
885 retval = '%s name=%s; sender=%s' % (self.type_to_name(message_type),
886 self.get_error_name(),
889 retval = "Message of unknown type %d" % (message_type)
892 # FIXME: should really use self.convert_to_tuple() here
894 iter = self.get_iter()
897 while (value_at_iter):
898 type = iter.get_arg_type()
900 if type == TYPE_INVALID:
902 elif type == TYPE_NIL:
904 elif type == TYPE_STRING:
905 str = iter.get_string()
906 arg = 'string:%s\n' % (str)
907 elif type == TYPE_OBJECT_PATH:
908 path = iter.get_object_path()
909 arg = 'object_path:%s\n' % (path)
910 elif type == TYPE_INT32:
911 num = iter.get_int32()
912 arg = 'int32:%d\n' % (num)
913 elif type == TYPE_UINT32:
914 num = iter.get_uint32()
915 arg = 'uint32:%u\n' % (num)
916 elif type == TYPE_INT64:
917 num = iter.get_int64()
918 arg = 'int64:%d\n' % (num)
919 elif type == TYPE_UINT64:
920 num = iter.get_uint64()
921 arg = 'uint64:%u\n' % (num)
922 elif type == TYPE_DOUBLE:
923 num = iter.get_double()
924 arg = 'double:%f\n' % (num)
925 elif type == TYPE_BYTE:
926 num = iter.get_byte()
927 arg = 'byte:%d\n' % (num)
928 elif type == TYPE_BOOLEAN:
929 bool = iter.get_boolean()
934 arg = 'boolean:%s\n' % (str)
936 arg = '(unknown arg type %d)\n' % type
938 retval = retval + arg
939 value_at_iter = iter.next()
943 cdef _set_msg(self, DBusMessage *msg):
946 cdef DBusMessage *_get_msg(self):
950 cdef DBusMessageIter iter
951 cdef MessageIter message_iter
952 cdef DBusMessage *msg
954 msg = self._get_msg()
955 dbus_message_iter_init(msg, &iter)
957 message_iter = MessageIter()
958 message_iter.__cinit__(&iter)
962 def get_args_list(self):
965 iter = self.get_iter()
967 retval.append(iter.get())
971 value_at_iter = iter.next()
972 while (value_at_iter):
973 retval.append(iter.get())
974 value_at_iter = iter.next()
978 # FIXME: implement dbus_message_copy?
981 return dbus_message_get_type(self.msg)
983 def set_path(self, object_path):
984 return dbus_message_set_path(self.msg, object_path)
987 return dbus_message_get_path(self.msg)
989 def set_interface(self, interface):
990 return dbus_message_set_interface(self.msg, interface)
992 def get_interface(self):
993 return dbus_message_get_interface(self.msg)
995 def set_member(self, member):
996 return dbus_message_set_member(self.msg, member)
998 def get_member(self):
999 return dbus_message_get_member(self.msg)
1001 def set_error_name(self, name):
1002 return dbus_message_set_error_name(self.msg, name)
1004 def get_error_name(self):
1005 return dbus_message_get_error_name(self.msg)
1007 def set_destination(self, destination):
1008 return dbus_message_set_destination(self.msg, destination)
1010 def get_destination(self):
1011 return dbus_message_get_destination(self.msg)
1013 def set_sender(self, sender):
1014 return dbus_message_set_sender(self.msg, sender)
1016 def get_sender(self):
1018 sender = dbus_message_get_sender(self.msg)
1019 if (sender == NULL):
1024 def set_no_reply(self, no_reply):
1025 dbus_message_set_no_reply(self.msg, no_reply)
1027 def get_no_reply(self):
1028 return dbus_message_get_no_reply(self.msg)
1030 def is_method_call(self, interface, method):
1031 return dbus_message_is_method_call(self.msg, interface, method)
1033 def is_signal(self, interface, signal_name):
1034 return dbus_message_is_signal(self.msg, interface, signal_name)
1036 def is_error(self, error_name):
1037 return dbus_message_is_error(self.msg, error_name)
1039 def has_destination(self, service):
1040 return dbus_message_has_destination(self.msg, service)
1042 def has_sender(self, service):
1043 return dbus_message_has_sender(self.msg, service)
1045 def get_serial(self):
1046 return dbus_message_get_serial(self.msg)
1048 def set_reply_serial(self, reply_serial):
1049 return dbus_message_set_reply_serial(self.msg, reply_serial)
1051 def get_reply_serial(self):
1052 return dbus_message_get_reply_serial(self.msg)
1054 #FIXME: dbus_message_get_path_decomposed
1056 # FIXME: all the different dbus_message_*args* methods
1058 class Signal(Message):
1059 def __init__(self, spath, sinterface, sname):
1060 Message.__init__(self, MESSAGE_TYPE_SIGNAL, path=spath, interface=sinterface, name=sname)
1062 class MethodCall(Message):
1063 def __init__(self, mpath, minterface, mmethod):
1064 Message.__init__(self, MESSAGE_TYPE_METHOD_CALL, path=mpath, interface=minterface, method=mmethod)
1066 class MethodReturn(Message):
1067 def __init__(self, method_call):
1068 Message.__init__(self, MESSAGE_TYPE_METHOD_RETURN, method_call=method_call)
1070 class Error(Message):
1071 def __init__(self, reply_to, error_name, error_message):
1072 Message.__init__(self, MESSAGE_TYPE_ERROR, reply_to=reply_to, error_name=error_name, error_message=error_message)
1075 cdef DBusServer *server
1076 def __init__(self, address):
1077 cdef DBusError error
1078 dbus_error_init(&error)
1079 self.server = dbus_server_listen(address,
1081 if dbus_error_is_set(&error):
1082 raise DBusException, error.message
1084 def setup_with_g_main (self):
1085 dbus_server_setup_with_g_main(self.server, NULL)
1087 def disconnect(self):
1088 dbus_server_disconnect(self.server)
1090 def get_is_connected(self):
1091 return dbus_server_get_is_connected(self.server)
1093 # def set_new_connection_function(self, function, data):
1094 # dbus_server_set_new_connection_function(self.conn, function,
1097 # def set_watch_functions(self, add_function, remove_function, data):
1098 # dbus_server_set_watch_functions(self.server,
1099 # add_function, remove_function,
1102 # def set_timeout_functions(self, add_function, remove_function, data):
1103 # dbus_server_set_timeout_functions(self.server,
1104 # add_function, remove_function,
1107 # def handle_watch(self, watch, condition):
1108 # dbus_server_handle_watch(self.conn, watch, condition)
1110 BUS_SESSION = DBUS_BUS_SESSION
1111 BUS_SYSTEM = DBUS_BUS_SYSTEM
1112 BUS_ACTIVATION = DBUS_BUS_ACTIVATION
1114 def bus_get (bus_type):
1115 cdef DBusError error
1116 cdef Connection conn
1117 dbus_error_init(&error)
1118 cdef DBusConnection *connection
1120 connection = dbus_bus_get(bus_type,
1123 if dbus_error_is_set(&error):
1124 raise DBusException, error.message
1127 conn.__cinit__(None, connection)
1130 def bus_get_base_service(Connection connection):
1131 cdef DBusConnection *conn
1132 conn = connection._get_conn()
1133 return dbus_bus_get_base_service(conn)
1135 def bus_register(Connection connection):
1136 cdef DBusError error
1137 dbus_error_init(&error)
1138 cdef dbus_bool_t retval
1139 cdef DBusConnection *conn
1141 conn = connection._get_conn()
1142 retval = dbus_bus_register(conn,
1144 if dbus_error_is_set(&error):
1145 raise DBusException, error.message
1149 SERVICE_FLAG_PROHIBIT_REPLACEMENT = 0x1
1150 SERVICE_FLAG_REPLACE_EXISTING = 0x2
1152 def bus_acquire_service(Connection connection, service_name, flags=0):
1153 cdef DBusError error
1154 dbus_error_init(&error)
1156 cdef DBusConnection *conn
1158 conn = connection._get_conn()
1159 retval = dbus_bus_acquire_service(conn,
1163 if dbus_error_is_set(&error):
1164 raise DBusException, error.message
1167 def bus_service_exists(Connection connection, service_name):
1168 cdef DBusError error
1169 dbus_error_init(&error)
1170 cdef dbus_bool_t retval
1171 cdef DBusConnection *conn
1173 conn = connection._get_conn()
1174 retval = dbus_bus_service_exists(conn,
1177 if dbus_error_is_set(&error):
1178 raise DBusException, error.message
1181 def bus_add_match(Connection connection, rule):
1182 cdef DBusError error
1183 cdef DBusConnection *conn
1185 dbus_error_init(&error)
1187 conn = connection._get_conn()
1188 dbus_bus_add_match (conn, rule, &error)
1190 if dbus_error_is_set(&error):
1191 raise DBusException, error.message
1193 def bus_remove_match(Connection connection, rule):
1194 cdef DBusError error
1195 cdef DBusConnection *conn
1197 dbus_error_init(&error)
1199 conn = connection._get_conn()
1200 dbus_bus_remove_match (conn, rule, &error)
1202 if dbus_error_is_set(&error):
1203 raise DBusException, error.message
1205 def init_gthreads ():
1206 dbus_g_thread_init ()