/** * Returns a List of the offline <tt>Messages</tt> whose stamp matches the specified * request. The request will include the list of stamps that uniquely identifies * the offline messages to retrieve. The returned offline messages will not be deleted * from the server. Use {@link #deleteMessages(java.util.List)} to delete the messages. * * @param nodes the list of stamps that uniquely identifies offline message. * @return a List with the offline <tt>Messages</tt> that were received as part of * this request. * @throws XMPPErrorException If the user is not allowed to make this request or the server does * not support offline message retrieval. * @throws NoResponseException if there was no response from the server. * @throws NotConnectedException */ public List<Message> getMessages(final List<String> nodes) throws NoResponseException, XMPPErrorException, NotConnectedException { List<Message> messages = new ArrayList<Message>(); OfflineMessageRequest request = new OfflineMessageRequest(); for (String node : nodes) { OfflineMessageRequest.Item item = new OfflineMessageRequest.Item(node); item.setAction("view"); request.addItem(item); } // Filter offline messages that were requested by this request StanzaFilter messageFilter = new AndFilter(PACKET_FILTER, new StanzaFilter() { public boolean accept(Stanza packet) { OfflineMessageInfo info = (OfflineMessageInfo) packet.getExtension("offline", namespace); return nodes.contains(info.getNode()); } }); PacketCollector messageCollector = connection.createPacketCollector(messageFilter); try { connection.createPacketCollectorAndSend(request).nextResultOrThrow(); // Collect the received offline messages Message message = messageCollector.nextResult(); while (message != null) { messages.add(message); message = messageCollector.nextResult(); } } finally { // Stop queuing offline messages messageCollector.cancel(); } return messages; }
/** * Returns a List of Messages with all the offline <tt>Messages</tt> of the user. The returned offline * messages will not be deleted from the server. Use {@link #deleteMessages(java.util.List)} * to delete the messages. * * @return a List with all the offline <tt>Messages</tt> of the user. * @throws XMPPErrorException If the user is not allowed to make this request or the server does * not support offline message retrieval. * @throws NoResponseException if there was no response from the server. * @throws NotConnectedException */ public List<Message> getMessages() throws NoResponseException, XMPPErrorException, NotConnectedException { OfflineMessageRequest request = new OfflineMessageRequest(); request.setFetch(true); PacketCollector resultCollector = connection.createPacketCollectorAndSend(request); PacketCollector.Configuration messageCollectorConfiguration = PacketCollector.newConfiguration().setStanzaFilter(PACKET_FILTER).setCollectorToReset(resultCollector); PacketCollector messageCollector = connection.createPacketCollector(messageCollectorConfiguration); List<Message> messages = null; try { resultCollector.nextResultOrThrow(); // Be extra safe, cancel the message collector right here so that it does not collector // other messages that eventually match (although I've no idea how this could happen in // case of XEP-13). messageCollector.cancel(); messages = new ArrayList<>(messageCollector.getCollectedCount()); Message message; while ((message = messageCollector.pollResult()) != null) { messages.add(message); } } finally { // Ensure that the message collector is canceled even if nextResultOrThrow threw. It // doesn't matter if we cancel the message collector twice messageCollector.cancel(); } return messages; }
/** * Deletes the specified list of offline messages. The request will include the list of * stamps that uniquely identifies the offline messages to delete. * * @param nodes the list of stamps that uniquely identifies offline message. * @throws XMPPErrorException If the user is not allowed to make this request or the server does * not support offline message retrieval. * @throws NoResponseException if there was no response from the server. * @throws NotConnectedException */ public void deleteMessages(List<String> nodes) throws NoResponseException, XMPPErrorException, NotConnectedException { OfflineMessageRequest request = new OfflineMessageRequest(); for (String node : nodes) { OfflineMessageRequest.Item item = new OfflineMessageRequest.Item(node); item.setAction("remove"); request.addItem(item); } connection.createPacketCollectorAndSend(request).nextResultOrThrow(); }
/** * Deletes all offline messages of the user. * * @throws XMPPErrorException If the user is not allowed to make this request or the server does * not support offline message retrieval. * @throws NoResponseException if there was no response from the server. * @throws NotConnectedException */ public void deleteMessages() throws NoResponseException, XMPPErrorException, NotConnectedException { OfflineMessageRequest request = new OfflineMessageRequest(); request.setPurge(true); connection.createPacketCollectorAndSend(request).nextResultOrThrow(); }