feat: add optimized reader for GetManagedObjects (#152)
This commit is contained in:
parent
2d566224d3
commit
7ed453f31a
@ -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
|
||||
|
||||
@ -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]
|
||||
|
||||
@ -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"],
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user