mirror of
https://github.com/esiur/esiur-dart.git
synced 2026-04-04 02:08:21 +00:00
125 lines
3.4 KiB
Dart
125 lines
3.4 KiB
Dart
import 'dart:ffi';
|
|
|
|
import '../../Data/IRecord.dart';
|
|
import '../../Resource/IResource.dart';
|
|
|
|
import '../../Data/Structure.dart';
|
|
|
|
import '../../Data/ParseResult.dart';
|
|
|
|
import '../../Data/DataType.dart';
|
|
import '../../Data/Guid.dart';
|
|
import '../../Data/DC.dart';
|
|
import '../../Data/BinaryList.dart';
|
|
import 'TypeTemplate.dart';
|
|
import '../../Resource/Warehouse.dart';
|
|
import 'TemplateType.dart';
|
|
|
|
class TemplateDataType {
|
|
late int type;
|
|
TypeTemplate? get typeTemplate => typeGuid == null
|
|
? null
|
|
: Warehouse.getTemplateByClassId(typeGuid as Guid);
|
|
|
|
Guid? typeGuid;
|
|
|
|
// @TODO: implement fromType
|
|
TemplateDataType.fromType(type, bool isArray) {
|
|
int dt;
|
|
|
|
if (type == null || type == dynamic)
|
|
dt = DataType.Void;
|
|
else if (type is int) {
|
|
dt = type;
|
|
} else if (type == bool)
|
|
dt = DataType.Bool;
|
|
else if (type == Uint8)
|
|
dt = DataType.UInt8;
|
|
else if (type == Int8)
|
|
dt = DataType.Int8;
|
|
else if (type == Uint16)
|
|
dt = DataType.UInt16;
|
|
else if (type == Int16)
|
|
dt = DataType.Int16;
|
|
else if (type == Uint32)
|
|
dt = DataType.UInt32;
|
|
else if (type == Int32)
|
|
dt = DataType.Int32;
|
|
else if (type == Uint64)
|
|
dt = DataType.UInt64;
|
|
else if (type == Int64 || type == int)
|
|
dt = DataType.Int64;
|
|
else if (type == Float)
|
|
dt = DataType.Float32;
|
|
else if (type == Double || type == double)
|
|
dt = DataType.Float64;
|
|
else if (type == String)
|
|
dt = DataType.String;
|
|
else if (type == DateTime)
|
|
dt = DataType.DateTime;
|
|
else if (type == Structure)
|
|
dt = DataType.Structure;
|
|
else if (type == IResource) // Dynamic resource (unspecified type)
|
|
dt = DataType.Void;
|
|
else if (type == IRecord) // Dynamic record (unspecified type)
|
|
dt = DataType.Void;
|
|
else {
|
|
var template = Warehouse.getTemplateByType(type);
|
|
|
|
if (template != null) {
|
|
typeGuid = template.classId;
|
|
dt = template.type == TemplateType.Resource
|
|
? DataType.Resource
|
|
: DataType.Record;
|
|
} else
|
|
dt = DataType.Void;
|
|
|
|
// if (template)
|
|
// try {
|
|
// var ins = Warehouse.createInstance(type);
|
|
// if (ins is IResource) {
|
|
// typeGuid = TypeTemplate.getTypeGuid(ins.template.nameSpace);
|
|
// } else if (ins is IRecord) {
|
|
// typeGuid = TypeTemplate.getTypeGuid(ins.template.nameSpace);
|
|
// } else {
|
|
// dt = DataType.Void;
|
|
// }
|
|
// } catch (ex) {
|
|
// dt = DataType.Void;
|
|
// }
|
|
}
|
|
|
|
if (isArray) dt = dt | 0x80;
|
|
|
|
this.type = dt;
|
|
}
|
|
|
|
DC compose() {
|
|
if (type == DataType.Resource ||
|
|
type == DataType.ResourceArray ||
|
|
type == DataType.Record ||
|
|
type == DataType.RecordArray) {
|
|
return (BinaryList()
|
|
..addUint8(type)
|
|
..addDC((typeGuid as Guid).value))
|
|
.toDC();
|
|
} else
|
|
return DC.fromList([type]);
|
|
}
|
|
|
|
TemplateDataType(this.type, this.typeGuid);
|
|
|
|
static ParseResult<TemplateDataType> parse(DC data, int offset) {
|
|
var type = data[offset++];
|
|
if (type == DataType.Resource ||
|
|
type == DataType.ResourceArray ||
|
|
type == DataType.Record ||
|
|
type == DataType.RecordArray) {
|
|
var guid = data.getGuid(offset);
|
|
return ParseResult<TemplateDataType>(
|
|
17, new TemplateDataType(type, guid));
|
|
} else
|
|
return ParseResult<TemplateDataType>(1, new TemplateDataType(type, null));
|
|
}
|
|
}
|