Loading mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapConnection.kt +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import java.net.SocketException internal interface ImapConnection { val logId: String val connectionGeneration: Int val isConnected: Boolean val outputStream: OutputStream val isUidPlusCapable: Boolean Loading mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.kt +2 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ interface ImapStore { @Throws(MessagingException::class) fun getFolders(): List<FolderListItem> fun closeAllConnections() companion object { fun create( serverSettings: ServerSettings, Loading mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/RealImapConnection.java +12 −3 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ class RealImapConnection implements ImapConnection { private final TrustedSocketFactory socketFactory; private final int socketConnectTimeout; private final int socketReadTimeout; private final int connectionGeneration; private Socket socket; private PeekableInputStream inputStream; Loading @@ -96,24 +97,27 @@ class RealImapConnection implements ImapConnection { public RealImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, ConnectivityManager connectivityManager, OAuth2TokenProvider oauthTokenProvider) { ConnectivityManager connectivityManager, OAuth2TokenProvider oauthTokenProvider, int connectionGeneration) { this.settings = settings; this.socketFactory = socketFactory; this.connectivityManager = connectivityManager; this.oauthTokenProvider = oauthTokenProvider; this.socketConnectTimeout = SOCKET_CONNECT_TIMEOUT; this.socketReadTimeout = SOCKET_READ_TIMEOUT; this.connectionGeneration = connectionGeneration; } RealImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, public RealImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, ConnectivityManager connectivityManager, OAuth2TokenProvider oauthTokenProvider, int socketConnectTimeout, int socketReadTimeout) { int socketConnectTimeout, int socketReadTimeout, int connectionGeneration) { this.settings = settings; this.socketFactory = socketFactory; this.connectivityManager = connectivityManager; this.oauthTokenProvider = oauthTokenProvider; this.socketConnectTimeout = socketConnectTimeout; this.socketReadTimeout = socketReadTimeout; this.connectionGeneration = connectionGeneration; } @Override Loading Loading @@ -910,4 +914,9 @@ class RealImapConnection implements ImapConnection { public boolean isDataAvailable() throws IOException { return inputStream.available() > 0; } @Override public int getConnectionGeneration() { return connectionGeneration; } } mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/RealImapStore.java +25 −3 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ class RealImapStore implements ImapStore, ImapConnectionManager, InternalImapSto private String pathDelimiter = null; private final Deque<ImapConnection> connections = new LinkedList<>(); private FolderNameCodec folderNameCodec; private volatile int connectionGeneration = 1; public RealImapStore(ServerSettings serverSettings, ImapStoreConfig config, Loading Loading @@ -296,9 +297,29 @@ class RealImapStore implements ImapStore, ImapConnectionManager, InternalImapSto @Override public void releaseConnection(ImapConnection connection) { if (connection != null && connection.isConnected()) { if (connection.getConnectionGeneration() == connectionGeneration) { synchronized (connections) { connections.offer(connection); } } else { connection.close(); } } } @Override public void closeAllConnections() { Timber.v("ImapStore.closeAllConnections()"); List<ImapConnection> connectionsToClose; synchronized (connections) { connectionGeneration++; connectionsToClose = new ArrayList<>(connections); connections.clear(); } for (ImapConnection connection : connectionsToClose) { connection.close(); } } Loading @@ -307,7 +328,8 @@ class RealImapStore implements ImapStore, ImapConnectionManager, InternalImapSto new StoreImapSettings(), trustedSocketFactory, connectivityManager, oauthTokenProvider); oauthTokenProvider, connectionGeneration); } @Override Loading mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/RealImapConnectionTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -975,7 +975,7 @@ public class RealImapConnectionTest { private ImapConnection createImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, ConnectivityManager connectivityManager, OAuth2TokenProvider oAuth2TokenProvider) { return new RealImapConnection(settings, socketFactory, connectivityManager, oAuth2TokenProvider, SOCKET_CONNECT_TIMEOUT, SOCKET_READ_TIMEOUT); SOCKET_CONNECT_TIMEOUT, SOCKET_READ_TIMEOUT, 1); } private ImapConnection startServerAndCreateImapConnection(MockImapServer server) throws IOException { Loading Loading
mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapConnection.kt +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import java.net.SocketException internal interface ImapConnection { val logId: String val connectionGeneration: Int val isConnected: Boolean val outputStream: OutputStream val isUidPlusCapable: Boolean Loading
mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.kt +2 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ interface ImapStore { @Throws(MessagingException::class) fun getFolders(): List<FolderListItem> fun closeAllConnections() companion object { fun create( serverSettings: ServerSettings, Loading
mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/RealImapConnection.java +12 −3 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ class RealImapConnection implements ImapConnection { private final TrustedSocketFactory socketFactory; private final int socketConnectTimeout; private final int socketReadTimeout; private final int connectionGeneration; private Socket socket; private PeekableInputStream inputStream; Loading @@ -96,24 +97,27 @@ class RealImapConnection implements ImapConnection { public RealImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, ConnectivityManager connectivityManager, OAuth2TokenProvider oauthTokenProvider) { ConnectivityManager connectivityManager, OAuth2TokenProvider oauthTokenProvider, int connectionGeneration) { this.settings = settings; this.socketFactory = socketFactory; this.connectivityManager = connectivityManager; this.oauthTokenProvider = oauthTokenProvider; this.socketConnectTimeout = SOCKET_CONNECT_TIMEOUT; this.socketReadTimeout = SOCKET_READ_TIMEOUT; this.connectionGeneration = connectionGeneration; } RealImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, public RealImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, ConnectivityManager connectivityManager, OAuth2TokenProvider oauthTokenProvider, int socketConnectTimeout, int socketReadTimeout) { int socketConnectTimeout, int socketReadTimeout, int connectionGeneration) { this.settings = settings; this.socketFactory = socketFactory; this.connectivityManager = connectivityManager; this.oauthTokenProvider = oauthTokenProvider; this.socketConnectTimeout = socketConnectTimeout; this.socketReadTimeout = socketReadTimeout; this.connectionGeneration = connectionGeneration; } @Override Loading Loading @@ -910,4 +914,9 @@ class RealImapConnection implements ImapConnection { public boolean isDataAvailable() throws IOException { return inputStream.available() > 0; } @Override public int getConnectionGeneration() { return connectionGeneration; } }
mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/RealImapStore.java +25 −3 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ class RealImapStore implements ImapStore, ImapConnectionManager, InternalImapSto private String pathDelimiter = null; private final Deque<ImapConnection> connections = new LinkedList<>(); private FolderNameCodec folderNameCodec; private volatile int connectionGeneration = 1; public RealImapStore(ServerSettings serverSettings, ImapStoreConfig config, Loading Loading @@ -296,9 +297,29 @@ class RealImapStore implements ImapStore, ImapConnectionManager, InternalImapSto @Override public void releaseConnection(ImapConnection connection) { if (connection != null && connection.isConnected()) { if (connection.getConnectionGeneration() == connectionGeneration) { synchronized (connections) { connections.offer(connection); } } else { connection.close(); } } } @Override public void closeAllConnections() { Timber.v("ImapStore.closeAllConnections()"); List<ImapConnection> connectionsToClose; synchronized (connections) { connectionGeneration++; connectionsToClose = new ArrayList<>(connections); connections.clear(); } for (ImapConnection connection : connectionsToClose) { connection.close(); } } Loading @@ -307,7 +328,8 @@ class RealImapStore implements ImapStore, ImapConnectionManager, InternalImapSto new StoreImapSettings(), trustedSocketFactory, connectivityManager, oauthTokenProvider); oauthTokenProvider, connectionGeneration); } @Override Loading
mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/RealImapConnectionTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -975,7 +975,7 @@ public class RealImapConnectionTest { private ImapConnection createImapConnection(ImapSettings settings, TrustedSocketFactory socketFactory, ConnectivityManager connectivityManager, OAuth2TokenProvider oAuth2TokenProvider) { return new RealImapConnection(settings, socketFactory, connectivityManager, oAuth2TokenProvider, SOCKET_CONNECT_TIMEOUT, SOCKET_READ_TIMEOUT); SOCKET_CONNECT_TIMEOUT, SOCKET_READ_TIMEOUT, 1); } private ImapConnection startServerAndCreateImapConnection(MockImapServer server) throws IOException { Loading