diff options
author | Gustavo F. Padovan <padovan@profusion.mobi> | 2010-12-06 18:12:39 -0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-12-16 18:40:18 -0600 |
commit | 2d35d977c59ea5a90ac89eacab8b43957b6a9e9c (patch) | |
tree | 501d12735574226757062374d404642db222e9ef | |
parent | 31716688a090e396a58097ca7c952cbf7397c514 (diff) | |
download | ofono-2d35d977c59ea5a90ac89eacab8b43957b6a9e9c.tar.bz2 |
call-settings: add CNAP support
-rw-r--r-- | src/call-settings.c | 102 |
1 files changed, 93 insertions, 9 deletions
diff --git a/src/call-settings.c b/src/call-settings.c index 2bf54d39..b6c39241 100644 --- a/src/call-settings.c +++ b/src/call-settings.c @@ -55,6 +55,13 @@ enum clip_status { CLIP_STATUS_UNKNOWN }; +/* 27.007 Section 7.30 */ +enum cnap_status { + CNAP_STATUS_NOT_PROVISIONED = 0, + CNAP_STATUS_PROVISIONED, + CNAP_STATUS_UNKNOWN +}; + /* 27.007 Section 7.8 */ enum colp_status { COLP_STATUS_NOT_PROVISIONED = 0, @@ -71,6 +78,7 @@ enum colr_status { enum call_setting_type { CALL_SETTING_TYPE_CLIP = 0, + CALL_SETTING_TYPE_CNAP, CALL_SETTING_TYPE_COLP, CALL_SETTING_TYPE_COLR, CALL_SETTING_TYPE_CLIR, @@ -81,6 +89,7 @@ struct ofono_call_settings { int clir; int colr; int clip; + int cnap; int colp; int clir_setting; int cw; @@ -108,6 +117,18 @@ static const char *clip_status_to_string(int status) return "unknown"; } +static const char *cnap_status_to_string(int status) +{ + switch (status) { + case CNAP_STATUS_NOT_PROVISIONED: + return "disabled"; + case CNAP_STATUS_PROVISIONED: + return "enabled"; + } + + return "unknown"; +} + static const char *colp_status_to_string(int status) { switch (status) { @@ -228,6 +249,28 @@ static void set_clip(struct ofono_call_settings *cs, int clip) DBUS_TYPE_STRING, &str); } +static void set_cnap(struct ofono_call_settings *cs, int cnap) +{ + DBusConnection *conn; + const char *path; + const char *str; + + if (cs->cnap == cnap) + return; + + cs->cnap = cnap; + + conn = ofono_dbus_get_connection(); + path = __ofono_atom_get_path(cs->atom); + + str = cnap_status_to_string(cnap); + + ofono_dbus_signal_property_changed(conn, path, + OFONO_CALL_SETTINGS_INTERFACE, + "CallingNamePresentation", + DBUS_TYPE_STRING, &str); +} + static void set_colp(struct ofono_call_settings *cs, int colp) { DBusConnection *conn; @@ -520,7 +563,7 @@ static void generate_ss_query_reply(struct ofono_call_settings *cs, __ofono_dbus_pending_reply(&cs->pending, reply); } -static void clip_colp_colr_ss_query_cb(const struct ofono_error *error, +static void clip_cnap_colp_colr_ss_query_cb(const struct ofono_error *error, int status, void *data) { struct ofono_call_settings *cs = data; @@ -542,6 +585,13 @@ static void clip_colp_colr_ss_query_cb(const struct ofono_error *error, context = "CallingLinePresentation"; break; + case CALL_SETTING_TYPE_CNAP: + set_cnap(cs, status); + value = cnap_status_to_string(status); + context = "CallingNamePresentation"; + break; + + case CALL_SETTING_TYPE_COLP: set_colp(cs, status); value = colp_status_to_string(status); @@ -557,14 +607,14 @@ static void clip_colp_colr_ss_query_cb(const struct ofono_error *error, default: __ofono_dbus_pending_reply(&cs->pending, __ofono_error_failed(cs->pending)); - ofono_error("Unknown type during COLR/COLP/CLIP ss"); + ofono_error("Unknown type during COLR/COLP/CLIP/CNAP ss"); return; }; generate_ss_query_reply(cs, context, value); } -static gboolean clip_colp_colr_ss(int type, +static gboolean clip_cnap_colp_colr_ss(int type, const char *sc, const char *sia, const char *sib, const char *sic, const char *dn, DBusMessage *msg, void *data) @@ -587,6 +637,9 @@ static gboolean clip_colp_colr_ss(int type, if (!strcmp(sc, "30")) { cs->ss_setting = CALL_SETTING_TYPE_CLIP; query_op = cs->driver->clip_query; + } else if (!strcmp(sc, "300")) { + cs->ss_setting = CALL_SETTING_TYPE_CNAP; + query_op = cs->driver->cnap_query; } else if (!strcmp(sc, "76")) { cs->ss_setting = CALL_SETTING_TYPE_COLP; query_op = cs->driver->colp_query; @@ -612,11 +665,11 @@ static gboolean clip_colp_colr_ss(int type, return TRUE; } - DBG("Received CLIP/COLR/COLP query ss control"); + DBG("Received CLIP/CNAP/COLR/COLP query ss control"); cs->pending = dbus_message_ref(msg); - query_op(cs, clip_colp_colr_ss_query_cb, cs); + query_op(cs, clip_cnap_colp_colr_ss_query_cb, cs); return TRUE; } @@ -762,15 +815,19 @@ static gboolean clir_ss_control(int type, static void cs_register_ss_controls(struct ofono_call_settings *cs) { - __ofono_ussd_ssc_register(cs->ussd, "30", clip_colp_colr_ss, cs, NULL); + __ofono_ussd_ssc_register(cs->ussd, "30", clip_cnap_colp_colr_ss, + cs, NULL); __ofono_ussd_ssc_register(cs->ussd, "31", clir_ss_control, cs, NULL); - __ofono_ussd_ssc_register(cs->ussd, "76", clip_colp_colr_ss, cs, NULL); + __ofono_ussd_ssc_register(cs->ussd, "76", clip_cnap_colp_colr_ss, + cs, NULL); + __ofono_ussd_ssc_register(cs->ussd, "300", clip_cnap_colp_colr_ss, + cs, NULL); __ofono_ussd_ssc_register(cs->ussd, "43", cw_ss_control, cs, NULL); if (cs->driver->colr_query) __ofono_ussd_ssc_register(cs->ussd, "77", - clip_colp_colr_ss, cs, NULL); + clip_cnap_colp_colr_ss, cs, NULL); } static void cs_unregister_ss_controls(struct ofono_call_settings *cs) @@ -778,6 +835,7 @@ static void cs_unregister_ss_controls(struct ofono_call_settings *cs) __ofono_ussd_ssc_unregister(cs->ussd, "30"); __ofono_ussd_ssc_unregister(cs->ussd, "31"); __ofono_ussd_ssc_unregister(cs->ussd, "76"); + __ofono_ussd_ssc_unregister(cs->ussd, "300"); __ofono_ussd_ssc_unregister(cs->ussd, "43"); @@ -812,6 +870,10 @@ static DBusMessage *generate_get_properties_reply(struct ofono_call_settings *cs ofono_dbus_dict_append(&dict, "CallingLinePresentation", DBUS_TYPE_STRING, &str); + str = cnap_status_to_string(cs->clip); + ofono_dbus_dict_append(&dict, "CallingNamePresentation", + DBUS_TYPE_STRING, &str); + str = colp_status_to_string(cs->colp); ofono_dbus_dict_append(&dict, "CalledLinePresentation", DBUS_TYPE_STRING, &str); @@ -872,6 +934,27 @@ static void query_clir(struct ofono_call_settings *cs) cs->driver->clir_query(cs, cs_clir_callback, cs); } +static void cs_cnap_callback(const struct ofono_error *error, + int state, void *data) +{ + struct ofono_call_settings *cs = data; + + if (error->type == OFONO_ERROR_TYPE_NO_ERROR) + set_cnap(cs, state); + + query_clir(cs); +} + +static void query_cnap(struct ofono_call_settings *cs) +{ + if (cs->driver->cnap_query == NULL) { + query_clir(cs); + return; + } + + cs->driver->cnap_query(cs, cs_cnap_callback, cs); +} + static void cs_clip_callback(const struct ofono_error *error, int state, void *data) { @@ -880,7 +963,7 @@ static void cs_clip_callback(const struct ofono_error *error, if (error->type == OFONO_ERROR_TYPE_NO_ERROR) set_clip(cs, state); - query_clir(cs); + query_cnap(cs); } static void query_clip(struct ofono_call_settings *cs) @@ -1260,6 +1343,7 @@ struct ofono_call_settings *ofono_call_settings_create(struct ofono_modem *modem /* Set all the settings to unknown state */ cs->clip = 2; + cs->cnap = 2; cs->clir = 2; cs->colp = 2; cs->colr = 2; |