private List<ImapFolder> getFolders(List<FolderListItem> folders) { List<ImapFolder> imapFolders = new ArrayList<>(folders.size()); for (FolderListItem folder : folders) { ImapFolder imapFolder = getFolder(folder.getName()); imapFolder.setType(folder.getType()); imapFolders.add(imapFolder); } return imapFolders; }
private void configureRemoteStoreWithFolder() { when(remoteStore.getFolder(FOLDER_NAME)).thenReturn(remoteFolder); when(remoteFolder.getServerId()).thenReturn(FOLDER_NAME); }
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(); } } }
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(); } } }
void expungeMessages(@NotNull String folderServerId, @NotNull List<String> messageServerIds) throws MessagingException { Folder remoteFolder = imapStore.getFolder(folderServerId); try { if (!remoteFolder.exists()) { return; } remoteFolder.open(Folder.OPEN_MODE_RW); if (remoteFolder.getMode() != Folder.OPEN_MODE_RW) { return; } remoteFolder.expungeUids(messageServerIds); } finally { remoteFolder.close(); } } }
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(); } }
void expunge(@NotNull String folderServerId) throws MessagingException { Timber.d("processPendingExpunge: folder = %s", folderServerId); Folder remoteFolder = imapStore.getFolder(folderServerId); try { if (!remoteFolder.exists()) { return; } remoteFolder.open(Folder.OPEN_MODE_RW); if (remoteFolder.getMode() != Folder.OPEN_MODE_RW) { return; } remoteFolder.expunge(); Timber.d("processPendingExpunge: complete for folder = %s", folderServerId); } 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 delete_shouldMoveMessagesToTrashFolder() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); ImapFolder trashFolder = createFolder("Trash"); when(imapStore.getFolder("Trash")).thenReturn(trashFolder); List<ImapMessage> messages = singletonList(createImapMessage("2")); setupCopyResponse("x OK [COPYUID 23 2 102] Success"); folder.open(OPEN_MODE_RW); folder.delete(messages, "Trash"); assertCommandWithIdsIssued("UID STORE 2 +FLAGS.SILENT (\\Deleted)"); }
@Test public void delete_withoutTrashFolderExisting_shouldThrow() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); ImapFolder trashFolder = createFolder("Trash"); when(imapStore.getFolder("Trash")).thenReturn(trashFolder); List<ImapMessage> messages = singletonList(createImapMessage("2")); List<ImapResponse> copyResponses = singletonList( createImapResponse("x OK [COPYUID 23 2 102] Success") ); when(imapConnection.executeSimpleCommand("UID COPY 2 \"Trash\"")).thenReturn(copyResponses); folder.open(OPEN_MODE_RW); doThrow(NegativeImapResponseException.class).doReturn(Collections.emptyList()) .when(imapConnection).executeSimpleCommand("STATUS \"Trash\" (RECENT)"); try { folder.delete(messages, "Trash"); fail("Expected exception"); } catch (FolderNotFoundException e) { assertEquals("Trash", e.getFolderServerId()); } }
} else { Timber.v("SYNC: About to get remote folder %s", folder); remoteFolder = imapStore.getFolder(folder);