session-android/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt

93 lines
3.5 KiB
Kotlin
Raw Normal View History

2020-12-02 06:39:02 +01:00
package org.session.libsession.messaging.jobs
2020-11-25 02:06:41 +01:00
2020-12-18 06:43:57 +01:00
import nl.komponents.kovenant.Promise
import nl.komponents.kovenant.deferred
import org.session.libsession.messaging.sending_receiving.MessageReceiver
import org.session.libsession.messaging.sending_receiving.handle
2021-05-13 02:31:06 +02:00
import org.session.libsession.messaging.utilities.Data
2021-05-18 01:12:33 +02:00
import org.session.libsignal.utilities.Log
2020-12-18 06:43:57 +01:00
class MessageReceiveJob(val data: ByteArray, val serverHash: String? = null, val openGroupMessageServerID: Long? = null, val openGroupID: String? = null) : Job {
2020-12-02 06:39:02 +01:00
override var delegate: JobDelegate? = null
override var id: String? = null
override var failureCount: Int = 0
override val maxFailureCount: Int = 10
companion object {
2021-03-02 02:24:09 +01:00
val TAG = MessageReceiveJob::class.simpleName
val KEY: String = "MessageReceiveJob"
2021-04-26 02:58:48 +02:00
// Keys used for database storage
2021-05-12 08:17:25 +02:00
private val DATA_KEY = "data"
private val SERVER_HASH_KEY = "serverHash"
2021-05-12 08:17:25 +02:00
private val OPEN_GROUP_MESSAGE_SERVER_ID_KEY = "openGroupMessageServerID"
private val OPEN_GROUP_ID_KEY = "open_group_id"
2020-12-02 06:39:02 +01:00
}
override fun execute() {
2020-12-18 06:43:57 +01:00
executeAsync().get()
}
fun executeAsync(): Promise<Unit, Exception> {
val deferred = deferred<Unit, Exception>()
try {
val isRetry: Boolean = failureCount != 0
val (message, proto) = MessageReceiver.parse(this.data, this.openGroupMessageServerID)
message.serverHash = serverHash
MessageReceiver.handle(message, proto, this.openGroupID)
this.handleSuccess()
deferred.resolve(Unit)
} catch (e: Exception) {
2021-05-12 08:17:25 +02:00
Log.e(TAG, "Couldn't receive message.", e)
if (e is MessageReceiver.Error && !e.isRetryable) {
Log.e("Loki", "Message receive job permanently failed.", e)
this.handlePermanentFailure(e)
} else {
2021-05-12 08:17:25 +02:00
Log.e("Loki", "Couldn't receive message.", e)
this.handleFailure(e)
}
deferred.resolve(Unit) // The promise is just used to keep track of when we're done
}
return deferred.promise
}
private fun handleSuccess() {
delegate?.handleJobSucceeded(this)
}
private fun handlePermanentFailure(e: Exception) {
delegate?.handleJobFailedPermanently(this, e)
}
private fun handleFailure(e: Exception) {
delegate?.handleJobFailed(this, e)
2020-12-02 06:39:02 +01:00
}
2021-01-22 05:19:41 +01:00
override fun serialize(): Data {
2021-05-12 08:17:25 +02:00
val builder = Data.Builder().putByteArray(DATA_KEY, data)
serverHash?.let { builder.putString(SERVER_HASH_KEY, it) }
2021-05-12 08:17:25 +02:00
openGroupMessageServerID?.let { builder.putLong(OPEN_GROUP_MESSAGE_SERVER_ID_KEY, it) }
openGroupID?.let { builder.putString(OPEN_GROUP_ID_KEY, it) }
return builder.build();
}
2021-01-28 05:24:27 +01:00
override fun getFactoryKey(): String {
2021-03-03 05:14:45 +01:00
return KEY
2021-01-28 05:24:27 +01:00
}
class Factory: Job.Factory<MessageReceiveJob> {
2021-04-26 02:58:48 +02:00
2021-01-22 05:19:41 +01:00
override fun create(data: Data): MessageReceiveJob {
val dataArray = data.getByteArray(DATA_KEY)
val serverHash = data.getStringOrDefault(SERVER_HASH_KEY, null)
val openGroupMessageServerID = data.getLongOrDefault(OPEN_GROUP_MESSAGE_SERVER_ID_KEY, -1).let { if (it == -1L) null else it }
val openGroupID = data.getStringOrDefault(OPEN_GROUP_ID_KEY, null)
2021-05-12 08:17:25 +02:00
return MessageReceiveJob(
dataArray,
serverHash,
openGroupMessageServerID,
openGroupID
2021-05-12 08:17:25 +02:00
)
}
}
2020-11-25 02:06:41 +01:00
}