summaryrefslogtreecommitdiff
path: root/src/sim.c
diff options
context:
space:
mode:
authorAntara Borwankar <antara.borwankar@intel.com>2019-03-28 17:36:02 +0530
committerDenis Kenzior <denkenz@gmail.com>2019-03-28 21:08:02 -0500
commit693396da227d3ffe683036935bf13feaf53785fc (patch)
tree411099dc03f72e81f53f0ce12d9da3508caafda8 /src/sim.c
parenta7a2d09d10c7856262cf0dcef06f29bc60f08d06 (diff)
downloadofono-693396da227d3ffe683036935bf13feaf53785fc.tar.gz
sim: handling of dual sim single active feature
Added implementation for handling CardSlotCount and ActiveCardSlot properties for DSSA use case.
Diffstat (limited to 'src/sim.c')
-rw-r--r--src/sim.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/sim.c b/src/sim.c
index c6ea4b03..539af745 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -131,6 +131,10 @@ struct ofono_sim {
struct ofono_atom *atom;
unsigned int hfp_watch;
+ unsigned int card_slot_count;
+ unsigned int active_card_slot;
+ unsigned int pending_active_card_slot;
+
GSList *aid_sessions;
GSList *aid_list;
char *impi;
@@ -473,6 +477,13 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
get_pin_retries(sim, &pin_retries_dict, &dbus_retries);
ofono_dbus_dict_append_dict(&dict, "Retries", DBUS_TYPE_BYTE,
&pin_retries_dict);
+
+ ofono_dbus_dict_append(&dict, "CardSlotCount", DBUS_TYPE_UINT32,
+ &sim->card_slot_count);
+
+ ofono_dbus_dict_append(&dict, "ActiveCardSlot", DBUS_TYPE_UINT32,
+ &sim->active_card_slot);
+
g_free(pin_retries_dict);
g_free(dbus_retries);
@@ -657,6 +668,28 @@ static gboolean set_own_numbers(struct ofono_sim *sim,
return TRUE;
}
+static void sim_set_slot_callback(const struct ofono_error *error, void *data)
+{
+ struct ofono_sim *sim = data;
+ DBusMessage *reply;
+
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
+ DBG("Error setting radio access mode");
+
+ sim->pending_active_card_slot = sim->active_card_slot;
+
+ reply = __ofono_error_failed(sim->pending);
+ __ofono_dbus_pending_reply(&sim->pending, reply);
+
+ return;
+ }
+
+ sim->active_card_slot = sim->pending_active_card_slot;
+
+ reply = dbus_message_new_method_return(sim->pending);
+ __ofono_dbus_pending_reply(&sim->pending, reply);
+}
+
static DBusMessage *sim_set_property(DBusConnection *conn, DBusMessage *msg,
void *data)
{
@@ -724,6 +757,37 @@ error:
if (set_ok)
return NULL;
+ } else if (!strcmp(name, "ActiveCardSlot")) {
+ dbus_uint32_t value;
+
+ dbus_message_iter_next(&iter);
+
+ if (sim->driver->set_active_card_slot == NULL)
+ return __ofono_error_not_implemented(msg);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_recurse(&iter, &var);
+
+ if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_UINT32)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_get_basic(&var, &value);
+
+ if (value <= 0 || value > sim->card_slot_count)
+ return __ofono_error_invalid_args(msg);
+
+ if (sim->active_card_slot == value)
+ return dbus_message_new_method_return(msg);
+
+ sim->pending = dbus_message_ref(msg);
+ sim->pending_active_card_slot = value;
+
+ sim->driver->set_active_card_slot(sim, value - 1,
+ sim_set_slot_callback,
+ sim);
+ return NULL;
}
return __ofono_error_invalid_args(msg);
@@ -3803,3 +3867,15 @@ int ofono_sim_logical_access(struct ofono_sim *sim, int session_id,
return 0;
}
+
+void ofono_sim_set_card_slot_count(struct ofono_sim *sim, unsigned int val)
+{
+ if (sim)
+ sim->card_slot_count = val;
+}
+
+void ofono_sim_set_active_card_slot(struct ofono_sim *sim, unsigned int val)
+{
+ if (sim)
+ sim->active_card_slot = val;
+}