<message from='userJIdFrom/Resource' to='userJIdTo/Resource' xml:lang='en' id='70720-25' company='SimbirSoft'> <read xmlns='urn:xmpp:receipts' id='ILKMe-22'/> </message>
// “ReadMessageStanza” , // public class ReadMessageStanza extends Stanza { @Override public CharSequence toXML() { XmlStringBuilder buf = new XmlStringBuilder(); // “<” // rootElement “iq”, “message”, “stanza”. buf.halfOpenElement(rootElement); // "to", "from", "id", "lang" . // "to" “setTo” “Stanza” // "id", "lang" “Stanza” // "from" , // XMPPTCPConnection // “setFromMode(XMPPConnection.FromMode.USER);“ addCommonAttributes(buf); for (String key : attributes.keySet()) { // buf.attribute(key, attributes.get(key)); } // “/>” buf.rightAngleBracket(); // . “Stanza” buf.append(getChildElementXML()); // Extensions. // xml buf.append(getExtensionsXML()); // “</id>”, “</message>”, “</stanza>” buf.closeElement(rootElement); return buf; } }
xmppTCPConnection.sendStanza(new ReadMessageStanza());
“xmppTCPConnection”
object “xmppTCPConnection”
class type will be “ReadMessageStanza”
: xmppTCPConnection.addPacketSendingListener(new StanzaListener() { @Override public void processPacket(Stanza packet) throws SmackException.NotConnectedException { Map<String, String> map =((ReadMessageStanza )packet).getAttributes(); // “ReadMessageStanza”... } }, new StanzaFilter() { @Override public boolean accept(Stanza stanza) { // return stanza instanceof ReadMessageStanza; } });
The implementation of “ReadMessageStanza”
shown above for demonstrative purposes. It is more correct to put the code into the “CustomStanza”
base class or use the “Builder”
pattern to build packages."ReadMessageStanza"
provider will be the following: public class ReadMessageProvider extends ExtensionElementProvider<ReadMessageProvider.Element> { // public static final String ELEMENT_NAME = ”read”; // namespace public static final String NAMESPACE = ”urn:xmpp:receipts”; // // “ExtensionElement” Smack. // toXML, // “Extensions” ReadMessageStanza- public static class Element implements ExtensionElement { private final String id; Element(String id) { this.id = id; } public String getId() { return id; } // “Extension” // , null toXML @Override public CharSequence toXML() { return null; } @Override public String getNamespace() { return NAMESPACE; } @Override public String getElementName() { return ELEMENT_NAME; } } // @Override public ReadMessageProvider .Element parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, SmackException { // return new ReadMessageProvider .Element(parser.getAttributeValue("", "id")); } }
static { ProviderManager.addExtensionProvider(ReadMessageProvider.ELEMENT_NAME, ReadMessageProvider.NAMESPACE, new ReadMessageProvider()); }
private StanzaListener inComingChatListener = new StanzaListener() { @Override public void processPacket(Stanza packet) throws SmackException.NotConnectedException{ Message message = (Message) packet; // , if(message.hasExtension(ReadMessageProvider.ELEMENT_NAME, ReadMessageProvider.NAMESPACE)) { ReadMessageProvider.Element element = message.getExtension(ReadMessageProvider.ELEMENT_NAME, ReadMessageProvider.NAMESPACE); int id = element.getId(); // ... } }; }
MessageTypeFilter.NORMAL_OR_CHAT
filter: xmppTCPConnection.addSyncStanzaListener(inComingChatListener, MessageTypeFilter.NORMAL_OR_CHAT);
<iq xmlns='xep:mymessages' to='server' from='userJIdFrom/Resource' id='J8OPC-50' type='history'> <query count='50' offset='0'>'userJIdTo/Resource'</query> </iq>
“ReadMessageStanza”
. <iq xmlns='xep:mymessages' type='result' to='userJIdFrom/Resource' id='Ji3H1-43'> <result> <message id='cfd6fce4-2f30-d1e3-349e-11eab92bc3fa' from='userJIdFrom/Resource' to='userJIdTo/Resource' type='chat'> <body>Message</body> <query xmlns='jabber:iq:time'> <utc>1482729259000000</utc> </query> </message> </result> </iq>
// IQ- public class MyMessagesProvider extends IQProvider<MyMessagesProvider.Result> { // . enum Smack public static final String ELEMENT_NAME = IQ.Type.result.name(); // namespace public static final String NAMESPACE = ”xep:mymessages”; // public static class Result extends IQ { // private List<CustomMessage> mItems = new ArrayList<>(); private Result() { super("items"); } @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { return null; } public List<CustomMessage> getValue() { return mItems; } } @Override public MyMessagesProvider.Result parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, SmackException { MyMessagesProvider.Result result = new MyMessagesProvider.Result(); result.mItems = new ArrayList<>(); // “message” parser // ... return result; } }
static { ProviderManager.addIQProvider(MyMessagesProvider.ELEMENT_NAME, MyMessagesProvider.NAMESPACE, new MyMessagesProvider()); }
xmppTCPConnection.sendStanzaWithResponseCallback( // IQ- new CustomStanza(), // IQ-. , // . new StanzaFilter() { @Override public boolean accept(Stanza stanza) { return stanza instanceof MyMessagesProvider.Result; } }, // IQ-, new StanzaListener() { @Override public void processPacket(Stanza packet) throws SmackException.NotConnectedException { List<CustomMessage> value = ((MyMessagesProvider.Result) packet).getValue(); // } }, // new ExceptionCallback() { @Override public void processException(Exception exception) { } } );
Source: https://habr.com/ru/post/319150/
All Articles