summaryrefslogtreecommitdiffstats
path: root/src/call-forwarding.c
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2011-02-19 04:54:29 +0100
committerDenis Kenzior <denkenz@gmail.com>2011-03-15 21:18:17 -0500
commit643144aafbfc58bf61f50a0cdba054bcad465974 (patch)
treeff22b8f48236e9c758ad4e517fdd8831ca41a785 /src/call-forwarding.c
parent2211583953e430e3a649a947c76b359d7431dc58 (diff)
downloadofono-643144aafbfc58bf61f50a0cdba054bcad465974.tar.bz2
call-forwarding: update EFs changed by SIM refresh
Diffstat (limited to 'src/call-forwarding.c')
-rw-r--r--src/call-forwarding.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/call-forwarding.c b/src/call-forwarding.c
index d13f9907..fe535b84 100644
--- a/src/call-forwarding.c
+++ b/src/call-forwarding.c
@@ -1358,8 +1358,31 @@ static void sim_cphs_cff_read_cb(int ok, int total_length, int record,
DBUS_TYPE_BOOLEAN, &cfu_voice);
}
-static void sim_read_cf_indicator(struct ofono_call_forwarding *cf)
+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?
+ */
+
if (__ofono_sim_service_available(cf->sim,
SIM_UST_SERVICE_CFIS,
SIM_SST_SERVICE_CFIS) == TRUE)
@@ -1372,6 +1395,26 @@ static void sim_read_cf_indicator(struct ofono_call_forwarding *cf)
sim_cphs_cff_read_cb, 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) {
+ ofono_sim_read(cf->sim_context, SIM_EFCFIS_FILEID,
+ OFONO_SIM_FILE_STRUCTURE_FIXED,
+ sim_cfis_read_cb, cf);
+ 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)
{
DBG("driver: %p, name: %s", d, d->name);