summaryrefslogtreecommitdiffstats
path: root/src/call-forwarding.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2009-08-17 14:41:09 -0500
committerDenis Kenzior <denkenz@gmail.com>2009-08-17 15:08:48 -0500
commit91789b26804c1658bc2e2454af7d92f0ff9c2715 (patch)
treebe0f58038f1069df0577778d2e7a57fefb4568cf /src/call-forwarding.c
parentc4d9393fa3d2695b882cfe5bd9c16aafb380e5cc (diff)
downloadofono-91789b26804c1658bc2e2454af7d92f0ff9c2715.tar.bz2
Port call-forwarding to new USSD API
Diffstat (limited to 'src/call-forwarding.c')
-rw-r--r--src/call-forwarding.c67
1 files changed, 41 insertions, 26 deletions
diff --git a/src/call-forwarding.c b/src/call-forwarding.c
index 7224f3dd..b5e26360 100644
--- a/src/call-forwarding.c
+++ b/src/call-forwarding.c
@@ -50,6 +50,7 @@ struct ofono_call_forwarding {
int query_next;
int query_end;
struct cf_ss_request *ss_req;
+ struct ofono_ussd *ussd;
const struct ofono_call_forwarding_driver *driver;
void *driver_data;
struct ofono_atom *atom;
@@ -867,13 +868,12 @@ static void cf_ss_control_callback(const struct ofono_error *error, void *data)
ss_set_query_next_cf_cond(cf);
}
-static gboolean cf_ss_control(struct ofono_modem *modem,
- enum ss_control_type type, const char *sc,
+static gboolean cf_ss_control(int type, const char *sc,
const char *sia, const char *sib,
const char *sic, const char *dn,
- DBusMessage *msg)
+ DBusMessage *msg, void *data)
{
- struct ofono_call_forwarding *cf = modem->call_forwarding;
+ struct ofono_call_forwarding *cf = data;
DBusConnection *conn = ofono_dbus_get_connection();
int cls = BEARER_CLASS_SS_DEFAULT;
int timeout = DEFAULT_NO_REPLY_TIMEOUT;
@@ -1063,28 +1063,24 @@ error:
static void cf_register_ss_controls(struct ofono_call_forwarding *cf)
{
- struct ofono_modem *modem = __ofono_atom_get_modem(cf->atom);
-
- ss_control_register(modem, "21", cf_ss_control);
- ss_control_register(modem, "67", cf_ss_control);
- ss_control_register(modem, "61", cf_ss_control);
- ss_control_register(modem, "62", cf_ss_control);
+ __ofono_ussd_ssc_register(cf->ussd, "21", cf_ss_control, cf, NULL);
+ __ofono_ussd_ssc_register(cf->ussd, "67", cf_ss_control, cf, NULL);
+ __ofono_ussd_ssc_register(cf->ussd, "61", cf_ss_control, cf, NULL);
+ __ofono_ussd_ssc_register(cf->ussd, "62", cf_ss_control, cf, NULL);
- ss_control_register(modem, "002", cf_ss_control);
- ss_control_register(modem, "004", cf_ss_control);
+ __ofono_ussd_ssc_register(cf->ussd, "002", cf_ss_control, cf, NULL);
+ __ofono_ussd_ssc_register(cf->ussd, "004", cf_ss_control, cf, NULL);
}
static void cf_unregister_ss_controls(struct ofono_call_forwarding *cf)
{
- struct ofono_modem *modem = __ofono_atom_get_modem(cf->atom);
-
- ss_control_unregister(modem, "21", cf_ss_control);
- ss_control_unregister(modem, "67", cf_ss_control);
- ss_control_unregister(modem, "61", cf_ss_control);
- ss_control_unregister(modem, "62", cf_ss_control);
+ __ofono_ussd_ssc_unregister(cf->ussd, "21");
+ __ofono_ussd_ssc_unregister(cf->ussd, "67");
+ __ofono_ussd_ssc_unregister(cf->ussd, "61");
+ __ofono_ussd_ssc_unregister(cf->ussd, "62");
- ss_control_unregister(modem, "002", cf_ss_control);
- ss_control_unregister(modem, "004", cf_ss_control);
+ __ofono_ussd_ssc_unregister(cf->ussd, "002");
+ __ofono_ussd_ssc_unregister(cf->ussd, "004");
}
int ofono_call_forwarding_driver_register(const struct ofono_call_forwarding_driver *d)
@@ -1117,9 +1113,8 @@ static void call_forwarding_unregister(struct ofono_atom *atom)
g_dbus_unregister_interface(conn, path,
OFONO_CALL_FORWARDING_INTERFACE);
- cf_unregister_ss_controls(cf);
-
- modem->call_forwarding = NULL;
+ if (cf->ussd)
+ cf_unregister_ss_controls(cf);
}
static void call_forwarding_remove(struct ofono_atom *atom)
@@ -1174,11 +1169,26 @@ struct ofono_call_forwarding *ofono_call_forwarding_create(struct ofono_modem *m
return cf;
}
+static void ussd_watch(struct ofono_atom *atom,
+ enum ofono_atom_watch_condition cond, void *data)
+{
+ struct ofono_call_forwarding *cf = data;
+
+ if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) {
+ cf->ussd = NULL;
+ return;
+ }
+
+ cf->ussd = __ofono_atom_get_data(atom);
+ cf_register_ss_controls(cf);
+}
+
void ofono_call_forwarding_register(struct ofono_call_forwarding *cf)
{
DBusConnection *conn = ofono_dbus_get_connection();
const char *path = __ofono_atom_get_path(cf->atom);
struct ofono_modem *modem = __ofono_atom_get_modem(cf->atom);
+ struct ofono_atom *ussd_atom;
if (!g_dbus_register_interface(conn, path,
OFONO_CALL_FORWARDING_INTERFACE,
@@ -1190,10 +1200,15 @@ void ofono_call_forwarding_register(struct ofono_call_forwarding *cf)
return;
}
- modem->call_forwarding = cf;
-
ofono_modem_add_interface(modem, OFONO_CALL_FORWARDING_INTERFACE);
- cf_register_ss_controls(cf);
+
+ __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_USSD,
+ ussd_watch, cf, NULL);
+ ussd_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_USSD);
+
+ if (ussd_atom && __ofono_atom_get_registered(ussd_atom))
+ ussd_watch(ussd_atom, OFONO_ATOM_WATCH_CONDITION_REGISTERED,
+ cf);
__ofono_atom_register(cf->atom, call_forwarding_unregister);
}