void setFlag(@NotNull String folderServerId, @NotNull List<String> messageServerIds, @NotNull Flag flag, boolean newState) throws MessagingException { ImapFolder remoteFolder = imapStore.getFolder(folderServerId); if (!remoteFolder.exists() || !remoteFolder.isFlagSupported(flag)) { return; } try { remoteFolder.open(Folder.OPEN_MODE_RW); if (remoteFolder.getMode() != Folder.OPEN_MODE_RW) { return; } List<Message> messages = new ArrayList<>(); for (String uid : messageServerIds) { if (!uid.startsWith(BackendFolder.LOCAL_UID_PREFIX)) { messages.add(remoteFolder.getMessage(uid)); } } if (messages.isEmpty()) { return; } remoteFolder.setFlags(messages, Collections.singleton(flag), newState); } finally { remoteFolder.close(); } } }
messages.add(remoteSrcFolder.getMessage(uid)); if (!remoteSrcFolder.exists()) { throw new MessagingException("processingPendingMoveOrCopy: remoteFolder " + srcFolder + " does not exist", true); remoteSrcFolder.open(Folder.OPEN_MODE_RW); if (remoteSrcFolder.getMode() != Folder.OPEN_MODE_RW) { throw new MessagingException("processingPendingMoveOrCopy: could not open remoteSrcFolder " + srcFolder + " read/write", true); return remoteSrcFolder.copyMessages(messages, remoteDestFolder); } else { return remoteSrcFolder.moveMessages(messages, remoteDestFolder);
protected List<ImapMessage> getMessages(final int start, final int end, Date earliestDate, final boolean includeDeleted, final MessageRetrievalListener<ImapMessage> listener) throws MessagingException { if (start < 1 || end < 1 || end < start) { throw new MessagingException(String.format(Locale.US, "Invalid message set %d %d", start, end)); } checkOpen(); String dateSearchString = getDateSearchString(earliestDate); String command = String.format(Locale.US, "UID SEARCH %d:%d%s%s", start, end, dateSearchString, includeDeleted ? "" : " NOT DELETED"); try { List<ImapResponse> imapResponses = connection.executeSimpleCommand(command); SearchResponse searchResponse = SearchResponse.parse(imapResponses); return getMessages(searchResponse, listener); } catch (IOException ioe) { throw ioExceptionHandler(connection, ioe); } }
@Override public void expunge() throws MessagingException { open(OPEN_MODE_RW); checkOpen(); try { executeSimpleCommand("EXPUNGE"); } catch (IOException ioe) { throw ioExceptionHandler(connection, ioe); } }
@Override public Map<String, String> moveMessages(List<? extends Message> messages, Folder folder) throws MessagingException { if (messages.isEmpty()) { return null; } Map<String, String> uidMapping = copyMessages(messages, folder); setFlags(messages, Collections.singleton(Flag.DELETED), true); return uidMapping; }
void markAllAsRead(@NotNull String folderServerId) throws MessagingException { ImapFolder remoteFolder = imapStore.getFolder(folderServerId); if (!remoteFolder.exists()) { return; } try { remoteFolder.open(Folder.OPEN_MODE_RW); if (remoteFolder.getMode() != Folder.OPEN_MODE_RW) { return; } remoteFolder.setFlags(Collections.singleton(Flag.SEEN), true); } finally { remoteFolder.close(); } } }
@Override public void delete(List<? extends Message> messages, String trashFolder) throws MessagingException { if (messages.isEmpty()) { return; } if (trashFolder == null || getServerId().equals(trashFolder)) { setFlags(messages, Collections.singleton(Flag.DELETED), true); } else { ImapFolder remoteTrashFolder = getStore().getFolder(trashFolder); String encodedTrashFolderName = folderNameCodec.encode(remoteTrashFolder.getPrefixedName()); String escapedTrashFolderName = ImapUtility.encodeString(encodedTrashFolderName); if (!exists(escapedTrashFolderName)) { if (K9MailLib.isDebug()) { Timber.i("ImapFolder.delete: couldn't find remote trash folder '%s' for %s", trashFolder, getLogId()); } throw new FolderNotFoundException(remoteTrashFolder.getServerId()); } if (K9MailLib.isDebug()) { Timber.d("IMAPMessage.delete: copying remote %d messages to '%s' for %s", messages.size(), trashFolder, getLogId()); } moveMessages(messages, remoteTrashFolder); } }
@Test public void fetch_withBodySaneFetchProfile_shouldIssueRespectiveCommand() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RO); folder.open(OPEN_MODE_RO); when(imapConnection.readResponse(nullable(ImapResponseCallback.class))).thenReturn(createImapResponse("x OK")); List<ImapMessage> messages = createImapMessages("1"); FetchProfile fetchProfile = createFetchProfile(Item.BODY_SANE); when(storeConfig.getMaximumAutoDownloadMessageSize()).thenReturn(4096); folder.fetch(messages, fetchProfile, null); verify(imapConnection).sendCommand("UID FETCH 1 (UID BODY.PEEK[]<0.4096>)", false); }
@Test public void getMessages_sequenceNumbers_withListener_shouldCallListener() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); setupUidSearchResponses("* SEARCH 99"); folder.open(OPEN_MODE_RW); MessageRetrievalListener<ImapMessage> listener = createMessageRetrievalListener(); List<ImapMessage> messages = folder.getMessages(singleton(1L), true, listener); ImapMessage message = messages.get(0); verify(listener).messageStarted("99", 0, 1); verify(listener).messageFinished(message, 0, 1); verifyNoMoreInteractions(listener); }
open(OPEN_MODE_RW); checkOpen(); long messageSize = message.calculateSize(); String encodeFolderName = folderNameCodec.encode(getPrefixedName()); String escapedFolderName = ImapUtility.encodeString(encodeFolderName); String combinedFlags = ImapUtility.combineFlags(message.getFlags(), response = connection.readResponse(); handleUntaggedResponse(response); String messageId = extractMessageId(message); String newUid = messageId != null ? getUidFromMessageId(messageId) : null; if (K9MailLib.isDebug()) { Timber.d("Got UID %s for message for %s", newUid, getLogId()); throw ioExceptionHandler(connection, ioe);
void downloadMessage(SyncConfig syncConfig, String folderServerId, String messageServerId) throws MessagingException { BackendFolder backendFolder = backendStorage.getFolder(folderServerId); ImapFolder remoteFolder = imapStore.getFolder(folderServerId); try { remoteFolder.open(Folder.OPEN_MODE_RO); Message remoteMessage = remoteFolder.getMessage(messageServerId); downloadMessages( syncConfig, remoteFolder, backendFolder, Collections.singletonList(remoteMessage), false, false, null, new SimpleSyncListener()); } finally { remoteFolder.close(); } }
checkOpen(); //only need READ access String encodedDestinationFolderName = folderNameCodec.encode(imapFolder.getPrefixedName()); String escapedDestinationFolderName = ImapUtility.encodeString(encodedDestinationFolderName); if (!exists(escapedDestinationFolderName)) { if (K9MailLib.isDebug()) { Timber.i("ImapFolder.copyMessages: couldn't find remote folder '%s' for %s", escapedDestinationFolderName, getLogId()); throw new FolderNotFoundException(imapFolder.getServerId()); return response == null ? null : response.getUidMapping(); } catch (IOException ioe) { throw ioExceptionHandler(connection, ioe);
@Test public void areMoreMessagesAvailable_withIndexOfOne_shouldReturnFalseWithoutPerformingSearch() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); folder.open(OPEN_MODE_RW); boolean areMoreMessagesAvailable = folder.areMoreMessagesAvailable(1, null); assertFalse(areMoreMessagesAvailable); //SELECT during OPEN and no more verify(imapConnection, times(1)).executeSimpleCommand(anyString()); }
@Test public void moveMessages_shouldDeleteMessagesFromSourceFolder() throws Exception { ImapFolder sourceFolder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); ImapFolder destinationFolder = createFolder("Destination"); List<ImapMessage> messages = singletonList(createImapMessage("1")); sourceFolder.open(OPEN_MODE_RW); sourceFolder.moveMessages(messages, destinationFolder); assertCommandWithIdsIssued("UID STORE 1 +FLAGS.SILENT (\\Deleted)"); }
@Test public void delete_fromTrashFolder_shouldIssueUidStoreFlagsCommand() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); List<ImapMessage> messages = singletonList(createImapMessage("23")); folder.open(OPEN_MODE_RW); folder.delete(messages, "Folder"); assertCommandWithIdsIssued("UID STORE 23 +FLAGS.SILENT (\\Deleted)"); }
@Test public void getHighestUid_imapConnectionThrowsNegativesResponse_shouldReturnMinusOne() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); doThrow(NegativeImapResponseException.class).when(imapConnection).executeSimpleCommand("UID SEARCH *:*"); folder.open(OPEN_MODE_RW); long highestUid = folder.getHighestUid(); assertEquals(-1L, highestUid); }
@Test public void fetchPart_withTextSection_shouldIssueRespectiveCommand() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RO); when(storeConfig.getMaximumAutoDownloadMessageSize()).thenReturn(4096); folder.open(OPEN_MODE_RO); ImapMessage message = createImapMessage("1"); Part part = createPart("TEXT"); when(imapConnection.readResponse(nullable(ImapResponseCallback.class))).thenReturn(createImapResponse("x OK")); folder.fetchPart(message, part, null, null); verify(imapConnection).sendCommand("UID FETCH 1 (UID BODY.PEEK[TEXT]<0.4096>)", false); }