package asmack.org.jivesoftware.smackx; import asmack.org.jivesoftware.smack.Connection; import asmack.org.jivesoftware.smack.PacketCollector; import asmack.org.jivesoftware.smack.SmackConfiguration; import asmack.org.jivesoftware.smack.XMPPException; import asmack.org.jivesoftware.smack.filter.AndFilter; import asmack.org.jivesoftware.smack.filter.PacketExtensionFilter; import asmack.org.jivesoftware.smack.filter.PacketFilter; import asmack.org.jivesoftware.smack.filter.PacketIDFilter; import asmack.org.jivesoftware.smack.filter.PacketTypeFilter; import asmack.org.jivesoftware.smack.packet.IQ; import asmack.org.jivesoftware.smack.packet.Message; import asmack.org.jivesoftware.smack.packet.Packet; import asmack.org.jivesoftware.smackx.packet.DiscoverItems; import asmack.org.jivesoftware.smackx.packet.MessageEvent; import asmack.org.jivesoftware.smackx.packet.OfflineMessageInfo; import asmack.org.jivesoftware.smackx.packet.OfflineMessageRequest; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class OfflineMessageManager { private static final String namespace = "http://jabber.org/protocol/offline"; private Connection connection; private PacketFilter packetFilter = new AndFilter(new PacketExtensionFilter(MessageEvent.OFFLINE, namespace), new PacketTypeFilter(Message.class)); public OfflineMessageManager(Connection connection2) { this.connection = connection2; } public void deleteMessages() throws XMPPException { OfflineMessageRequest offlineMessageRequest = new OfflineMessageRequest(); offlineMessageRequest.setPurge(true); PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(offlineMessageRequest.getPacketID())); this.connection.sendPacket(offlineMessageRequest); IQ iq = (IQ) createPacketCollector.nextResult((long) SmackConfiguration.getPacketReplyTimeout()); createPacketCollector.cancel(); if (iq == null) { throw new XMPPException("No response from server."); } else if (iq.getError() != null) { throw new XMPPException(iq.getError()); } } public void deleteMessages(List<String> list) throws XMPPException { OfflineMessageRequest offlineMessageRequest = new OfflineMessageRequest(); for (String str : list) { OfflineMessageRequest.Item item = new OfflineMessageRequest.Item(str); item.setAction(DiscoverItems.Item.REMOVE_ACTION); offlineMessageRequest.addItem(item); } PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(offlineMessageRequest.getPacketID())); this.connection.sendPacket(offlineMessageRequest); IQ iq = (IQ) createPacketCollector.nextResult((long) SmackConfiguration.getPacketReplyTimeout()); createPacketCollector.cancel(); if (iq == null) { throw new XMPPException("No response from server."); } else if (iq.getError() != null) { throw new XMPPException(iq.getError()); } } public Iterator<OfflineMessageHeader> getHeaders() throws XMPPException { ArrayList arrayList = new ArrayList(); Iterator<DiscoverItems.Item> items = ServiceDiscoveryManager.getInstanceFor(this.connection).discoverItems(null, namespace).getItems(); while (items.hasNext()) { arrayList.add(new OfflineMessageHeader(items.next())); } return arrayList.iterator(); } public int getMessageCount() throws XMPPException { Form formFrom = Form.getFormFrom(ServiceDiscoveryManager.getInstanceFor(this.connection).discoverInfo(null, namespace)); if (formFrom != null) { return Integer.parseInt(formFrom.getField("number_of_messages").getValues().next()); } return 0; } public Iterator<Message> getMessages() throws XMPPException { ArrayList arrayList = new ArrayList(); OfflineMessageRequest offlineMessageRequest = new OfflineMessageRequest(); offlineMessageRequest.setFetch(true); PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(offlineMessageRequest.getPacketID())); PacketCollector createPacketCollector2 = this.connection.createPacketCollector(this.packetFilter); this.connection.sendPacket(offlineMessageRequest); IQ iq = (IQ) createPacketCollector.nextResult((long) SmackConfiguration.getPacketReplyTimeout()); createPacketCollector.cancel(); if (iq == null) { throw new XMPPException("No response from server."); } else if (iq.getError() == null) { while (true) { Message message = (Message) createPacketCollector2.nextResult((long) SmackConfiguration.getPacketReplyTimeout()); if (message == null) { createPacketCollector2.cancel(); return arrayList.iterator(); } arrayList.add(message); } } else { throw new XMPPException(iq.getError()); } } public Iterator<Message> getMessages(final List<String> list) throws XMPPException { ArrayList arrayList = new ArrayList(); OfflineMessageRequest offlineMessageRequest = new OfflineMessageRequest(); for (String str : list) { OfflineMessageRequest.Item item = new OfflineMessageRequest.Item(str); item.setAction("view"); offlineMessageRequest.addItem(item); } PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(offlineMessageRequest.getPacketID())); PacketCollector createPacketCollector2 = this.connection.createPacketCollector(new AndFilter(this.packetFilter, new PacketFilter() { /* class asmack.org.jivesoftware.smackx.OfflineMessageManager.AnonymousClass1 */ @Override // asmack.org.jivesoftware.smack.filter.PacketFilter public boolean accept(Packet packet) { return list.contains(((OfflineMessageInfo) packet.getExtension(MessageEvent.OFFLINE, OfflineMessageManager.namespace)).getNode()); } })); this.connection.sendPacket(offlineMessageRequest); IQ iq = (IQ) createPacketCollector.nextResult((long) SmackConfiguration.getPacketReplyTimeout()); createPacketCollector.cancel(); if (iq == null) { throw new XMPPException("No response from server."); } else if (iq.getError() == null) { while (true) { Message message = (Message) createPacketCollector2.nextResult((long) SmackConfiguration.getPacketReplyTimeout()); if (message == null) { createPacketCollector2.cancel(); return arrayList.iterator(); } arrayList.add(message); } } else { throw new XMPPException(iq.getError()); } } public boolean supportsFlexibleRetrieval() throws XMPPException { return ServiceDiscoveryManager.getInstanceFor(this.connection).discoverInfo(null).containsFeature(namespace); } }