@Override public StoredMessage getMessage(long uid) { synchronized (mailMessages) { for (StoredMessage mailMessage : mailMessages) { if (mailMessage.getUid() == uid) { return mailMessage; } } } return null; }
@Override public void add(StoredMessage storedMessage) { mailMessages.put(storedMessage.getUid(), storedMessage); }
@Override public long[] getMessageUids() { synchronized (mailMessages) { long[] uids = new long[mailMessages.size()]; for (int i = 0; i < mailMessages.size(); i++) { StoredMessage message = mailMessages.get(i); uids[i] = message.getUid(); } return uids; } }
@Override public int getMsn(long uid) throws FolderException { synchronized (mailMessages) { for (int i = 0; i < mailMessages.size(); i++) { StoredMessage message = mailMessages.get(i); if (message.getUid() == uid) { return i + 1; } } } throw new FolderException("No such message."); }
@Override public long getUID(Message message) { // Check if we have a message with same object reference ... otherwise, not supported. synchronized (mailMessages) { for (StoredMessage mailMessage : mailMessages) { if (mailMessage.getMimeMessage() == message) { return mailMessage.getUid(); } } } throw new IllegalStateException("No match found for " + message); }
@Override public Message[] getMessagesByUID(long start, long end) { synchronized (mailMessages) { List<Message> messages = new ArrayList<>(); for (StoredMessage mailMessage : mailMessages) { final long uid = mailMessage.getUid(); if (uid >= start && uid <= end) { messages.add(mailMessage.getMimeMessage()); } } return messages.toArray(new Message[messages.size()]); } }
@Override public Message[] getMessagesByUID(long[] uids) { synchronized (mailMessages) { List<Message> messages = new ArrayList<>(uids.length); Map<Long, StoredMessage> uid2Msg = new HashMap<>(mailMessages.size()); for (StoredMessage mailMessage : mailMessages) { uid2Msg.put(mailMessage.getUid(), mailMessage); } for (long uid : uids) { final StoredMessage storedMessage = uid2Msg.get(uid); if (storedMessage != null) { messages.add(storedMessage.getMimeMessage()); } } return messages.toArray(new Message[messages.size()]); } }
@Override public void expunge(List<FolderListener> mailboxListeners, IdRange[] idRanges) { int i = 1; synchronized (mailMessages) { for (final Iterator<Map.Entry<Long, StoredMessage>> messageEntryIt = mailMessages.entrySet().iterator(); messageEntryIt.hasNext(); ) { final Map.Entry<Long, StoredMessage> messageEntry = messageEntryIt.next(); if (messageEntry.getValue().isSet(Flags.Flag.DELETED) && (idRanges == null || IdRange.containsUid(idRanges, messageEntry.getValue().getUid()))) { // Notify all the listeners of the pending delete synchronized (mailboxListeners) { messageEntryIt.remove(); for (FolderListener expungeListener : mailboxListeners) { expungeListener.expunged(i); } } } i++; } } }
@Override public void expunge(List<FolderListener> folderListeners, IdRange[] idRanges) { synchronized (mailMessages) { for (int i = mailMessages.size() - 1; i >= 0; i--) { StoredMessage message = mailMessages.get(i); if (message.isSet(Flags.Flag.DELETED) && (idRanges == null || IdRange.containsUid(idRanges, message.getUid()))) { expungeMessage(i + 1, folderListeners); // MSNs start counting at 1 } } } }
@Override public long[] search(SearchTerm searchTerm) { List<StoredMessage> matchedMessages = new ArrayList<>(); synchronized (mailMessages) { for (int i = 0; i < mailMessages.size(); i++) { StoredMessage mailMessage = mailMessages.get(i); // Update message sequence number for potential sequence set search // https://tools.ietf.org/html/rfc3501#page-10 mailMessage.updateMessageNumber(i + 1); if (searchTerm.match(mailMessage.getMimeMessage())) { matchedMessages.add(mailMessage); } } } long[] matchedUids = new long[matchedMessages.size()]; for (int i = 0; i < matchedUids.length; i++) { StoredMessage storedMessage = matchedMessages.get(i); long uid = storedMessage.getUid(); matchedUids[i] = uid; } return matchedUids; }
conn.println("+OK"); for (StoredMessage msg : messages) { conn.println(inbox.getMsn(msg.getUid()) + " " + msg.getMimeMessage().getSize());