From: Caiwen Zhang <[email protected]>

---
 src/sim.c |   77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 76 insertions(+), 1 deletion(-)

diff --git a/src/sim.c b/src/sim.c
index edae5eb..ef55b1c 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -123,6 +123,11 @@ struct msisdn_set_request {
        DBusMessage *msg;
 };
 
+struct sim_locked_query_request {
+       struct ofono_sim *sim;
+       enum ofono_sim_password_type type;
+};
+
 struct service_number {
        char *id;
        struct ofono_phone_number ph;
@@ -610,6 +615,57 @@ error:
        return __ofono_error_invalid_args(msg);
 }
 
+void sim_query_locked_cb(const struct ofono_error *error,
+                       int locked, void *data)
+{
+       struct sim_locked_query_request *req = data;
+       struct ofono_sim *sim = req->sim;
+       char **locked_pins;
+       DBusConnection *conn = ofono_dbus_get_connection();
+       const char *path = __ofono_atom_get_path(sim->atom);
+
+       DBG("");
+
+       if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
+               g_free(req);
+               return;
+       }
+
+       if (req->type >= OFONO_SIM_PASSWORD_SIM_PUK) {
+               g_free(req);
+               return;
+       }
+
+       sim->locked_pins[req->type] = locked;
+       DBG("sim_query_locked_cb pin_type: %d %d", req->type, locked);
+
+       locked_pins = get_locked_pins(sim);
+       ofono_dbus_signal_array_property_changed(conn, path,
+                                               OFONO_SIM_MANAGER_INTERFACE,
+                                               "LockedPins", DBUS_TYPE_STRING,
+                                               &locked_pins);
+       g_strfreev(locked_pins);
+       g_free(req);
+}
+
+static void __sim_query_locked(struct ofono_sim *sim,
+                       enum ofono_sim_password_type type)
+{
+       struct sim_locked_query_request *req;
+
+       if (type == OFONO_SIM_PASSWORD_NONE 
+               || type > OFONO_SIM_PASSWORD_PHCORP_PIN)
+               return;
+
+       req = g_new0(struct sim_locked_query_request, 1);
+       req->sim = sim;
+       req->type = type;
+               
+       if (sim->driver->query_locked)
+               sim->driver->query_locked(sim, type, sim_query_locked_cb, req);
+}
+
+
 static void sim_locked_cb(struct ofono_sim *sim, gboolean locked)
 {
        DBusConnection *conn = ofono_dbus_get_connection();
@@ -1039,6 +1095,25 @@ static DBusMessage *sim_get_icon(DBusConnection *conn,
        return NULL;
 }
 
+static void sim_reset_pin_cb(const struct ofono_error *error, void *data)
+{
+       struct ofono_sim *sim = data;
+       DBusMessage *reply;
+       enum ofono_sim_password_type type;
+
+       if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
+               reply = __ofono_error_failed(sim->pending);
+       else
+               reply = dbus_message_new_method_return(sim->pending);
+
+       __ofono_dbus_pending_reply(&sim->pending, reply);
+
+       __ofono_sim_recheck_pin(sim);
+
+       for (type = OFONO_SIM_PASSWORD_SIM_PIN; type < 
OFONO_SIM_PASSWORD_SIM_PUK; type++)
+               __sim_query_locked(sim, type);
+}
+
 static DBusMessage *sim_reset_pin(DBusConnection *conn, DBusMessage *msg,
                                        void *data)
 {
@@ -1074,7 +1149,7 @@ static DBusMessage *sim_reset_pin(DBusConnection *conn, 
DBusMessage *msg,
                return __ofono_error_invalid_format(msg);
 
        sim->pending = dbus_message_ref(msg);
-       sim->driver->reset_passwd(sim, puk, pin, sim_enter_pin_cb, sim);
+       sim->driver->reset_passwd(sim, puk, pin, sim_reset_pin_cb, sim);
 
        return NULL;
 }
-- 
1.7.9.5

_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to