---
src/call-forwarding.c | 39 +++++++++++++++++++++++++++++++++++++--
1 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/src/call-forwarding.c b/src/call-forwarding.c
index d13f990..d610521 100644
--- a/src/call-forwarding.c
+++ b/src/call-forwarding.c
@@ -74,6 +74,7 @@ static void get_query_next_cf_cond(struct ofono_call_forwarding *cf);
static void set_query_next_cf_cond(struct ofono_call_forwarding *cf);
static void ss_set_query_next_cf_cond(struct ofono_call_forwarding *cf);
static void cf_unregister_ss_controls(struct ofono_call_forwarding *cf);
+static void sim_read_cf_indicator(struct ofono_call_forwarding *cf);
struct cf_ss_request {
int ss_type;
@@ -1358,18 +1359,52 @@ static void sim_cphs_cff_read_cb(int ok, int total_length, int
record,
DBUS_TYPE_BOOLEAN, &cfu_voice);
}
+static void sim_cfis_changed(int id, void *userdata)
+{
+ struct ofono_call_forwarding *cf = userdata;
+
+ if (((cf->flags & CALL_FORWARDING_FLAG_CPHS_CFF) ||
+ cf->cfis_record_id > 0) && is_cfu_enabled(cf, NULL)) {
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(cf->atom);
+ ofono_bool_t status = FALSE;
+
+ ofono_dbus_signal_property_changed(conn, path,
+ OFONO_CALL_FORWARDING_INTERFACE,
+ "ForwardingFlagOnSim",
+ DBUS_TYPE_BOOLEAN, &status);
+ }
+
+ cf->cfis_record_id = 0;
+ cf->flags &= ~CALL_FORWARDING_FLAG_CPHS_CFF;
+
+ /*
+ * TODO: remove forwarding rules in
+ * cf->cf_conditions[CALL_FORWARDING_TYPE_UNCONDITIONAL] that
+ * originate from EFcfis before adding the new rules?
+ */
+
+ sim_read_cf_indicator(cf);
+}
+
static void sim_read_cf_indicator(struct ofono_call_forwarding *cf)
{
if (__ofono_sim_service_available(cf->sim,
SIM_UST_SERVICE_CFIS,
- SIM_SST_SERVICE_CFIS) == TRUE)
+ SIM_SST_SERVICE_CFIS) == TRUE) {
ofono_sim_read(cf->sim_context, SIM_EFCFIS_FILEID,
OFONO_SIM_FILE_STRUCTURE_FIXED,
sim_cfis_read_cb, cf);
- else
+ ofono_sim_add_file_watch(cf->sim_context, SIM_EFCFIS_FILEID,
+ sim_cfis_changed, cf, NULL);
+ } else {
ofono_sim_read(cf->sim_context, SIM_EF_CPHS_CFF_FILEID,
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
sim_cphs_cff_read_cb, cf);
+ ofono_sim_add_file_watch(cf->sim_context,
+ SIM_EF_CPHS_CFF_FILEID,
+ sim_cfis_changed, cf, NULL);
+ }
}
int ofono_call_forwarding_driver_register(const struct ofono_call_forwarding_driver *d)
--
1.7.1.86.g0e460.dirty