summaryrefslogtreecommitdiffstats
path: root/python/dbus_bindings.pyx.in
diff options
context:
space:
mode:
Diffstat (limited to 'python/dbus_bindings.pyx.in')
-rw-r--r--python/dbus_bindings.pyx.in722
1 files changed, 337 insertions, 385 deletions
diff --git a/python/dbus_bindings.pyx.in b/python/dbus_bindings.pyx.in
index 6681c458..797b0e51 100644
--- a/python/dbus_bindings.pyx.in
+++ b/python/dbus_bindings.pyx.in
@@ -5,8 +5,6 @@
# where python conditionals have a ( ) around them, thus violating
# PEP-8 were written by the lame wannabe python programmer seth
-#FIXME: find memory leaks that I am sure exist
-
#include "dbus_h_wrapper.h"
cdef extern from "stdlib.h":
@@ -78,9 +76,6 @@ class ByteArray(str):
def __init__(self, value):
str.__init__(value)
-class Signature(str):
- def __init__(self, value):
- str.__init__(value)
#forward delcerations
cdef class Connection
@@ -158,8 +153,8 @@ cdef class Connection:
cdef DBusConnection *_get_conn(self):
return self.conn
- def get_unique_name(self):
- return bus_get_unique_name(self)
+ def get_base_service(self):
+ return bus_get_base_service(self)
def setup_with_g_main(self):
dbus_connection_setup_with_g_main(self.conn, NULL)
@@ -431,17 +426,13 @@ cdef class Watch:
cdef class MessageIter:
cdef DBusMessageIter *iter
cdef DBusMessageIter real_iter
- cdef dbus_uint32_t level
- def __init__(self, level=0):
+ def __init__(self):
self.iter = &self.real_iter
- self.level = level
- if(self.level > 32):
- raise TypeError, 'Type recurion is too deep'
-
+
cdef __cinit__(self, DBusMessageIter *iter):
self.real_iter = iter[0]
-
+
cdef DBusMessageIter *_get_iter(self):
return self.iter
@@ -451,18 +442,15 @@ cdef class MessageIter:
def next(self):
return dbus_message_iter_next(self.iter)
- def get(self, arg_type=None):
- if(arg_type == None):
- arg_type = self.get_arg_type()
+ def get(self):
+ arg_type = self.get_arg_type()
if arg_type == TYPE_INVALID:
raise TypeError, 'Invalid arg type in MessageIter'
+ elif arg_type == TYPE_NIL:
+ retval = None
elif arg_type == TYPE_STRING:
retval = self.get_string()
- elif arg_type == TYPE_INT16:
- retval = self.get_int16()
- elif arg_type == TYPE_UINT16:
- retval = self.get_uint16()
elif arg_type == TYPE_INT32:
retval = self.get_int32()
elif arg_type == TYPE_UINT32:
@@ -477,227 +465,186 @@ cdef class MessageIter:
retval = self.get_byte()
elif arg_type == TYPE_BOOLEAN:
retval = self.get_boolean()
- elif arg_type == TYPE_SIGNATURE:
- retval = self.get_signature()
elif arg_type == TYPE_ARRAY:
- array_type = self.get_element_type()
- if array_type == TYPE_DICT_ENTRY:
- retval = self.get_dict()
+ array_type = self.get_array_type()
+
+ if array_type == TYPE_STRING:
+ retval = self.get_string_array()
+ elif array_type == TYPE_OBJECT_PATH:
+ retval = self.get_object_path_array()
+ elif array_type == TYPE_BYTE:
+ retval = self.get_byte_array()
+ elif array_type == TYPE_INT32:
+ retval = self.get_int32_array()
+ elif array_type == TYPE_UINT32:
+ retval = self.get_uint32_array()
+ elif array_type == TYPE_INT64:
+ retval = self.get_int64_array()
+ elif array_type == TYPE_UINT64:
+ retval = self.get_uint64_array()
+ elif array_type == TYPE_DOUBLE:
+ retval = self.get_double_array()
else:
- retval = self.get_array(array_type)
+ raise TypeError, "Unknown array type %d in MessageIter" % (array_type)
+ elif arg_type == TYPE_DICT:
+ retval = self.get_dict()
elif arg_type == TYPE_OBJECT_PATH:
retval = self.get_object_path()
- elif arg_type == TYPE_STRUCT:
- retval = self.get_struct()
- elif arg_type == TYPE_VARIANT:
- retval = self.get_variant()
- elif arg_type == TYPE_DICT_ENTRY:
- raise TypeError, 'Dictionary Entries can only appear as part of an array container'
else:
raise TypeError, 'Unknown arg type %d in MessageIter' % (arg_type)
return retval
- def get_arg_type(self):
- return dbus_message_iter_get_arg_type(self.iter)
+ def get_dict(self):
+ cdef DBusMessageIter c_dict_iter
+ cdef MessageIter dict_iter
+
+ dbus_message_iter_init_dict_iterator(self.iter, &c_dict_iter)
- def get_element_type(self):
- return dbus_message_iter_get_element_type(self.iter)
+ dict_iter = MessageIter()
+ dict_iter.__cinit__(&c_dict_iter)
- def get_byte(self):
- cdef char c_val
- dbus_message_iter_get_basic(self.iter, <char *>&c_val)
- return c_val
-
- def get_boolean(self):
- cdef dbus_bool_t c_val
- dbus_message_iter_get_basic(self.iter, <dbus_bool_t *>&c_val)
- return c_val
+ dict = {}
+
+ end_of_dict = False
+
+ while True:
+ key = dict_iter.get_dict_key()
+ value = dict_iter.get()
+ dict[key] = value
+ if not dict_iter.has_next():
+ break
+ dict_iter.next()
+
+ return dict
- def get_signature(self):
- signature_string = self.get_string()
- return Signature(signature_string)
+ def get_arg_type(self):
+ return dbus_message_iter_get_arg_type(self.iter)
- def get_int16(self):
- cdef dbus_int16_t c_val
- dbus_message_iter_get_basic(self.iter, <dbus_int16_t *>&c_val)
- return c_val
+ def get_array_type(self):
+ return dbus_message_iter_get_array_type(self.iter)
- def get_uint16(self):
- cdef dbus_uint16_t c_val
- dbus_message_iter_get_basic(self.iter, <dbus_uint16_t *>&c_val)
- return c_val
+ # FIXME: implement get_byte
+ #def get_byte(self):
+ # return dbus_message_iter_get_byte(self.iter)
+ def get_boolean(self):
+ return dbus_message_iter_get_boolean(self.iter)
+
def get_int32(self):
- cdef dbus_int32_t c_val
- dbus_message_iter_get_basic(self.iter, <dbus_int32_t *>&c_val)
- return c_val
-
+ return dbus_message_iter_get_int32(self.iter)
+
def get_uint32(self):
- cdef dbus_uint32_t c_val
- dbus_message_iter_get_basic(self.iter, <dbus_uint32_t *>&c_val)
- return c_val
-
+ return dbus_message_iter_get_uint32(self.iter)
+
def get_int64(self):
- cdef dbus_int64_t c_val
- dbus_message_iter_get_basic(self.iter, <dbus_int64_t *>&c_val)
- return c_val
+ return dbus_message_iter_get_int64(self.iter)
def get_uint64(self):
- cdef dbus_uint64_t c_val
- dbus_message_iter_get_basic(self.iter, <dbus_uint64_t *>&c_val)
- return c_val
+ return dbus_message_iter_get_uint64(self.iter)
def get_double(self):
- cdef double c_val
- dbus_message_iter_get_basic(self.iter, <double *>&c_val)
- return c_val
+ return dbus_message_iter_get_double(self.iter)
def get_string(self):
- cdef char *c_str
- dbus_message_iter_get_basic(self.iter, <char **>&c_str)
- return c_str
+ return dbus_message_iter_get_string(self.iter)
def get_object_path(self):
- object_path_string = self.get_string()
+ object_path_string = dbus_message_iter_get_object_path(self.iter)
return ObjectPath(object_path_string)
+
+ def get_dict_key(self):
+ return dbus_message_iter_get_dict_key(self.iter)
- def get_dict(self):
- cdef DBusMessageIter c_dict_iter
- cdef MessageIter dict_iter
- level = self.level + 1
-
- dbus_message_iter_recurse(self.iter, <DBusMessageIter *>&c_dict_iter)
- dict_iter = MessageIter(level)
- dict_iter.__cinit__(&c_dict_iter)
-
- python_dict = {}
- cur_arg_type = dict_iter.get_arg_type()
- while cur_arg_type == TYPE_DICT_ENTRY:
- if cur_arg_type != TYPE_DICT_ENTRY:
- raise TypeError, "Dictionary elements must be of type TYPE_DICT_ENTRY '%s != %s'" % (TYPE_DICT_ENTRY, cur_arg_type)
-
- dict_entry = dict_iter.get_struct()
- if len(dict_entry) != 2:
- raise TypeError, "Dictionary entries must be structs of two elements. This entry had %i elements.'" % (len(dict_entry))
-
- python_dict[dict_entry[0]] = dict_entry[1]
-
- dict_iter.next()
- cur_arg_type = dict_iter.get_arg_type()
-
- return python_dict
-
- def get_array(self, type):
- cdef DBusMessageIter c_array_iter
- cdef MessageIter array_iter
- level = self.level + 1
-
- dbus_message_iter_recurse(self.iter, <DBusMessageIter *>&c_array_iter)
- array_iter = MessageIter(level)
- array_iter.__cinit__(&c_array_iter)
-
+ # FIXME: implement dbus_message_iter_init_array_iterator
+
+ def get_byte_array(self):
+ cdef int len
+ cdef unsigned char *bytearray
+ cdef int i
+ dbus_message_iter_get_byte_array(self.iter, &bytearray, <int*>&len)
+ python_string = PyString_FromStringAndSize(<char *>bytearray, len)
+ return python_string
+
+ # FIXME: implement dbus_message_iter_get_boolean_array
+
+ def get_int32_array(self):
+ cdef int len
+ cdef dbus_int32_t *retval
+ cdef int i
+ dbus_message_iter_get_int32_array(self.iter, &retval, <int*>&len)
python_list = []
- cur_arg_type = array_iter.get_arg_type()
- while cur_arg_type != TYPE_INVALID:
- if cur_arg_type != type:
- raise TypeError, "Array elements must be of the same type '%s != %s'" % (type, cur_arg_type)
-
- value = array_iter.get(type)
- python_list.append(value)
-
- array_iter.next()
- cur_arg_type = array_iter.get_arg_type()
-
+ for i from 0 <= i < len:
+ python_list.append(retval[i])
return python_list
- def get_variant(self):
- cdef DBusMessageIter c_var_iter
- cdef MessageIter var_iter
- level = self.level + 1
-
- dbus_message_iter_recurse(self.iter, <DBusMessageIter *>&c_var_iter)
- var_iter = MessageIter(level)
- var_iter.__cinit__(&c_var_iter)
-
- return var_iter.get()
+ def get_uint32_array(self):
+ cdef int len
+ cdef dbus_uint32_t *retval
+ cdef int i
+ dbus_message_iter_get_uint32_array(self.iter, &retval, <int*>&len)
+ python_list = []
+ for i from 0 <= i < len:
+ python_list.append(retval[i])
+ return python_list
- def get_struct(self):
- cdef DBusMessageIter c_struct_iter
- cdef MessageIter struct_iter
- level = self.level + 1
+ def get_int64_array(self):
+ cdef int len
+ cdef dbus_int64_t *retval
+ cdef int i
+ dbus_message_iter_get_int64_array(self.iter, &retval, <int*>&len)
+ python_list = []
+ for i from 0 <= i < len:
+ python_list.append(retval[i])
+ return python_list
- dbus_message_iter_recurse(self.iter, <DBusMessageIter *>&c_struct_iter)
- struct_iter = MessageIter(level)
- struct_iter.__cinit__(&c_struct_iter)
+ def get_uint64_array(self):
+ cdef int len
+ cdef dbus_uint64_t *retval
+ cdef int i
+ dbus_message_iter_get_uint64_array(self.iter, &retval, <int*>&len)
+ python_list = []
+ for i from 0 <= i < len:
+ python_list.append(retval[i])
+ return python_list
+ def get_double_array(self):
+ cdef int len
+ cdef double *retval
+ cdef int i
+ dbus_message_iter_get_double_array(self.iter, &retval, <int*>&len)
python_list = []
- while struct_iter.get_arg_type() != TYPE_INVALID:
- value = struct_iter.get()
- python_list.append(value)
-
- struct_iter.next()
-
- return tuple(python_list)
-
- def python_value_to_dbus_sig(self, value, level = 0):
-
- if(level > 32):
- raise TypeError, 'Type recurion is too deep'
-
- level = level + 1
-
- ptype = type(value)
- ret = ""
- if ptype == bool:
- ret = TYPE_BOOL
- ret = str(chr(ret))
- elif ptype == int:
- ret = TYPE_INT32
- ret = str(chr(ret))
- elif ptype == long:
- ret = TYPE_INT64
- ret = str(chr(ret))
- elif ptype == str:
- ret = TYPE_STRING
- ret = str(chr(ret))
- elif ptype == float:
- ret = TYPE_FLOAT
- ret = str(chr(ret))
- elif ptype == dict:
- dict_list = value.items()
- key, value = dict_list[0]
-
- ret = str(chr(TYPE_ARRAY)) + str(chr(DICT_ENTRY_BEGIN))
- ret = ret + self.python_value_to_dbus_sig(key, level)
- ret = ret + self.python_value_to_dbus_sig(value, level)
- ret = ret + str(chr(DICT_ENTRY_END))
-
- elif ptype == tuple:
- ret = str(chr(STRUCT_BEGIN))
- for item in value:
- ret = ret + self.python_value_to_dbus_sig(item, level)
- ret = ret + str(chr(STRUCT_END))
- elif ptype == list:
- ret = str(chr(TYPE_ARRAY))
- ret = ret + self.python_value_to_dbus_sig(value[0], level)
- elif isinstance(value, ObjectPath):
- ret = TYPE_PATH
- ret = str(chr(ret))
- elif isinstance(ByteArray):
- ret = str(chr(TYPE_ARRAY)) + str(chr(TYPE_BYTE))
- elif isinstance(Signature):
- ret = TYPE_SIGNATURE
- ret = str(chr(ret))
- else:
- raise TypeError, "Argument of unknown type '%s'" % (ptype)
+ for i from 0 <= i < len:
+ python_list.append(retval[i])
+ return python_list
- return ret
-
+ def get_string_array(self):
+ cdef int len
+ cdef char **retval
+ cdef int i
+ dbus_message_iter_get_string_array(self.iter, &retval, <int*>&len)
+ list = []
+ for i from 0 <= i < len:
+ list.append(retval[i])
+ return list
+
+ def get_object_path_array(self):
+ cdef int len
+ cdef char **retval
+ cdef int i
+ dbus_message_iter_get_object_path_array(self.iter, &retval, <int*>&len)
+ list = []
+ for i from 0 <= i < len:
+ list.append(ObjectPath(retval[i]))
+ return list
+
+ # dbus_message_append_iter_init included in class Message
+
#FIXME: handle all the different types?
def append(self, value):
value_type = type(value)
+
if value_type == bool:
retval = self.append_boolean(value)
elif value_type == int:
@@ -710,204 +657,170 @@ cdef class MessageIter:
retval = self.append_double(value)
elif value_type == dict:
retval = self.append_dict(value)
- elif value_type == tuple:
- retval = self.append_struct(value)
elif value_type == list:
- retval = self.append_array(value)
- #elif value_type == None.__class__:
- # retval = self.append_nil()
+ if len(value) == 0:
+ # Empty lists are currently not supported, returning None instead
+ retval = self.append(None)
+ else:
+ list_type = type(value[0])
+ if list_type == str:
+ self.append_string_array(value)
+ elif list_type == int:
+ self.append_int32_array(value)
+ elif list_type == long:
+ self.append_int64_array(value)
+ elif list_type == float:
+ self.append_double_array(value)
+ elif isinstance(value[0], ObjectPath):
+ self.append_object_path_array(value)
+ else:
+ raise TypeError, "List of unknown type '%s'" % (list_type)
+ elif value_type == None.__class__:
+ retval = self.append_nil()
elif isinstance(value, ObjectPath):
retval = self.append_object_path(value)
elif isinstance(value, ByteArray):
- retval = self.append_array(value)
- elif isinstance(value, Signature):
- retval = self.append_signature(value)
+ retval = self.append_byte_array(value)
else:
raise TypeError, "Argument of unknown type '%s'" % (value_type)
return retval
+ def append_nil(self):
+ return dbus_message_iter_append_nil(self.iter)
+
def append_boolean(self, value):
- cdef dbus_bool_t c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_BOOLEAN, <dbus_bool_t *>&c_value)
+ return dbus_message_iter_append_boolean(self.iter, value)
def append_byte(self, value):
- cdef char b
if type(value) != str or len(value) != 1:
raise TypeError
-
- b = ord(value)
- return dbus_message_iter_append_basic(self.iter, TYPE_BYTE, <char *>&b)
+ return dbus_message_iter_append_byte(self.iter, ord(value))
def append_int32(self, value):
- cdef dbus_int32_t c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_INT32, <dbus_int32_t *>&c_value)
+ return dbus_message_iter_append_int32(self.iter, value)
def append_uint32(self, value):
- cdef dbus_uint32_t c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_UINT32, <dbus_uint32_t *>&c_value)
+ return dbus_message_iter_append_uint32(self.iter, value)
def append_int64(self, value):
- cdef dbus_int64_t c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_INT64, <dbus_int64_t *>&c_value)
+ return dbus_message_iter_append_int64(self.iter, value)
def append_uint64(self, value):
- cdef dbus_uint64_t c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_UINT64, <dbus_uint64_t *>&c_value)
+ return dbus_message_iter_append_uint64(self.iter, value)
def append_double(self, value):
- cdef double c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_DOUBLE, <double *>&c_value)
+ return dbus_message_iter_append_double(self.iter, value)
def append_string(self, value):
- cdef char *c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_STRING, <char **>&c_value)
+ return dbus_message_iter_append_string(self.iter, value)
- def append_object_path(self, value):
- cdef char *c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_PATH, <char **>&c_value)
+ def append_dict_key(self, value):
+ return dbus_message_iter_append_dict_key(self.iter, value)
- def append_signature(self, value):
- cdef char *c_value
- c_value = value
- return dbus_message_iter_append_basic(self.iter, TYPE_SIGNATURE, <char **>&c_value)
+ def append_object_path(self, value):
+ return dbus_message_iter_append_object_path(self.iter, value)
+ # FIXME: append_array, append_boolean_array, append_uint32_array,
+ # append_uint64_array
def append_dict(self, python_dict):
- cdef DBusMessageIter c_dict_iter, c_dict_entry_iter
- cdef MessageIter dict_iter, dict_entry_iter
+ cdef DBusMessageIter c_dict_iter
+ cdef MessageIter dict_iter
- level = self.level + 1
-
- dict_list = python_dict.items()
- key, value = dict_list[0]
-
- sig = str(chr(DICT_ENTRY_BEGIN))
- sig = sig + self.python_value_to_dbus_sig(key)
- sig = sig + self.python_value_to_dbus_sig(value)
- sig = sig + str(chr(DICT_ENTRY_END))
-
- dbus_message_iter_open_container(self.iter, TYPE_ARRAY, sig, <DBusMessageIter *>&c_dict_iter)
- dict_iter = MessageIter(level)
- dict_iter.__cinit__(&c_dict_iter)
-
- for key, value in dict_list:
- dbus_message_iter_open_container(dict_iter.iter, TYPE_DICT_ENTRY, sig, <DBusMessageIter *>&c_dict_entry_iter)
- dict_entry_iter = MessageIter(level)
- dict_entry_iter.__cinit__(&c_dict_entry_iter)
-
- dict_entry_iter.append(key)
- dict_entry_iter.append(value)
-
- dbus_message_iter_close_container(dict_iter.iter, dict_entry_iter.iter)
-
- dbus_message_iter_close_container(self.iter, dict_iter.iter)
-
- def append_struct(self, python_struct):
- cdef DBusMessageIter c_struct_iter
- cdef MessageIter struct_iter
-
- level = self.level + 1
- dbus_message_iter_open_container(self.iter, TYPE_STRUCT, NULL, <DBusMessageIter *>&c_struct_iter)
- struct_iter = MessageIter(level)
- struct_iter.__cinit__(&c_struct_iter)
+ dbus_message_iter_append_dict(self.iter, &c_dict_iter)
- for item in python_struct:
- if not struct_iter.append(item):
- dbus_message_iter_close_container(self.iter, struct_iter.iter)
- return False
-
- dbus_message_iter_close_container(self.iter, struct_iter.iter)
-
- def append_array(self, python_list):
- cdef DBusMessageIter c_array_iter
- cdef MessageIter array_iter
-
- level = self.level + 1
- sig = self.python_value_to_dbus_sig(python_list[0])
+ dict_iter = MessageIter()
+ dict_iter.__cinit__(&c_dict_iter)
- dbus_message_iter_open_container(self.iter, TYPE_ARRAY, sig, <DBusMessageIter *>&c_array_iter)
- array_iter = MessageIter(level)
- array_iter.__cinit__(&c_array_iter)
+ for key, value in python_dict.iteritems():
+ if type(key) != str:
+ raise TypeError, "DBus dict keys must be strings"
+ dict_iter.append_dict_key(key)
+ dict_iter.append(value)
+ def append_byte_array(self, python_list):
+ cdef unsigned char * value
+ cdef int length
+ cdef int i
length = len(python_list)
- for item in python_list:
- if not array_iter.append(item):
- dbus_message_iter_close_container(self.iter, array_iter.iter)
- return False
-
- dbus_message_iter_close_container(self.iter, array_iter.iter)
-
- return True
-
- def __str__(self):
- cdef DBusMessageIter c_array_iter
- cdef MessageIter array_iter
-
- value_at_iter = True
- retval = ""
- while (value_at_iter):
- type = self.get_arg_type()
- if type == TYPE_INVALID:
- break
- elif type == TYPE_STRING:
- str = iter.get_string()
- arg = 'string:%s\n' % (str)
- elif type == TYPE_OBJECT_PATH:
- path = iter.get_object_path()
- arg = 'object_path:%s\n' % (path)
- elif type == TYPE_INT32:
- num = iter.get_int32()
- arg = 'int32:%d\n' % (num)
- elif type == TYPE_UINT32:
- num = iter.get_uint32()
- arg = 'uint32:%u\n' % (num)
- elif type == TYPE_INT64:
- num = iter.get_int64()
- arg = 'int64:%d\n' % (num)
- elif type == TYPE_UINT64:
- num = iter.get_uint64()
- arg = 'uint64:%u\n' % (num)
- elif type == TYPE_DOUBLE:
- num = iter.get_double()
- arg = 'double:%f\n' % (num)
- elif type == TYPE_BYTE:
- num = iter.get_byte()
- arg = 'byte:%x(%s)\n' % (num, str(chr(num)))
- elif type == TYPE_BOOLEAN:
- bool = iter.get_boolean()
- if (bool):
- str = "true"
- else:
- str = "false"
- arg = 'boolean:%s\n' % (str)
- elif type == TYPE_ARRAY:
- dbus_message_iter_recurse(self.iter, <DBusMessageIter *>&c_array_iter)
- array_iter = MessageIter(self.level + 1)
- array_iter.__cinit__(&c_array_iter)
- if array_iter.has_next():
- arg = 'array [' + str(array_iter) + ']'
- else:
- arg = 'array []'
- else:
- arg = '(unknown arg type %d)\n' % type
-
- retval = retval + arg
- value_at_iter = self.next()
-
- return retval
-
+ value = <unsigned char*>malloc(length * sizeof(unsigned char))
+ for i from 0 <= i < length:
+ item = python_list[i]
+ if type(item) != str or len(item) != 1:
+ raise TypeError
+ value[i] = ord(item)
+ return dbus_message_iter_append_byte_array(self.iter, value, length)
+
+ def append_int32_array(self, python_list):
+ cdef dbus_int32_t *value
+ cdef int length
+ cdef int i
+ length = len(python_list)
+ value = <dbus_int32_t*>malloc(length * sizeof(dbus_int32_t))
+ for i from 0 <= i < length:
+ item = python_list[i]
+ if type(item) != int:
+ raise TypeError
+ value[i] = item
+ return dbus_message_iter_append_int32_array(self.iter, value, length)
+
+ def append_int64_array(self, python_list):
+ cdef dbus_int64_t *value
+ cdef int length
+ cdef int i
+ length = len(python_list)
+ value = <dbus_int64_t*>malloc(length * sizeof(dbus_int64_t))
+ for i from 0 <= i < length:
+ item = python_list[i]
+ if type(item) != int:
+ raise TypeError
+ value[i] = item
+ return dbus_message_iter_append_int64_array(self.iter, value, length)
+
+ def append_double_array(self, python_list):
+ cdef double *value
+ cdef int length
+ cdef int i
+ length = len(python_list)
+ value = <double*>malloc(length * sizeof(double))
+ for i from 0 <= i < length:
+ item = python_list[i]
+ if type(item) != float:
+ raise TypeError
+ value[i] = item
+ return dbus_message_iter_append_double_array(self.iter, value, length)
+
+ def append_object_path_array(self, list):
+ cdef char **value
+ cdef int length
+ cdef int i
+ length = len(list)
+ value = <char**>malloc(length * sizeof(char *))
+ for i from 0 <= i < length:
+ item = list[i]
+ if not isinstance(item, ObjectPath):
+ raise TypeError
+ value[i] = item
+
+ return dbus_message_iter_append_object_path_array(self.iter, value, length)
+
+ def append_string_array(self, python_list):
+ cdef char **value
+ cdef int length
+ cdef dbus_bool_t return_code
+ cdef int i
+ length = len(python_list)
+ value = <char**>malloc(length * sizeof(char *))
+ for i from 0 <= i < length:
+ item = python_list[i]
+ if type(item) != str:
+ raise TypeError
+ value[i] = item
+ return dbus_message_iter_append_string_array(self.iter, value, length)
(MESSAGE_TYPE_INVALID, MESSAGE_TYPE_METHOD_CALL, MESSAGE_TYPE_METHOD_RETURN, MESSAGE_TYPE_ERROR, MESSAGE_TYPE_SIGNAL) = range(5)
-(TYPE_INVALID, TYPE_BYTE, TYPE_BOOLEAN, TYPE_INT16, TYPE_UINT16, TYPE_INT32, TYPE_UINT32, TYPE_INT64, TYPE_UINT64, TYPE_DOUBLE, TYPE_STRING, TYPE_OBJECT_PATH, TYPE_SIGNATURE, TYPE_ARRAY, TYPE_STRUCT, STRUCT_BEGIN, STRUCT_END, TYPE_VARIANT, TYPE_DICT_ENTRY, DICT_ENTRY_BEGIN, DICT_ENTRY_END) = (0, ord('y'), ord('b'), ord('n'), ord('i'), ord('u'), ord('q'), ord('x'), ord('t'), ord('d'), ord('s'), ord('o'), ord('g'), ord('a'), ord('r'), ord('('), ord(')'), ord('v'), ord('e'), ord('{'), ord('}'))
+(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'))
(HANDLER_RESULT_HANDLED, HANDLER_RESULT_NOT_YET_HANDLED, HANDLER_RESULT_NEED_MEMORY) = range(3)
cdef class Message:
@@ -952,7 +865,7 @@ cdef class Message:
return "error"
else:
return "(unknown message type)"
-
+
def __str__(self):
message_type = self.get_type()
sender = self.get_sender()
@@ -979,8 +892,51 @@ cdef class Message:
# FIXME: should really use self.convert_to_tuple() here
iter = self.get_iter()
+ value_at_iter = True
+
+ while (value_at_iter):
+ type = iter.get_arg_type()
+
+ if type == TYPE_INVALID:
+ break
+ elif type == TYPE_NIL:
+ arg = 'nil:None\n'
+ elif type == TYPE_STRING:
+ str = iter.get_string()
+ arg = 'string:%s\n' % (str)
+ elif type == TYPE_OBJECT_PATH:
+ path = iter.get_object_path()
+ arg = 'object_path:%s\n' % (path)
+ elif type == TYPE_INT32:
+ num = iter.get_int32()
+ arg = 'int32:%d\n' % (num)
+ elif type == TYPE_UINT32:
+ num = iter.get_uint32()
+ arg = 'uint32:%u\n' % (num)
+ elif type == TYPE_INT64:
+ num = iter.get_int64()
+ arg = 'int64:%d\n' % (num)
+ elif type == TYPE_UINT64:
+ num = iter.get_uint64()
+ arg = 'uint64:%u\n' % (num)
+ elif type == TYPE_DOUBLE:
+ num = iter.get_double()
+ arg = 'double:%f\n' % (num)
+ elif type == TYPE_BYTE:
+ num = iter.get_byte()
+ arg = 'byte:%d\n' % (num)
+ elif type == TYPE_BOOLEAN:
+ bool = iter.get_boolean()
+ if (bool):
+ str = "true"
+ else:
+ str = "false"
+ arg = 'boolean:%s\n' % (str)
+ else:
+ arg = '(unknown arg type %d)\n' % type
- retval = retval + "\n" + str(iter)
+ retval = retval + arg
+ value_at_iter = iter.next()
return retval
@@ -990,19 +946,15 @@ cdef class Message:
cdef DBusMessage *_get_msg(self):
return self.msg
- def get_iter(self, append=False):
+ def get_iter(self):
cdef DBusMessageIter iter
cdef MessageIter message_iter
cdef DBusMessage *msg
msg = self._get_msg()
+ dbus_message_iter_init(msg, &iter)
- if append:
- dbus_message_iter_init_append(msg, &iter)
- else:
- dbus_message_iter_init(msg, &iter)
-
- message_iter = MessageIter(0)
+ message_iter = MessageIter()
message_iter.__cinit__(&iter)
return message_iter
@@ -1157,7 +1109,7 @@ cdef class Server:
BUS_SESSION = DBUS_BUS_SESSION
BUS_SYSTEM = DBUS_BUS_SYSTEM
-BUS_STARTER = DBUS_BUS_STARTER
+BUS_ACTIVATION = DBUS_BUS_ACTIVATION
def bus_get (bus_type):
cdef DBusError error
@@ -1175,10 +1127,10 @@ def bus_get (bus_type):
conn.__cinit__(None, connection)
return conn
-def bus_get_unique_name(Connection connection):
+def bus_get_base_service(Connection connection):
cdef DBusConnection *conn
conn = connection._get_conn()
- return dbus_bus_get_unique_name(conn)
+ return dbus_bus_get_base_service(conn)
def bus_get_unix_user(Connection connection, service_name):
cdef DBusError error
@@ -1194,10 +1146,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
+ACTIVATION_REPLY_ACTIVATED = 0
+ACTIVATION_REPLY_ALREADY_ACTIVE = 1
-def bus_start_service_by_name(Connection connection, service_name, flags=0):
+def bus_activate_service(Connection connection, service_name, flags=0):
cdef DBusError error
dbus_error_init(&error)
cdef dbus_bool_t retval
@@ -1206,7 +1158,7 @@ def bus_start_service_by_name(Connection connection, service_name, flags=0):
conn = connection._get_conn()
- retval = dbus_bus_start_service_by_name(conn, service_name, flags, &results, &error)
+ retval = dbus_bus_activate_service(conn, service_name, flags, &results, &error)
return (retval, results)
@@ -1227,29 +1179,29 @@ def bus_register(Connection connection):
SERVICE_FLAG_PROHIBIT_REPLACEMENT = 0x1
SERVICE_FLAG_REPLACE_EXISTING = 0x2
-def bus_request_name(Connection connection, service_name, flags=0):
+def bus_acquire_service(Connection connection, service_name, flags=0):
cdef DBusError error
dbus_error_init(&error)
cdef int retval
cdef DBusConnection *conn
conn = connection._get_conn()
- retval = dbus_bus_request_name(conn,
- service_name,
- flags,
- &error)
+ retval = dbus_bus_acquire_service(conn,
+ service_name,
+ flags,
+ &error)
if dbus_error_is_set(&error):
raise DBusException, error.message
return retval
-def bus_name_has_owner(Connection connection, service_name):
+def bus_service_exists(Connection connection, service_name):
cdef DBusError error
dbus_error_init(&error)
cdef dbus_bool_t retval
cdef DBusConnection *conn
conn = connection._get_conn()
- retval = dbus_bus_name_has_owner(conn,
+ retval = dbus_bus_service_exists(conn,
service_name,
&error)
if dbus_error_is_set(&error):