diff options
Diffstat (limited to 'python/dbus_bindings.pyx')
| -rw-r--r-- | python/dbus_bindings.pyx | 197 | 
1 files changed, 160 insertions, 37 deletions
diff --git a/python/dbus_bindings.pyx b/python/dbus_bindings.pyx index 6c762d33..00603734 100644 --- a/python/dbus_bindings.pyx +++ b/python/dbus_bindings.pyx @@ -261,9 +261,9 @@ cdef class Connection:              self.conn = dbus_connection_open(address,                                           &error)              if dbus_error_is_set(&error): -                message = error.message +                errormsg = error.message                  dbus_error_free (&error) -                raise DBusException, message +                raise DBusException, errormsg      def __dealloc__(self):          if self.conn != NULL: @@ -388,9 +388,9 @@ cdef class Connection:              &error)          if dbus_error_is_set(&error): -            message = error.message +            errormsg = error.message              dbus_error_free (&error) -            raise DBusException, message +            raise DBusException, errormsg          if retval == NULL:              raise AssertionError @@ -936,8 +936,105 @@ cdef class MessageIter:          return ret +    def parse_signature_block(self, signature): +        remainder = '' +        sig = '' +        block_depth = 0 +        block_type = None +        +        for marker in range(0, len(signature)): +            cur_sig = ord(signature[marker]) + +            if cur_sig == TYPE_ARRAY: +                pass +            elif cur_sig == DICT_ENTRY_BEGIN or cur_sig == STRUCT_BEGIN: +                if block_type == None: +                    block_type = cur_sig + +                if block_type == cur_sig: +                    block_depth = block_depth + 1 + +            elif cur_sig == DICT_ENTRY_END: +                if block_type == DICT_ENTRY_BEGIN: +                    block_depth = block_depth - 1 + +                if block_depth == 0: +                    break + +            elif cur_sig == STRUCT_END: +                if block_type == STRUCT_BEGIN: +                    block_depth = block_depth - 1 + +                if block_depth == 0: +                    break + +            else: +                if block_depth == 0: +                    break +         +        marker = marker + 1 +        sig = signature[0:marker] +        remainder = signature[marker:] +        return (sig, remainder) +   +    def append_strict(self, value, sig): +         -    #FIXME: handle all the different types? +        if sig == TYPE_INVALID or sig == None: +            raise TypeError, 'Invalid arg type sent to append_strict' + +        sig_type = ord(sig[0]) +	     +        if sig_type == TYPE_STRING: +            retval = self.append(value) +        elif sig_type == TYPE_INT16: +            retval = self.append_int16(value) +        elif sig_type == TYPE_UINT16: +            retval = self.append_uint16(value) +        elif sig_type == TYPE_INT32: +            retval = self.append_int32(value) +        elif sig_type == TYPE_UINT32: +            retval = self.append_uint32(value) +        elif sig_type == TYPE_INT64: +            retval = self.append_int64(value) +        elif sig_type == TYPE_UINT64: +            retval = self.append_uint64(value) +        elif sig_type == TYPE_DOUBLE: +            retval = self.append_double(value) +        elif sig_type == TYPE_BYTE: +            retval = self.append_byte(value) +        elif sig_type == TYPE_BOOLEAN: +            retval = self.append_boolean(value) +        elif sig_type == TYPE_SIGNATURE: +            retval = self.append_signature(value) +        elif sig_type == TYPE_ARRAY: +            if len(sig) < 2: +                raise TypeError, "Invalid array signature in append_strict.  Arrays must be followed by a type." + +            array_type = ord(sig[1])             +            if array_type == DICT_ENTRY_BEGIN: +                if ord(sig[-1]) != DICT_ENTRY_END: +                    raise TypeError, "Invalid dict entry in append_strict.  No termination in signature %s."%(sig) + +                tmp_sig = sig[2:-1] +                retval = self.append_dict(Dictionary(value, signature=tmp_sig)) +            else: +                tmp_sig = sig[1:] +                retval = self.append_array(Array(value, signature=tmp_sig)) +        elif sig_type == TYPE_OBJECT_PATH: +            retval = self.append_object_path(value) +        elif sig_type == TYPE_STRUCT: +            tmp_sig = sig[1:-1] +            retval = self.append_struct(value, signature = tmp_sig) +        elif sig_type == TYPE_VARIANT: +            retval = self.append_variant(Variant(value)) +        elif sig_type == DICT_ENTRY_BEGIN: +            raise TypeError, "Signiture is invalid in append_strict. A dict entry must be part of an array."  +        else: +            raise TypeError, "Argument of unknown type '%s' in append_strict" % (sig) + +        return retval +      def append(self, value):          value_type = type(value)          if value_type == bool: @@ -1102,15 +1199,29 @@ cdef class MessageIter:              dict_entry_iter = MessageIter(level)              dict_entry_iter.__cinit__(&c_dict_entry_iter) -            if not dict_entry_iter.append(key): -                dbus_message_iter_close_container(dict_iter.iter, dict_entry_iter.iter) -                dbus_message_iter_close_container(self.iter, dict_iter.iter) -                return False +            if signature: +                (tmp_sig, remainder) = self.parse_signature_block(signature) +                if not dict_entry_iter.append_strict(key, tmp_sig): +                    dbus_message_iter_close_container(dict_iter.iter, dict_entry_iter.iter) +                    dbus_message_iter_close_container(self.iter, dict_iter.iter) +                    return False + +                (tmp_sig, remainder) = self.parse_signature_block(remainder) +                if not dict_entry_iter.append_strict(value, tmp_sig): +                    dbus_message_iter_close_container(dict_iter.iter, dict_entry_iter.iter) +                    dbus_message_iter_close_container(self.iter, dict_iter.iter) +                    return False + +            else: +                if not dict_entry_iter.append(key): +                    dbus_message_iter_close_container(dict_iter.iter, dict_entry_iter.iter) +                    dbus_message_iter_close_container(self.iter, dict_iter.iter) +                    return False -            if not 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) -                return False +                if not 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) +                    return False              dbus_message_iter_close_container(dict_iter.iter, dict_entry_iter.iter) @@ -1118,7 +1229,7 @@ cdef class MessageIter:          return True -    def append_struct(self, python_struct): +    def append_struct(self, python_struct, signature = None):          cdef DBusMessageIter c_struct_iter          cdef MessageIter struct_iter @@ -1126,11 +1237,23 @@ cdef class MessageIter:          dbus_message_iter_open_container(self.iter, TYPE_STRUCT, NULL, <DBusMessageIter *>&c_struct_iter)          struct_iter = MessageIter(level)          struct_iter.__cinit__(&c_struct_iter) -         + +        remainder = signature          for item in python_struct: -            if not struct_iter.append(item): -                dbus_message_iter_close_container(self.iter, struct_iter.iter) -                return False +            if signature: +                (sig, remainder) = self.parse_signature_block(remainder) + +                if sig == '': +                    dbus_message_iter_close_container(self.iter, struct_iter.iter) +                    return False + +                if not struct_iter.append_strict(item, sig): +                    dbus_message_iter_close_container(self.iter, struct_iter.iter) +                    return False +            else: +                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) @@ -1159,7 +1282,7 @@ cdef class MessageIter:          length = len(python_list)          for item in python_list: -            if not array_iter.append(item): +            if not array_iter.append_strict(item, sig):                  dbus_message_iter_close_container(self.iter, array_iter.iter)                  return False @@ -1485,9 +1608,9 @@ cdef class Server:          self.server = dbus_server_listen(address,                                           &error)          if dbus_error_is_set(&error): -            message = error.message +            errormsg = error.message              dbus_error_free (&error) -            raise DBusException, message +            raise DBusException, errormsg      def disconnect(self):          dbus_server_disconnect(self.server) @@ -1526,9 +1649,9 @@ def bus_get (bus_type):                                &error)      if dbus_error_is_set(&error): -        message = error.message +        errormsg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg       conn = Connection()      conn.__cinit__(None, connection) @@ -1549,9 +1672,9 @@ def bus_get_unix_user(Connection connection, service_name):      retval = dbus_bus_get_unix_user(conn, service_name, &error)      if dbus_error_is_set(&error): -        message = error.message +        errormsg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg       return retval @@ -1571,9 +1694,9 @@ def bus_start_service_by_name(Connection connection, service_name, flags=0):      retval = dbus_bus_start_service_by_name(conn, service_name, flags, &results, &error)      if dbus_error_is_set(&error): -        message = error.message +        errormsg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg      return (retval, results)  @@ -1587,9 +1710,9 @@ def bus_register(Connection connection):      retval = dbus_bus_register(conn,                                 &error)      if dbus_error_is_set(&error): -        message = error.message +        msg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg       return retval @@ -1608,9 +1731,9 @@ def bus_request_name(Connection connection, service_name, flags=0):                                     flags,                                     &error)      if dbus_error_is_set(&error): -        message = error.message +        errormsg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg      return retval @@ -1625,9 +1748,9 @@ def bus_name_has_owner(Connection connection, service_name):                                       service_name,                                       &error)      if dbus_error_is_set(&error): -        message = error.message +        errormsg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg      return retval @@ -1641,9 +1764,9 @@ def bus_add_match(Connection connection, rule):      dbus_bus_add_match (conn, rule, &error)      if dbus_error_is_set(&error): -        message = error.message +        errormsg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg  def bus_remove_match(Connection connection, rule):      cdef DBusError error @@ -1655,7 +1778,7 @@ def bus_remove_match(Connection connection, rule):      dbus_bus_remove_match (conn, rule, &error)      if dbus_error_is_set(&error): -        message = error.message +        errormsg = error.message          dbus_error_free(&error) -        raise DBusException, message +        raise DBusException, errormsg  | 
