diff --git a/src/dbus_fast/_private/unmarshaller.pxd b/src/dbus_fast/_private/unmarshaller.pxd index 18c9ff8..e31769a 100644 --- a/src/dbus_fast/_private/unmarshaller.pxd +++ b/src/dbus_fast/_private/unmarshaller.pxd @@ -50,8 +50,13 @@ cdef object SIGNATURE_TREE_B cdef object SIGNATURE_TREE_N cdef object SIGNATURE_TREE_O cdef object SIGNATURE_TREE_S +cdef object SIGNATURE_TREE_U +cdef object SIGNATURE_TREE_Y + cdef object SIGNATURE_TREE_AS cdef object SIGNATURE_TREE_AS_TYPES_0 +cdef object SIGNATURE_TREE_AO +cdef object SIGNATURE_TREE_AO_TYPES_0 cdef object SIGNATURE_TREE_A_SV cdef object SIGNATURE_TREE_A_SV_TYPES_0 cdef object SIGNATURE_TREE_SA_SV_AS @@ -65,6 +70,8 @@ cdef object SIGNATURE_TREE_AY cdef object SIGNATURE_TREE_AY_TYPES_0 cdef object SIGNATURE_TREE_A_QV cdef object SIGNATURE_TREE_A_QV_TYPES_0 +cdef object SIGNATURE_TREE_A_OA_SA_SV +cdef object SIGNATURE_TREE_A_OA_SA_SV_TYPES_0 cdef unsigned int TOKEN_O_AS_INT cdef unsigned int TOKEN_S_AS_INT diff --git a/src/dbus_fast/_private/unmarshaller.py b/src/dbus_fast/_private/unmarshaller.py index d5695d2..56645c6 100644 --- a/src/dbus_fast/_private/unmarshaller.py +++ b/src/dbus_fast/_private/unmarshaller.py @@ -65,6 +65,8 @@ SIGNATURE_TREE_B = get_signature_tree("b") SIGNATURE_TREE_N = get_signature_tree("n") SIGNATURE_TREE_S = get_signature_tree("s") SIGNATURE_TREE_O = get_signature_tree("o") +SIGNATURE_TREE_U = get_signature_tree("u") +SIGNATURE_TREE_Y = get_signature_tree("y") SIGNATURE_TREE_AY = get_signature_tree("ay") SIGNATURE_TREE_AS = get_signature_tree("as") @@ -72,6 +74,9 @@ SIGNATURE_TREE_AS_TYPES_0 = SIGNATURE_TREE_AS.types[0] SIGNATURE_TREE_A_SV = get_signature_tree("a{sv}") SIGNATURE_TREE_A_SV_TYPES_0 = SIGNATURE_TREE_A_SV.types[0] +SIGNATURE_TREE_AO = get_signature_tree("ao") +SIGNATURE_TREE_AO_TYPES_0 = SIGNATURE_TREE_AO.types[0] + SIGNATURE_TREE_OAS = get_signature_tree("oas") SIGNATURE_TREE_OAS_TYPES_1 = SIGNATURE_TREE_OAS.types[1] @@ -86,6 +91,9 @@ SIGNATURE_TREE_SA_SV_AS_TYPES_2 = SIGNATURE_TREE_SA_SV_AS.types[2] SIGNATURE_TREE_OA_SA_SV = get_signature_tree("oa{sa{sv}}") SIGNATURE_TREE_OA_SA_SV_TYPES_1 = SIGNATURE_TREE_OA_SA_SV.types[1] +SIGNATURE_TREE_A_OA_SA_SV = get_signature_tree("a{oa{sa{sv}}}") +SIGNATURE_TREE_A_OA_SA_SV_TYPES_0 = SIGNATURE_TREE_A_OA_SA_SV.types[0] + TOKEN_O_AS_INT = ord("o") TOKEN_S_AS_INT = ord("s") TOKEN_G_AS_INT = ord("g") @@ -371,6 +379,15 @@ class Unmarshaller: self._read_array(SIGNATURE_TREE_A_SV_TYPES_0), False, ) + elif signature == "ao": + return Variant( + SIGNATURE_TREE_AO, self._read_array(SIGNATURE_TREE_AO_TYPES_0), False + ) + elif signature == "u": + return Variant(SIGNATURE_TREE_U, self._read_uint32_unpack(), False) + elif signature == "y": + self._pos += 1 + return Variant(SIGNATURE_TREE_Y, self._buf[self._pos - 1], False) tree = get_signature_tree(signature) signature_type = tree.types[0] return Variant( @@ -439,7 +456,7 @@ class Unmarshaller: self._pos += -self._pos & 7 # align 8 key = self._read_uint16_unpack() result_dict[key] = self._read_variant() - elif child_0_token == "s" and child_1_token == "a": + elif child_0_token in "os" and child_1_token == "a": while self._pos - beginning_pos < array_length: self._pos += -self._pos & 7 # align 8 key = self._read_string_unpack() @@ -583,6 +600,9 @@ class Unmarshaller: self._read_string_unpack(), self._read_array(SIGNATURE_TREE_OAS_TYPES_1), ] + elif signature == "a{oa{sa{sv}}}": + tree = SIGNATURE_TREE_A_OA_SA_SV + body = [self._read_array(SIGNATURE_TREE_A_OA_SA_SV_TYPES_0)] else: tree = get_signature_tree(signature) body = [self._readers[t.token](self, t) for t in tree.types] diff --git a/tests/test_marshaller.py b/tests/test_marshaller.py index 25c493b..93eb91f 100644 --- a/tests/test_marshaller.py +++ b/tests/test_marshaller.py @@ -496,6 +496,45 @@ def test_unmarshall_large_message(): message = unmarshaller.message unpacked = unpack_variants(message.body) objects = unpacked[0] + assert objects["/org/bluez/hci0"] == { + "org.bluez.Adapter1": { + "Address": "00:1A:7D:DA:71:04", + "AddressType": "public", + "Alias": "homeassistant", + "Class": 2883584, + "Discoverable": False, + "DiscoverableTimeout": 180, + "Discovering": True, + "Modalias": "usb:v1D6Bp0246d053F", + "Name": "homeassistant", + "Pairable": False, + "PairableTimeout": 0, + "Powered": True, + "Roles": ["central", "peripheral"], + "UUIDs": [ + "0000110e-0000-1000-8000-00805f9b34fb", + "0000110a-0000-1000-8000-00805f9b34fb", + "00001200-0000-1000-8000-00805f9b34fb", + "0000110b-0000-1000-8000-00805f9b34fb", + "00001108-0000-1000-8000-00805f9b34fb", + "0000110c-0000-1000-8000-00805f9b34fb", + "00001800-0000-1000-8000-00805f9b34fb", + "00001801-0000-1000-8000-00805f9b34fb", + "0000180a-0000-1000-8000-00805f9b34fb", + "00001112-0000-1000-8000-00805f9b34fb", + ], + }, + "org.bluez.GattManager1": {}, + "org.bluez.LEAdvertisingManager1": { + "ActiveInstances": 0, + "SupportedIncludes": ["tx-power", "appearance", "local-name"], + "SupportedInstances": 5, + }, + "org.bluez.Media1": {}, + "org.bluez.NetworkServer1": {}, + "org.freedesktop.DBus.Introspectable": {}, + "org.freedesktop.DBus.Properties": {}, + } assert objects["/org/bluez/hci0/dev_CD_A3_FA_D1_50_56/service000b/char000c"] == { "org.bluez.GattCharacteristic1": { "Flags": ["read"],