diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt index 093e6fa0013879f5db891146d8fc1fc6425d5ee2..adb777f4f59100b8112df0a48b09c011e829d736 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt @@ -3,6 +3,8 @@ package de.kuschku.quasseldroid_ng.service import android.arch.lifecycle.LifecycleService import android.content.Intent import android.os.Binder +import android.os.Handler +import android.os.HandlerThread import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.session.Backend import de.kuschku.libquassel.session.Session @@ -18,7 +20,7 @@ import javax.net.ssl.X509TrustManager class QuasselService : LifecycleService() { private lateinit var session: Session - private val backend = object : Backend { + private val backendImplementation = object : Backend { override fun session() = session override fun connect(address: SocketAddress, user: String, pass: String) { @@ -33,6 +35,30 @@ class QuasselService : LifecycleService() { } } + private val asyncBackend = object : Backend { + private val thread = HandlerThread("BackendHandler") + private val handler: Handler + + init { + thread.start() + handler = Handler(thread.looper) + } + + override fun connect(address: SocketAddress, user: String, pass: String) { + handler.post { + backendImplementation.connect(address, user, pass) + } + } + + override fun disconnect() { + handler.post { + backendImplementation.disconnect() + } + } + + override fun session() = backendImplementation.session() + } + private lateinit var database: QuasselDatabase override fun onCreate() { @@ -63,7 +89,7 @@ class QuasselService : LifecycleService() { override fun onBind(intent: Intent?): QuasselBinder { super.onBind(intent) - return QuasselBinder(backend) + return QuasselBinder(asyncBackend) } class QuasselBinder(val backend: Backend) : Binder() diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt index 81f4b8e69c79dd7c23fd9b4d3493a33bdf81621f..af42d2d4c76a471b4d47937b1f60b12215343f9a 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt @@ -112,17 +112,13 @@ class CoreConnection( } override fun close() { - interrupt() - handlerService.quit() - val thread = Thread { - try { - channel?.close() - } catch (e: Throwable) { - log(WARN, TAG, "Error encountered while closing connection", e) - } + try { + channel?.close() + interrupt() + handlerService.quit() + } catch (e: Throwable) { + log(WARN, TAG, "Error encountered while closing connection", e) } - thread.start() - thread.join() } override fun dispatch(message: HandshakeMessage) { @@ -166,15 +162,17 @@ class CoreConnection( if (size > 64 * 1024 * 1024) throw SocketException("Too large frame received: $size") val dataBuffer = ByteBuffer.allocateDirect(size) - while (dataBuffer.position() < dataBuffer.limit() && channel?.read(dataBuffer) ?: -1 > 0) { + while (!isInterrupted && dataBuffer.position() < dataBuffer.limit() && channel?.read( + dataBuffer) ?: -1 > 0) { } dataBuffer.flip() - handlerService.parse { - when (internalState.value) { - ConnectionState.HANDSHAKE -> processHandshake(dataBuffer) - else -> processSigProxy(dataBuffer) + if (!isInterrupted) + handlerService.parse { + when (internalState.value) { + ConnectionState.HANDSHAKE -> processHandshake(dataBuffer) + else -> processSigProxy(dataBuffer) + } } - } } } catch (e: Throwable) { log(WARN, TAG, "Error encountered in connection", e) diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt index 389e90769a41a056f96f513c896873d775079366..56dc9efdd5cf5516ae95256b296bd08a8758f3c3 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt @@ -149,15 +149,16 @@ class Session( backlogManager = null bufferSyncer = null bufferViewManager = null - certManagers.clear() coreInfo = null dccConfig = null - identities.clear() ignoreListManager = null ircListHelper = null - networks.clear() networkConfig = null + certManagers.clear() + identities.clear() + networks.clear() + super.cleanUp() } } diff --git a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt index 4c98f3db2f5e4d3219b22f138fbb3e1291ce2163..1896f5f90da3dbe9657394e5dcd92155a8109376 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt @@ -176,17 +176,3 @@ class WrappedChannel( flusher?.invoke() } } - -fun ByteArray.toHexDump(): String { - val buf = StringBuffer() - var i = 0 - buf.append("HexDump ========================================================================\n") - while (i < this.size) { - buf.append(String.format("%02x ", this[i])) - if (i > 0 && (i + 1) % 32 == 0) { - buf.append("\n") - } - i++ - } - return buf.toString() -}