diff options
author | Denis Kenzior <denkenz@gmail.com> | 2009-08-07 17:58:59 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-08-07 19:51:29 -0500 |
commit | 2cfd8a9894b4d7b719a36ebc19890a94aa2b4baa (patch) | |
tree | 65741aa3dde8704cd3d05d91a646b9c04e18434f | |
parent | 32e4232b7c511e6e36c264d82473c65d6e964e0e (diff) | |
download | ofono-2cfd8a9894b4d7b719a36ebc19890a94aa2b4baa.tar.bz2 |
Make the sim op queue have a removable gsource
-rw-r--r-- | src/sim.c | 28 |
1 files changed, 21 insertions, 7 deletions
@@ -82,6 +82,7 @@ struct sim_manager_data { GSList *ready_notify; gboolean ready; GQueue *simop_q; + gint simop_source; unsigned char efmsisdn_length; unsigned char efmsisdn_records; @@ -142,6 +143,11 @@ static void sim_manager_destroy(gpointer userdata) data->own_numbers = NULL; } + if (data->simop_source) { + g_source_remove(data->simop_source); + data->simop_source = 0; + } + if (data->simop_q) { g_queue_foreach(data->simop_q, (GFunc)sim_file_op_free, NULL); g_queue_free(data->simop_q); @@ -500,7 +506,7 @@ static void sim_op_error(struct ofono_modem *modem) struct sim_file_op *op = g_queue_pop_head(sim->simop_q); if (g_queue_get_length(sim->simop_q) > 0) - g_timeout_add(0, sim_op_next, modem); + sim->simop_source = g_timeout_add(0, sim_op_next, modem); if (op->is_read == TRUE) ((ofono_sim_file_read_cb_t) op->cb) @@ -569,10 +575,12 @@ static void sim_op_retrieve_cb(const struct ofono_error *error, sim_file_op_free(op); if (g_queue_get_length(sim->simop_q) > 0) - g_timeout_add(0, sim_op_next, modem); + sim->simop_source = g_timeout_add(0, sim_op_next, + modem); } else { op->current += 1; - g_timeout_add(0, sim_op_retrieve_next, modem); + sim->simop_source = g_timeout_add(0, sim_op_retrieve_next, + modem); } } @@ -582,6 +590,8 @@ static gboolean sim_op_retrieve_next(gpointer user) struct sim_manager_data *sim = modem->sim_manager; struct sim_file_op *op = g_queue_peek_head(sim->simop_q); + sim->simop_source = 0; + switch (op->structure) { case OFONO_SIM_FILE_STRUCTURE_TRANSPARENT: if (!sim->ops->read_file_transparent) { @@ -686,7 +696,7 @@ static void sim_op_info_cb(const struct ofono_error *error, int length, op->current = 1; - g_timeout_add(0, sim_op_retrieve_next, modem); + sim->simop_source = g_timeout_add(0, sim_op_retrieve_next, modem); if (op->cache && imsi) { char *path = g_strdup_printf(SIM_CACHE_PATH, imsi, op->id); @@ -713,7 +723,7 @@ static void sim_op_write_cb(const struct ofono_error *error, void *data) ofono_sim_file_write_cb_t cb = op->cb; if (g_queue_get_length(sim->simop_q) > 0) - g_timeout_add(0, sim_op_next, modem); + sim->simop_source = g_timeout_add(0, sim_op_next, modem); if (error->type == OFONO_ERROR_TYPE_NO_ERROR) cb(modem, 1, op->userdata); @@ -729,6 +739,8 @@ static gboolean sim_op_next(gpointer user_data) struct sim_manager_data *sim = modem->sim_manager; struct sim_file_op *op; + sim->simop_source = 0; + if (!sim->simop_q) return FALSE; @@ -820,6 +832,8 @@ static gboolean sim_op_check_cached(struct ofono_modem *modem, int fileid, unsigned int record_length; struct sim_cache_callback *cbs; + sim->simop_source = 0; + if (!imsi) return FALSE; @@ -902,7 +916,7 @@ int ofono_sim_read(struct ofono_modem *modem, int id, g_queue_push_tail(sim->simop_q, op); if (g_queue_get_length(sim->simop_q) == 1) - g_timeout_add(0, sim_op_next, modem); + sim->simop_source = g_timeout_add(0, sim_op_next, modem); return 0; } @@ -959,7 +973,7 @@ int ofono_sim_write(struct ofono_modem *modem, int id, g_queue_push_tail(sim->simop_q, op); if (g_queue_get_length(sim->simop_q) == 1) - g_timeout_add(0, sim_op_next, modem); + sim->simop_source = g_timeout_add(0, sim_op_next, modem); return 0; } |