diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/backend')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt | 36 | ||||
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt | 13 |
2 files changed, 10 insertions, 39 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt index 693fe7e..c6261bf 100644 --- a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt +++ b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt @@ -26,12 +26,11 @@ import android.os.IBinder import android.os.Message import android.os.Messenger import android.util.Log -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.readValue import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.KSerializer import kotlinx.serialization.json.Json +import net.taler.lib.android.CustomClassDiscriminator import net.taler.wallet.backend.WalletBackendService.Companion.MSG_COMMAND import net.taler.wallet.backend.WalletBackendService.Companion.MSG_NOTIFY import net.taler.wallet.backend.WalletBackendService.Companion.MSG_REPLY @@ -43,14 +42,12 @@ import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicInteger import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine +import kotlin.reflect.full.companionObjectInstance class WalletBackendApi( private val app: Application, private val notificationHandler: ((payload: JSONObject) -> Unit) ) { - private val json = Json { - ignoreUnknownKeys = true - } private var walletBackendMessenger: Messenger? = null private val queuedMessages = LinkedList<Message>() private val handlers = ConcurrentHashMap<Int, (isError: Boolean, message: JSONObject) -> Unit>() @@ -147,12 +144,18 @@ class WalletBackendApi( } } - suspend fun <T> request( + suspend inline fun <reified T> request( operation: String, serializer: KSerializer<T>? = null, - args: (JSONObject.() -> JSONObject)? = null + noinline args: (JSONObject.() -> JSONObject)? = null ): WalletResponse<T> = withContext(Dispatchers.Default) { suspendCoroutine { cont -> + val json = Json { + ignoreUnknownKeys = true + (T::class.companionObjectInstance as? CustomClassDiscriminator)?.let { + classDiscriminator = it.discriminator + } + } sendRequest(operation, args?.invoke(JSONObject())) { isError, message -> val response = if (isError) { val error = json.decodeFromString(WalletErrorInfo.serializer(), message.toString()) @@ -167,25 +170,6 @@ class WalletBackendApi( } } - suspend inline fun <reified T> request( - operation: String, - mapper: ObjectMapper, - noinline args: (JSONObject.() -> JSONObject)? = null - ): WalletResponse<T> = withContext(Dispatchers.Default) { - suspendCoroutine { cont -> - sendRequest(operation, args?.invoke(JSONObject())) { isError, message -> - val response = if (isError) { - val error: WalletErrorInfo = mapper.readValue(message.toString()) - WalletResponse.Error(error) - } else { - val t: T = mapper.readValue(message.toString()) - WalletResponse.Success(t) - } - cont.resume(response) - } - } - } - fun destroy() { // FIXME: implement this! } diff --git a/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt b/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt index 57ce82e..4b39ff8 100644 --- a/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt +++ b/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt @@ -16,11 +16,6 @@ package net.taler.wallet.backend -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.deser.std.StdDeserializer import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -72,7 +67,6 @@ data class WalletErrorInfo( // Error details, type depends on talerErrorCode @Serializable(JSONObjectDeserializer::class) - @JsonDeserialize(using = JsonObjectDeserializer::class) val details: JSONObject? ) { val userFacingMsg: String @@ -107,10 +101,3 @@ class JSONObjectDeserializer : KSerializer<JSONObject> { error("not supported") } } - -class JsonObjectDeserializer : StdDeserializer<JSONObject>(JSONObject::class.java) { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): JSONObject { - val node: JsonNode = p.codec.readTree(p) - return JSONObject(node.toString()) - } -} |