diff --git a/packages/moxxmpp/lib/src/events.dart b/packages/moxxmpp/lib/src/events.dart index 44f18f6..44b6d47 100644 --- a/packages/moxxmpp/lib/src/events.dart +++ b/packages/moxxmpp/lib/src/events.dart @@ -6,6 +6,7 @@ import 'package:moxxmpp/src/xeps/xep_0030/types.dart'; import 'package:moxxmpp/src/xeps/xep_0060/xep_0060.dart'; import 'package:moxxmpp/src/xeps/xep_0066.dart'; import 'package:moxxmpp/src/xeps/xep_0085.dart'; +import 'package:moxxmpp/src/xeps/xep_0334.dart'; import 'package:moxxmpp/src/xeps/xep_0359.dart'; import 'package:moxxmpp/src/xeps/xep_0385.dart'; import 'package:moxxmpp/src/xeps/xep_0424.dart'; @@ -77,6 +78,7 @@ class MessageEvent extends XmppEvent { this.messageRetraction, this.messageCorrectionId, this.messageReactions, + this.messageProcessingHints, }); final StanzaError? error; final String body; @@ -100,6 +102,7 @@ class MessageEvent extends XmppEvent { final MessageRetractionData? messageRetraction; final String? messageCorrectionId; final MessageReactions? messageReactions; + final List? messageProcessingHints; final Map other; } diff --git a/packages/moxxmpp/lib/src/message.dart b/packages/moxxmpp/lib/src/message.dart index b858ee3..43b3794 100644 --- a/packages/moxxmpp/lib/src/message.dart +++ b/packages/moxxmpp/lib/src/message.dart @@ -13,6 +13,7 @@ import 'package:moxxmpp/src/xeps/xep_0085.dart'; import 'package:moxxmpp/src/xeps/xep_0184.dart'; import 'package:moxxmpp/src/xeps/xep_0308.dart'; import 'package:moxxmpp/src/xeps/xep_0333.dart'; +import 'package:moxxmpp/src/xeps/xep_0334.dart'; import 'package:moxxmpp/src/xeps/xep_0359.dart'; import 'package:moxxmpp/src/xeps/xep_0424.dart'; import 'package:moxxmpp/src/xeps/xep_0444.dart'; @@ -40,6 +41,7 @@ class MessageDetails { this.messageRetraction, this.lastMessageCorrectionId, this.messageReactions, + this.messageProcessingHints, }); final String to; final String? body; @@ -59,6 +61,7 @@ class MessageDetails { final MessageRetractionData? messageRetraction; final String? lastMessageCorrectionId; final MessageReactions? messageReactions; + final List? messageProcessingHints; } class MessageManager extends XmppManagerBase { @@ -84,6 +87,11 @@ class MessageManager extends XmppManagerBase { final message = state.stanza; final body = message.firstTag('body'); + final hints = List.empty(growable: true); + for (final element in message.findTagsByXmlns(messageProcessingHintsXmlns)) { + hints.add(messageProcessingHintFromXml(element)); + } + getAttributes().sendEvent(MessageEvent( body: body != null ? body.innerText() : '', fromJid: JID.fromString(message.attributes['from']! as String), @@ -106,6 +114,9 @@ class MessageManager extends XmppManagerBase { messageRetraction: state.messageRetraction, messageCorrectionId: state.lastMessageCorrectionSid, messageReactions: state.messageReactions, + messageProcessingHints: hints.isEmpty ? + null : + hints, other: state.other, error: StanzaError.fromStanza(message), ),); @@ -270,6 +281,12 @@ class MessageManager extends XmppManagerBase { stanza.addChild(details.messageReactions!.toXml()); } + if (details.messageProcessingHints != null) { + for (final hint in details.messageProcessingHints!) { + stanza.addChild(hint.toXml()); + } + } + getAttributes().sendStanza(stanza, awaitable: false); } } diff --git a/packages/moxxmpp/lib/src/stringxml.dart b/packages/moxxmpp/lib/src/stringxml.dart index 26c1c5b..ece9e1b 100644 --- a/packages/moxxmpp/lib/src/stringxml.dart +++ b/packages/moxxmpp/lib/src/stringxml.dart @@ -129,6 +129,12 @@ class XMLNode { }).toList(); } + List findTagsByXmlns(String xmlns) { + return children + .where((element) => element.attributes['xmlns'] == xmlns) + .toList(); + } + /// Returns the inner text of the node. If none is set, returns the "". String innerText() { return text ?? ''; diff --git a/packages/moxxmpp/lib/src/xeps/xep_0334.dart b/packages/moxxmpp/lib/src/xeps/xep_0334.dart index 61da7ef..3b7853f 100644 --- a/packages/moxxmpp/lib/src/xeps/xep_0334.dart +++ b/packages/moxxmpp/lib/src/xeps/xep_0334.dart @@ -8,8 +8,18 @@ enum MessageProcessingHint { store, } -/// NOTE: We do not define a function for turning a Message Processing Hint element into -/// an enum value since the elements do not concern us as a client. +MessageProcessingHint messageProcessingHintFromXml(XMLNode element) { + switch (element.tag) { + case 'no-permanent-store': return MessageProcessingHint.noPermanentStore; + case 'no-store': return MessageProcessingHint.noStore; + case 'no-copy': return MessageProcessingHint.noCopies; + case 'store': return MessageProcessingHint.store; + } + + assert(false, 'Invalid Message Processing Hint: ${element.tag}'); + return MessageProcessingHint.noStore; +} + extension XmlExtension on MessageProcessingHint { XMLNode toXml() { String tag;