mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-07-21 00:01:06 +10:00
path aware
This commit is contained in:
@@ -4274,6 +4274,7 @@ class MeshCoreConnector extends ChangeNotifier {
|
|||||||
String senderName,
|
String senderName,
|
||||||
DateTime timestamp, {
|
DateTime timestamp, {
|
||||||
Uint8List? pathBytes,
|
Uint8List? pathBytes,
|
||||||
|
int? pathHashWidth,
|
||||||
bool notify = false,
|
bool notify = false,
|
||||||
}) {
|
}) {
|
||||||
final normalized = senderName.trim().toLowerCase();
|
final normalized = senderName.trim().toLowerCase();
|
||||||
@@ -4297,7 +4298,7 @@ class MeshCoreConnector extends ChangeNotifier {
|
|||||||
for (var i = 0; i < _contacts.length; i++) {
|
for (var i = 0; i < _contacts.length; i++) {
|
||||||
final contact = _contacts[i];
|
final contact = _contacts[i];
|
||||||
if (contact.type != advTypeChat) continue;
|
if (contact.type != advTypeChat) continue;
|
||||||
if (_pathMatchesContact(pathBytes, contact.publicKey)) {
|
if (_pathMatchesContact(pathBytes, contact.publicKey, pathHashWidth: pathHashWidth)) {
|
||||||
matches.add(i);
|
matches.add(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4314,8 +4315,8 @@ class MeshCoreConnector extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _pathMatchesContact(Uint8List pathBytes, Uint8List publicKey) {
|
bool _pathMatchesContact(Uint8List pathBytes, Uint8List publicKey, {int? pathHashWidth}) {
|
||||||
final w = _pathHashByteWidth;
|
final w = pathHashWidth ?? _pathHashByteWidth;
|
||||||
if (pathBytes.isEmpty || publicKey.length < w) return false;
|
if (pathBytes.isEmpty || publicKey.length < w) return false;
|
||||||
for (int i = 0; i + w <= pathBytes.length; i += w) {
|
for (int i = 0; i + w <= pathBytes.length; i += w) {
|
||||||
final prefix = pathBytes.sublist(i, i + w);
|
final prefix = pathBytes.sublist(i, i + w);
|
||||||
@@ -4731,6 +4732,7 @@ class MeshCoreConnector extends ChangeNotifier {
|
|||||||
message.senderName,
|
message.senderName,
|
||||||
message.timestamp,
|
message.timestamp,
|
||||||
pathBytes: message.pathBytes,
|
pathBytes: message.pathBytes,
|
||||||
|
pathHashWidth: message.pathHashWidth,
|
||||||
);
|
);
|
||||||
final isNew = _addChannelMessage(message.channelIndex!, message);
|
final isNew = _addChannelMessage(message.channelIndex!, message);
|
||||||
if (isNew && !message.isOutgoing) {
|
if (isNew && !message.isOutgoing) {
|
||||||
@@ -4806,6 +4808,7 @@ class MeshCoreConnector extends ChangeNotifier {
|
|||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
status: ChannelMessageStatus.sent,
|
status: ChannelMessageStatus.sent,
|
||||||
pathLength: packet.isFlood ? packet.hopCount : 0,
|
pathLength: packet.isFlood ? packet.hopCount : 0,
|
||||||
|
pathHashWidth: packet.pathHashWidth,
|
||||||
pathBytes: packet.pathBytes,
|
pathBytes: packet.pathBytes,
|
||||||
channelIndex: channel.index,
|
channelIndex: channel.index,
|
||||||
packetHash: pktHash,
|
packetHash: pktHash,
|
||||||
@@ -4815,6 +4818,7 @@ class MeshCoreConnector extends ChangeNotifier {
|
|||||||
parsed.senderName,
|
parsed.senderName,
|
||||||
message.timestamp,
|
message.timestamp,
|
||||||
pathBytes: message.pathBytes,
|
pathBytes: message.pathBytes,
|
||||||
|
pathHashWidth: message.pathHashWidth,
|
||||||
);
|
);
|
||||||
final isNew = _addChannelMessage(channel.index, message);
|
final isNew = _addChannelMessage(channel.index, message);
|
||||||
if (isNew && !message.isOutgoing) {
|
if (isNew && !message.isOutgoing) {
|
||||||
@@ -6358,6 +6362,7 @@ class _RawPacket {
|
|||||||
routeType == _routeFlood || routeType == _routeTransportFlood;
|
routeType == _routeFlood || routeType == _routeTransportFlood;
|
||||||
|
|
||||||
int get hopCount => pathLenRaw & 63;
|
int get hopCount => pathLenRaw & 63;
|
||||||
|
int get pathHashWidth => ((pathLenRaw >> 6) & 0x03) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ParsedText {
|
class _ParsedText {
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ class ChannelMessage {
|
|||||||
final List<Repeat> repeats;
|
final List<Repeat> repeats;
|
||||||
final int repeatCount;
|
final int repeatCount;
|
||||||
final int? pathLength;
|
final int? pathLength;
|
||||||
|
final int? pathHashWidth;
|
||||||
final Uint8List pathBytes;
|
final Uint8List pathBytes;
|
||||||
final List<Uint8List> pathVariants;
|
final List<Uint8List> pathVariants;
|
||||||
final int? channelIndex;
|
final int? channelIndex;
|
||||||
@@ -66,6 +67,7 @@ class ChannelMessage {
|
|||||||
this.repeats = const [],
|
this.repeats = const [],
|
||||||
this.repeatCount = 0,
|
this.repeatCount = 0,
|
||||||
this.pathLength,
|
this.pathLength,
|
||||||
|
this.pathHashWidth,
|
||||||
Uint8List? pathBytes,
|
Uint8List? pathBytes,
|
||||||
List<Uint8List>? pathVariants,
|
List<Uint8List>? pathVariants,
|
||||||
this.channelIndex,
|
this.channelIndex,
|
||||||
@@ -93,6 +95,7 @@ class ChannelMessage {
|
|||||||
List<Repeat>? repeats,
|
List<Repeat>? repeats,
|
||||||
int? repeatCount,
|
int? repeatCount,
|
||||||
int? pathLength,
|
int? pathLength,
|
||||||
|
int? pathHashWidth,
|
||||||
Uint8List? pathBytes,
|
Uint8List? pathBytes,
|
||||||
List<Uint8List>? pathVariants,
|
List<Uint8List>? pathVariants,
|
||||||
String? packetHash,
|
String? packetHash,
|
||||||
@@ -129,6 +132,7 @@ class ChannelMessage {
|
|||||||
repeats: repeats ?? this.repeats,
|
repeats: repeats ?? this.repeats,
|
||||||
repeatCount: repeatCount ?? this.repeatCount,
|
repeatCount: repeatCount ?? this.repeatCount,
|
||||||
pathLength: pathLength ?? this.pathLength,
|
pathLength: pathLength ?? this.pathLength,
|
||||||
|
pathHashWidth: pathHashWidth ?? this.pathHashWidth,
|
||||||
pathBytes: pathBytes ?? this.pathBytes,
|
pathBytes: pathBytes ?? this.pathBytes,
|
||||||
pathVariants: pathVariants ?? this.pathVariants,
|
pathVariants: pathVariants ?? this.pathVariants,
|
||||||
channelIndex: channelIndex,
|
channelIndex: channelIndex,
|
||||||
@@ -155,6 +159,7 @@ class ChannelMessage {
|
|||||||
|
|
||||||
int pathLen;
|
int pathLen;
|
||||||
int txtType;
|
int txtType;
|
||||||
|
int? packetPathHashWidth;
|
||||||
Uint8List pathBytes = Uint8List(0);
|
Uint8List pathBytes = Uint8List(0);
|
||||||
int channelIdx;
|
int channelIdx;
|
||||||
if (code == respCodeChannelMsgRecvV3) {
|
if (code == respCodeChannelMsgRecvV3) {
|
||||||
@@ -165,7 +170,7 @@ class ChannelMessage {
|
|||||||
channelIdx = reader.readByte();
|
channelIdx = reader.readByte();
|
||||||
final pathByte = reader.readUInt8();
|
final pathByte = reader.readUInt8();
|
||||||
// pathByte packs: top 2 bits = hash width mode, low 6 bits = hop count
|
// pathByte packs: top 2 bits = hash width mode, low 6 bits = hop count
|
||||||
final packetPathHashWidth = ((pathByte & 0xC0) >> 6) + 1;
|
packetPathHashWidth = ((pathByte & 0xC0) >> 6) + 1;
|
||||||
final hopCount = pathByte & 0x3F;
|
final hopCount = pathByte & 0x3F;
|
||||||
pathLen = hopCount;
|
pathLen = hopCount;
|
||||||
// If a path is present, read hopCount * width bytes
|
// If a path is present, read hopCount * width bytes
|
||||||
@@ -215,6 +220,7 @@ class ChannelMessage {
|
|||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
status: ChannelMessageStatus.sent,
|
status: ChannelMessageStatus.sent,
|
||||||
pathLength: pathLen,
|
pathLength: pathLen,
|
||||||
|
pathHashWidth: packetPathHashWidth,
|
||||||
pathBytes: pathBytes,
|
pathBytes: pathBytes,
|
||||||
channelIndex: channelIdx,
|
channelIndex: channelIdx,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ class ChannelMessageStore {
|
|||||||
'channelIndex': msg.channelIndex,
|
'channelIndex': msg.channelIndex,
|
||||||
'repeatCount': msg.repeatCount,
|
'repeatCount': msg.repeatCount,
|
||||||
'pathLength': msg.pathLength,
|
'pathLength': msg.pathLength,
|
||||||
|
'pathHashWidth': msg.pathHashWidth,
|
||||||
'pathBytes': base64Encode(msg.pathBytes),
|
'pathBytes': base64Encode(msg.pathBytes),
|
||||||
'pathVariants': msg.pathVariants.map(base64Encode).toList(),
|
'pathVariants': msg.pathVariants.map(base64Encode).toList(),
|
||||||
'repeats': msg.repeats.map(_repeatToJson).toList(),
|
'repeats': msg.repeats.map(_repeatToJson).toList(),
|
||||||
@@ -144,6 +145,7 @@ class ChannelMessageStore {
|
|||||||
status: ChannelMessageStatus.values[json['status'] as int],
|
status: ChannelMessageStatus.values[json['status'] as int],
|
||||||
repeatCount: (json['repeatCount'] as int?) ?? 0,
|
repeatCount: (json['repeatCount'] as int?) ?? 0,
|
||||||
pathLength: json['pathLength'] as int?,
|
pathLength: json['pathLength'] as int?,
|
||||||
|
pathHashWidth: json['pathHashWidth'] as int?,
|
||||||
pathBytes: json['pathBytes'] != null
|
pathBytes: json['pathBytes'] != null
|
||||||
? Uint8List.fromList(base64Decode(json['pathBytes'] as String))
|
? Uint8List.fromList(base64Decode(json['pathBytes'] as String))
|
||||||
: Uint8List(0),
|
: Uint8List(0),
|
||||||
|
|||||||
Reference in New Issue
Block a user