def _deserialize_dynamic_obj( self, element: ET.Element, metadata: ObjectMeta, ) -> typing.Any: obj = metadata.object( ) # type: ignore[misc] # Caller always sets object self.obj[element.attrib["RefId"]] = obj for obj_property in element: if obj_property.tag == "TN": for obj_type in obj_property: obj.types.append(obj_type.text) self.tn[obj_property.attrib["RefId"]] = obj.types elif obj_property.tag == "TNRef": obj.types = self.tn[obj_property.attrib["RefId"]] elif obj_property.tag == "Props": for adapted_property in obj_property: key = adapted_property.attrib["N"] value = self.deserialize(adapted_property, clear=False) obj.adapted_properties[key] = value elif obj_property.tag == "MS": for extended_property in obj_property: key = extended_property.attrib["N"] value = self.deserialize(extended_property, clear=False) obj.extended_properties[key] = value elif obj_property.tag == "ToString": value = self.deserialize(obj_property, clear=False) obj.to_string = value else: value = self.deserialize(obj_property, clear=False) obj.property_sets.append(value) return obj
def _deserialize_obj( self, element: ET.Element, metadata: ObjectMeta, ) -> typing.Any: obj = metadata.object( ) # type: ignore[misc] # Caller always sets object self.obj[element.attrib["RefId"]] = obj to_string_value = element.find("ToString") if to_string_value is not None: obj._to_string = self._deserialize_string(to_string_value.text) def deserialize_property( prop_tag: str, properties: typing.Tuple[typing.Tuple[str, ObjectMeta], ...]) -> None: for attr, property_meta in properties: if attr == "invocation_info": a = "" property_name = "Unknown" property_filter = "" if property_meta.name is not None: property_name = property_meta.name property_filter = "[@N='%s']" % property_meta.name tags = [property_meta.tag] # The below tags are actually seen as Obj in the parent element if property_meta.tag in [ "DCT", "LST", "IE", "QUE", "STK", "ObjDynamic" ]: tags = ["Obj", "Ref"] val = None for tag in tags: val = element.find("%s%s%s" % (prop_tag, tag, property_filter)) if val is not None: break if val is None and not property_meta.optional: val = element.find("%sNil%s" % (prop_tag, property_filter)) if val is None: obj_name = str( obj) if obj._to_string is not None else "Unknown" err_msg = "Mandatory return value for '%s' was not found on object %s" % ( property_name, obj_name, ) raise SerializationError(err_msg) val = None elif val is not None: val = self.deserialize(val, property_meta, clear=False) setattr(obj, attr, val) deserialize_property("", obj._property_sets) deserialize_property("Props/", obj._adapted_properties) deserialize_property("MS/", obj._extended_properties) return obj