GET_PCSCF,
GET_APP_LIST,
GET_ISIM_SERVICE_TABLE,
+ ACCESS_RSIM_IO,
+ GET_CDMAIMSI,
/* Notification */
STATUS = 100,
}
break;
case TRANSFER_APDU:
+ case ACCESS_RSIM_IO:
if (sim_status == SIM_STATUS_CARD_NOT_PRESENT
|| sim_status == SIM_STATUS_CARD_REMOVED
|| sim_status == SIM_STATUS_UNKNOWN
case GET_PCSCF:
case GET_APP_LIST:
case GET_ISIM_SERVICE_TABLE:
+ case GET_CDMAIMSI:
if (sim_status != SIM_STATUS_INIT_COMPLETED)
ret = FALSE;
break;
return TRUE;
}
+static gboolean on_sim_access_rsim_io(TelephonySim *sim,
+ GDBusMethodInvocation *invocation, gint field,
+ GVariant *rsimio, gint rec_index, gpointer user_data)
+{
+ struct custom_data *ctx = user_data;
+ struct treq_sim_access_rsim_io req;
+ GVariantIter *iter = NULL;
+ GVariant *inner_gv = NULL;
+ guchar rt_i;
+ CoreObject *co_sim = NULL;
+ int i = 0;
+
+
+ DBUS_SIM_GET_COSIM(invocation, co_sim, ctx->server);
+ DBUS_SIM_CHECK_SIM_STATUS(invocation, ACCESS_RSIM_IO, co_sim);
+ DBUS_SIM_CHECK_SIM_TYPE(co_sim, "Access Rsim IO");
+
+ memset(&req, 0x0, sizeof(struct treq_sim_access_rsim_io));
+ req.field = field;
+ req.rec_index= rec_index;
+
+ inner_gv = g_variant_get_variant(rsimio);
+
+ g_variant_get(inner_gv, "ay", &iter);
+ while (g_variant_iter_loop(iter, "y", &rt_i)) {
+ req.data[i] = rt_i;
+ i++;
+ }
+ req.data_len = (unsigned int)i;
+ g_variant_iter_free(iter);
+ //g_variant_unref(inner_gv);
+ //g_variant_unref(rsimio);
+
+ dbg("ef_id[%x], rec_index[%d]", req.field, req.rec_index);
+ tcore_util_hex_dump("[RSIM_IO] ", req.data_len, req.data);
+
+ /* Dispatch request */
+ dtapi_dispatch_request(ctx, sim, invocation,
+ TREQ_SIM_ACCESS_RSIM_IO,
+ &req, sizeof(struct treq_sim_access_rsim_io));
+
+ return TRUE;
+}
+
static gboolean on_sim_get_atr(TelephonySim *sim,
GDBusMethodInvocation *invocation, gpointer user_data)
{
return TRUE;
}
+static gboolean on_sim_get_cdmaimsi(TelephonySim *sim,
+ GDBusMethodInvocation *invocation, gpointer user_data)
+{
+ struct custom_data *ctx = user_data;
+ CoreObject *co_sim = NULL;
+
+ DBUS_SIM_GET_COSIM(invocation, co_sim, ctx->server);
+ DBUS_SIM_CHECK_SIM_STATUS(invocation, GET_CDMAIMSI, co_sim);
+
+ /* Dispatch request */
+ dtapi_dispatch_request(ctx, sim, invocation,
+ TREQ_SIM_GET_CDMAIMSI,
+ NULL, 0);
+
+ return TRUE;
+}
+
gboolean dbus_plugin_setup_sim_interface(TelephonyObjectSkeleton *object,
struct custom_data *ctx)
{
G_CALLBACK(on_sim_transfer_apdu), ctx);
g_signal_connect(sim,
+ "handle-access-rsim-io",
+ G_CALLBACK(on_sim_access_rsim_io), ctx);
+
+ g_signal_connect(sim,
"handle-get-atr",
G_CALLBACK(on_sim_get_atr), ctx);
"handle-get-isim-service-table",
G_CALLBACK(on_sim_get_isim_service_table), ctx);
+ g_signal_connect(sim,
+ "handle-get-cdmaimsi",
+ G_CALLBACK(on_sim_get_cdmaimsi), ctx);
+
/*
* Initialize DBUS property
*/
}
break;
+ case TRESP_SIM_ACCESS_RSIM_IO: {
+ const struct tresp_sim_set_data *resp_set_data = data;
+
+ dbg("[%s] SIM_ACCESS_RSIM_IO - Result: [%s]", cpname,
+ (resp_set_data->result == SIM_ACCESS_SUCCESS ? "Success" : "Fail"));
+
+ telephony_sim_complete_access_rsim_io(dbus_info->interface_object,
+ dbus_info->invocation, resp_set_data->result);
+ }
+ break;
+
case TRESP_SIM_GET_ATR:{
const struct tresp_sim_get_atr *resp_get_atr = data;
GVariantBuilder builder;
}
break;
+ case TRESP_SIM_GET_CDMAIMSI: {
+ const struct tresp_sim_read *resp_read = data;
+
+ dbg("[%s] SIM_GET_CDMAIMSI - Result: [%s] IMSI provision[%d] min: [%s]", cpname,
+ (resp_read->result == SIM_ACCESS_SUCCESS ? "Success" : "Fail"),
+ resp_read->data.imsim.provisioned, (const gchar *)resp_read->data.imsim.min);
+
+ telephony_sim_complete_get_cdmaimsi(dbus_info->interface_object,
+ dbus_info->invocation, resp_read->result,
+ resp_read->data.imsim.provisioned,
+ (const gchar *)resp_read->data.imsim.min);
+ }
+ break;
+
default:
err("Unhandled/Unknown Response: [0x%x]", command);
break;