浏览代码

lpac-jni: Expose error reason enum as string

Peter Cai 1 年之前
父节点
当前提交
9be1ae7cd1

+ 1 - 0
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LocalProfileAssistant.kt

@@ -5,6 +5,7 @@ import net.typeblog.lpac_jni.HttpInterface.HttpResponse
 interface LocalProfileAssistant {
     @Suppress("ArrayInDataClass")
     data class ProfileDownloadException(
+        val lpaErrorReason: String,
         val lastHttpResponse: HttpResponse?,
         val lastHttpException: Exception?,
         val lastApduResponse: ByteArray?,

+ 1 - 0
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt

@@ -29,6 +29,7 @@ internal object LpacJni {
     // We do not expose all of the functions because of tediousness :)
     external fun downloadProfile(handle: Long, smdp: String, matchingId: String?, imei: String?,
                                  confirmationCode: String?, callback: ProfileDownloadCallback): Int
+    external fun downloadErrCodeToString(code: Int): String
     external fun handleNotification(handle: Long, seqNumber: Long): Int
     // Cancel any ongoing es9p and/or es10b sessions
     external fun cancelSessions(handle: Long)

+ 1 - 0
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt

@@ -214,6 +214,7 @@ class LocalProfileAssistantImpl(
         if (res != 0) {
             // Construct the error now to store any error information we _can_ access
             val err = LocalProfileAssistant.ProfileDownloadException(
+                lpaErrorReason = LpacJni.downloadErrCodeToString(-res),
                 httpInterface.lastHttpResponse,
                 httpInterface.lastHttpException,
                 apduInterface.lastApduResponse,

+ 30 - 0
libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.c

@@ -148,4 +148,34 @@ Java_net_typeblog_lpac_1jni_LpacJni_cancelSessions(JNIEnv *env, jobject thiz, jl
     es9p_cancel_session(ctx);
     es10b_cancel_session(ctx, ES10B_CANCEL_SESSION_REASON_UNDEFINED);
     euicc_http_cleanup(ctx);
+}
+
+#define QUOTE(S) #S
+#define ERRCODE_ENUM_TO_STRING(VARIANT) case VARIANT: return toJString(env, QUOTE(VARIANT))
+
+JNIEXPORT jstring JNICALL
+Java_net_typeblog_lpac_1jni_LpacJni_downloadErrCodeToString(JNIEnv *env, jobject thiz, jint code) {
+    switch (code) {
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_INCORRECT_INPUT_VALUES);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_INVALID_SIGNATURE);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_INVALID_TRANSACTION_ID);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_UNSUPPORTED_CRT_VALUES);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_UNSUPPORTED_REMOTE_OPERATION_TYPE);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_UNSUPPORTED_PROFILE_CLASS);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_SCP03T_STRUCTURE_ERROR);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_SCP03T_SECURITY_ERROR);
+        ERRCODE_ENUM_TO_STRING(
+                ES10B_ERROR_REASON_INSTALL_FAILED_DUE_TO_ICCID_ALREADY_EXISTS_ON_EUICC);
+        ERRCODE_ENUM_TO_STRING(
+                ES10B_ERROR_REASON_INSTALL_FAILED_DUE_TO_INSUFFICIENT_MEMORY_FOR_PROFILE);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_INSTALL_FAILED_DUE_TO_INTERRUPTION);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_INSTALL_FAILED_DUE_TO_PE_PROCESSING_ERROR);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_INSTALL_FAILED_DUE_TO_ICCID_MISMATCH);
+        ERRCODE_ENUM_TO_STRING(
+                ES10B_ERROR_REASON_TEST_PROFILE_INSTALL_FAILED_DUE_TO_INVALID_NAA_KEY);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_PPR_NOT_ALLOWED);
+        ERRCODE_ENUM_TO_STRING(ES10B_ERROR_REASON_INSTALL_FAILED_DUE_TO_UNKNOWN_ERROR);
+        default:
+            return toJString(env, "ES10B_ERROR_REASON_UNDEFINED");
+    }
 }