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
|
2020-12-15 05:50:15 +01:00
|
|
|
import nl.komponents.kovenant.deferred
|
|
|
|
import org.session.libsession.messaging.sending_receiving.MessageReceiver
|
|
|
|
import org.session.libsession.messaging.sending_receiving.handle
|
2021-02-03 02:22:40 +01:00
|
|
|
import org.session.libsignal.utilities.logging.Log
|
2020-12-18 06:43:57 +01:00
|
|
|
|
2020-12-10 05:31:38 +01:00
|
|
|
class MessageReceiveJob(val data: ByteArray, val isBackgroundPoll: Boolean, val openGroupMessageServerID: Long? = null, val openGroupID: String? = null) : Job {
|
2020-12-15 05:50:15 +01:00
|
|
|
|
2020-12-02 06:39:02 +01:00
|
|
|
override var delegate: JobDelegate? = null
|
|
|
|
override var id: String? = null
|
|
|
|
override var failureCount: Int = 0
|
|
|
|
|
|
|
|
// Settings
|
|
|
|
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-01-22 03:30:00 +01:00
|
|
|
|
|
|
|
//keys used for database storage purpose
|
|
|
|
private val KEY_DATA = "data"
|
|
|
|
private val KEY_IS_BACKGROUND_POLL = "is_background_poll"
|
|
|
|
private val KEY_OPEN_GROUP_MESSAGE_SERVER_ID = "openGroupMessageServerID"
|
|
|
|
private val KEY_OPEN_GROUP_ID = "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> {
|
2020-12-15 05:50:15 +01:00
|
|
|
val deferred = deferred<Unit, Exception>()
|
|
|
|
try {
|
2021-02-10 06:48:03 +01:00
|
|
|
val isRetry: Boolean = failureCount != 0
|
|
|
|
val (message, proto) = MessageReceiver.parse(this.data, this.openGroupMessageServerID, isRetry)
|
2020-12-15 05:50:15 +01:00
|
|
|
MessageReceiver.handle(message, proto, this.openGroupID)
|
|
|
|
this.handleSuccess()
|
|
|
|
deferred.resolve(Unit)
|
|
|
|
} catch (e: Exception) {
|
2021-03-12 07:15:33 +01:00
|
|
|
Log.e(TAG, "Couldn't receive message due to error", e)
|
2020-12-15 05:50:15 +01:00
|
|
|
val error = e as? MessageReceiver.Error
|
2021-02-10 06:48:03 +01:00
|
|
|
if (error != null && !error.isRetryable) {
|
2021-03-12 07:15:33 +01:00
|
|
|
Log.e("Loki", "Message receive job permanently failed due to error", e)
|
2021-02-10 06:48:03 +01:00
|
|
|
this.handlePermanentFailure(error)
|
|
|
|
} else {
|
2021-03-12 07:15:33 +01:00
|
|
|
Log.e("Loki", "Couldn't receive message due to error", e)
|
2021-02-10 06:48:03 +01:00
|
|
|
this.handleFailure(e)
|
2020-12-15 05:50:15 +01:00
|
|
|
}
|
|
|
|
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 03:30:00 +01:00
|
|
|
|
|
|
|
//database functions
|
|
|
|
|
2021-01-22 05:19:41 +01:00
|
|
|
override fun serialize(): Data {
|
2021-01-28 05:24:27 +01:00
|
|
|
val builder = Data.Builder().putByteArray(KEY_DATA, data)
|
2021-01-22 03:30:00 +01:00
|
|
|
.putBoolean(KEY_IS_BACKGROUND_POLL, isBackgroundPoll)
|
|
|
|
openGroupMessageServerID?.let { builder.putLong(KEY_OPEN_GROUP_MESSAGE_SERVER_ID, openGroupMessageServerID) }
|
|
|
|
openGroupID?.let { builder.putString(KEY_OPEN_GROUP_ID, openGroupID) }
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2021-01-22 03:30:00 +01:00
|
|
|
class Factory: Job.Factory<MessageReceiveJob> {
|
2021-01-22 05:19:41 +01:00
|
|
|
override fun create(data: Data): MessageReceiveJob {
|
2021-01-28 05:24:27 +01:00
|
|
|
return MessageReceiveJob(data.getByteArray(KEY_DATA), data.getBoolean(KEY_IS_BACKGROUND_POLL), data.getLong(KEY_OPEN_GROUP_MESSAGE_SERVER_ID), data.getString(KEY_OPEN_GROUP_ID))
|
2021-01-22 03:30:00 +01:00
|
|
|
}
|
|
|
|
}
|
2020-11-25 02:06:41 +01:00
|
|
|
}
|