@@ -16,7 +16,15 @@ class DeviceList with _$DeviceList {
1616 }) = _DeviceList ;
1717
1818 factory DeviceList .fromXml (XmlElement element) {
19- throw UnimplementedError ();
19+ assert (element.name.toString () == 'devicelist' );
20+
21+ return DeviceList (
22+ version: element.getAttribute ('version' ) ?? '' ,
23+ fwversion: element.getAttribute ('fwversion' ) ?? '' ,
24+ devices: List .unmodifiable (
25+ element.childElements.map ((element) => Device .fromXml (element)),
26+ ),
27+ );
2028 }
2129
2230 void toXml (XmlBuilder builder) {
@@ -26,13 +34,76 @@ class DeviceList with _$DeviceList {
2634 'version' : version,
2735 'fwversion' : fwversion,
2836 },
37+ nest: () {
38+ for (final device in devices) {
39+ device.toXml (builder);
40+ }
41+ },
2942 );
3043 }
3144}
3245
3346@freezed
3447class Device with _$Device {
35- const factory Device () = _Device ;
48+ const factory Device ({
49+ required String identifier,
50+ required String id,
51+ required int functionbitmask,
52+ required String fwversion,
53+ required String manufacturer,
54+ required String productname,
55+ required bool present,
56+ required bool txbusy,
57+ required String name,
58+ required int battery,
59+ required bool batterylow,
60+ required dynamic temperature,
61+ required dynamic hkr,
62+ }) = _Device ;
63+
64+ factory Device .fromXml (XmlElement element) {
65+ assert (element.name.toString () == 'device' );
66+
67+ return Device (
68+ identifier: element.getAttribute ('identifier' ) ?? '' ,
69+ id: element.getAttribute ('id' ) ?? '' ,
70+ functionbitmask: element.getIntAttribute ('functionbitmask' ) ?? 0 ,
71+ fwversion: element.getAttribute ('fwversion' ) ?? '' ,
72+ manufacturer: element.getAttribute ('manufacturer' ) ?? '' ,
73+ productname: element.getAttribute ('productname' ) ?? '' ,
74+ present: element.getBoolElement ('present' ),
75+ txbusy: element.getBoolElement ('txbusy' ),
76+ name: element.getElement ('name' )? .text ?? '' ,
77+ battery: element.getIntElement ('battery' ) ?? 0 ,
78+ batterylow: element.getBoolElement ('batterylow' ),
79+ temperature: element.getElement ('temperature' ),
80+ hkr: element.getElement ('hkr' ),
81+ );
82+ }
83+
84+ void toXml (XmlBuilder builder) {
85+ builder.element (
86+ 'device' ,
87+ attributes: {
88+ 'identifier' : identifier,
89+ 'id' : id,
90+ 'functionbitmask' : functionbitmask.toString (),
91+ 'fwversion' : fwversion,
92+ 'manufacturer' : manufacturer,
93+ 'productname' : productname,
94+ },
95+ nest: () {
96+ builder
97+ ..element ('present' , nest: present.toXmlString ())
98+ ..element ('txbusy' , nest: txbusy.toXmlString ())
99+ ..element ('name' , nest: name)
100+ ..element ('battery' , nest: battery)
101+ ..element ('batterylow' , nest: batterylow.toXmlString ())
102+ ..element ('temperature' , nest: temperature)
103+ ..element ('hkr' , nest: hkr);
104+ },
105+ );
106+ }
36107}
37108
38109class _DeviceListTypeConverter extends SimpleXmlTypeConverter <DeviceList > {
@@ -44,3 +115,15 @@ class _DeviceListTypeConverter extends SimpleXmlTypeConverter<DeviceList> {
44115 @override
45116 DeviceList parseXml (XmlElement element) => DeviceList .fromXml (element);
46117}
118+
119+ extension XmlElementX on XmlElement {
120+ int ? getIntAttribute (String name) => int .tryParse (getAttribute (name) ?? '' );
121+
122+ bool getBoolElement (String name) => getElement (name)? .text == '1' ;
123+
124+ int ? getIntElement (String name) => int .tryParse (getElement (name)? .text ?? '' );
125+ }
126+
127+ extension BoolX on bool {
128+ String toXmlString () => this ? '1' : '0' ;
129+ }
0 commit comments