You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.7 KiB
79 lines
1.7 KiB
5 years ago
|
import 'dart:convert';
|
||
|
import 'dart:typed_data';
|
||
|
|
||
|
import 'package:kdbx/kdbx.dart';
|
||
|
import 'package:meta/meta.dart';
|
||
|
import 'package:xml/xml.dart';
|
||
|
|
||
|
abstract class KdbxSubNode<T> {
|
||
|
KdbxSubNode(this.node, this.name);
|
||
|
|
||
|
final KdbxNode node;
|
||
|
final String name;
|
||
|
|
||
|
T get();
|
||
|
|
||
|
void set(T value);
|
||
|
}
|
||
|
|
||
|
abstract class KdbxSubTextNode<T> extends KdbxSubNode<T> {
|
||
|
KdbxSubTextNode(KdbxNode node, String name) : super(node, name);
|
||
|
|
||
|
@protected
|
||
|
String encode(T value);
|
||
|
|
||
|
@protected
|
||
|
T decode(String value);
|
||
|
|
||
|
XmlElement _opt(String nodeName) =>
|
||
|
node.node.findElements(nodeName).singleWhere((x) => true, orElse: () => null);
|
||
|
|
||
|
@override
|
||
|
T get() {
|
||
|
return decode(_opt(name)?.text);
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
void set(T value) {
|
||
|
final stringValue = encode(value);
|
||
|
final el =
|
||
|
node.node.findElements(name).singleWhere((x) => true, orElse: () {
|
||
|
final el = XmlElement(XmlName(name));
|
||
|
node.node.children.add(el);
|
||
|
return el;
|
||
|
});
|
||
|
el.children.clear();
|
||
|
el.children.add(XmlText(stringValue));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class StringNode extends KdbxSubTextNode<String> {
|
||
|
StringNode(KdbxNode node, String name) : super(node, name);
|
||
|
|
||
|
@override
|
||
|
String decode(String value) => value;
|
||
|
|
||
|
@override
|
||
|
String encode(String value) => value;
|
||
|
}
|
||
|
|
||
|
class Base64Node extends KdbxSubTextNode<ByteBuffer> {
|
||
|
Base64Node(KdbxNode node, String name) : super(node, name);
|
||
|
|
||
|
@override
|
||
|
ByteBuffer decode(String value) => base64.decode(value).buffer;
|
||
|
|
||
|
@override
|
||
|
String encode(ByteBuffer value) => base64.encode(value.asUint8List());
|
||
|
}
|
||
|
|
||
|
class UuidNode extends KdbxSubTextNode<KdbxUuid> {
|
||
|
UuidNode(KdbxNode node, String name) : super(node, name);
|
||
|
|
||
|
@override
|
||
|
KdbxUuid decode(String value) => KdbxUuid(value);
|
||
|
|
||
|
@override
|
||
|
String encode(KdbxUuid value) => value.uuid;
|
||
|
}
|