From 3ab6f1569b307b155de6049ad7207e10bdf97567 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 11 Aug 2020 17:35:16 -0300 Subject: [wallet] upgrade wallet-core and adapt payment API --- .../net/taler/wallet/backend/WalletBackendApi.kt | 21 ++++++++++ .../net/taler/wallet/backend/WalletResponse.kt | 45 +++++++++++++++++++--- 2 files changed, 61 insertions(+), 5 deletions(-) (limited to 'wallet/src/main/java/net/taler/wallet/backend') 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 ea8f26f..5ca2255 100644 --- a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt +++ b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt @@ -26,6 +26,8 @@ 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 @@ -166,6 +168,25 @@ class WalletBackendApi( } } + suspend inline fun request( + operation: String, + mapper: ObjectMapper, + noinline args: (JSONObject.() -> JSONObject)? = null + ): WalletResponse = 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 05a53f3..ab3d42e 100644 --- a/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt +++ b/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt @@ -16,10 +16,23 @@ 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.Decoder +import kotlinx.serialization.Encoder +import kotlinx.serialization.KSerializer +import kotlinx.serialization.PrimitiveDescriptor +import kotlinx.serialization.PrimitiveKind.STRING import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonInput +import kotlinx.serialization.json.JsonObject import org.json.JSONObject + @Serializable sealed class WalletResponse { @Serializable @@ -58,9 +71,10 @@ data class WalletErrorInfo( // for the instance of the error. val message: String, - // Error details, type depends - // on talerErrorCode - val details: String? + // Error details, type depends on talerErrorCode + @Serializable(JSONObjectDeserializer::class) + @JsonDeserialize(using = JsonObjectDeserializer::class) + val details: JSONObject? ) { val userFacingMsg: String get() { @@ -68,8 +82,7 @@ data class WalletErrorInfo( append(talerErrorCode) append(" ") append(message) - details?.let { it -> - val details = JSONObject(it) + details?.let { details -> details.optJSONObject("errorResponse")?.let { errorResponse -> append("\n\n") append(errorResponse.optString("code")) @@ -80,3 +93,25 @@ data class WalletErrorInfo( }.toString() } } + +class JSONObjectDeserializer : KSerializer { + + override val descriptor = PrimitiveDescriptor("JSONObjectDeserializer", STRING) + + override fun deserialize(decoder: Decoder): JSONObject { + val input = decoder as JsonInput + val tree = input.decodeJson() as JsonObject + return JSONObject(tree.toString()) + } + + override fun serialize(encoder: Encoder, value: JSONObject) { + error("not supported") + } +} + +class JsonObjectDeserializer : StdDeserializer(JSONObject::class.java) { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext): JSONObject { + val node: JsonNode = p.codec.readTree(p) + return JSONObject(node.toString()) + } +} -- cgit v1.2.3