feat: add optimized reader for GetManagedObjects (#152)

This commit is contained in:
J. Nick Koston 2022-11-04 19:03:32 +01:00 committed by GitHub
parent 2d566224d3
commit 7ed453f31a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 1 deletions

View File

@ -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

View File

@ -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]

View File

@ -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"],