91 lines
2.2 KiB
Dart
91 lines
2.2 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import '../utils/Converter.dart';
|
|
import 'Stream.dart';
|
|
import 'Tag.dart';
|
|
import 'impl/CompoundTag.dart';
|
|
|
|
class NbtIo {
|
|
static ByteLayer _io = ByteLayer();
|
|
|
|
// Handle various helper functions here!
|
|
|
|
static Future<void> _read(String file) async {
|
|
_io = ByteLayer();
|
|
|
|
await _io.readFromFile(file);
|
|
}
|
|
|
|
// This function will read the file and check if it is infact gzipped
|
|
static Future<CompoundTag> read(String file) async {
|
|
await _read(file);
|
|
if (_io.readByte() == TagType.Compound.byte) {
|
|
_io.resetPosition();
|
|
return Tag.readNamedTag(_io) as CompoundTag;
|
|
} else {
|
|
// Is likely gzip compressed
|
|
return readCompressed(file);
|
|
}
|
|
}
|
|
|
|
static Future<CompoundTag> readCompressed(String file) async {
|
|
_io = ByteLayer();
|
|
await _io.readFromFile(file);
|
|
await _io.decompress();
|
|
_io.resetPosition();
|
|
return Tag.readNamedTag(_io) as CompoundTag;
|
|
}
|
|
|
|
static Future<void> write(String file, CompoundTag tag) async {
|
|
_io = ByteLayer();
|
|
Tag.writeNamedTag(tag, _io);
|
|
await _io.writeToFile(file);
|
|
}
|
|
|
|
static Future<void> writeCompressed(String file, CompoundTag tag) async {
|
|
_io = ByteLayer();
|
|
Tag.writeNamedTag(tag, _io);
|
|
await _io.compress();
|
|
await _io.writeToFile(file);
|
|
}
|
|
|
|
static ByteLayer getStream() {
|
|
return _io;
|
|
}
|
|
|
|
static Future<String> writeBase64String(CompoundTag tag) async {
|
|
_io = ByteLayer();
|
|
Tag.writeNamedTag(tag, _io);
|
|
_io.compress();
|
|
return base64Encoder.encode(_io.bytes);
|
|
}
|
|
|
|
static Future<CompoundTag> readBase64String(String encoded) async {
|
|
_io = ByteLayer();
|
|
List<int> bytes = base64Encoder.decode(encoded);
|
|
for (int byte in bytes) {
|
|
_io.writeByte(byte);
|
|
}
|
|
_io.decompress();
|
|
_io.resetPosition();
|
|
return Tag.readNamedTag(_io) as CompoundTag;
|
|
}
|
|
|
|
static Future<Uint8List> writeToStream(CompoundTag tag) async {
|
|
_io = ByteLayer();
|
|
Tag.writeNamedTag(tag, _io);
|
|
_io.compress();
|
|
|
|
return _io.bytes;
|
|
}
|
|
|
|
static Future<CompoundTag> readFromStream(Uint8List list) async {
|
|
_io = ByteLayer();
|
|
_io.writeBytes(list);
|
|
_io.resetPosition();
|
|
_io.decompress();
|
|
_io.resetPosition();
|
|
|
|
return Tag.readNamedTag(_io) as CompoundTag;
|
|
}
|
|
}
|