Hi Guillaume,
On 11/02/2011 05:37 AM, Guillaume Zajac wrote:
---
src/cdma-connman.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/src/cdma-connman.c b/src/cdma-connman.c
index db8f6c5..42dcca2 100644
--- a/src/cdma-connman.c
+++ b/src/cdma-connman.c
@@ -52,8 +52,11 @@ struct cdma_connman_settings {
struct ofono_cdma_connman {
ofono_bool_t powered;
ofono_bool_t dormant;
+ ofono_bool_t roaming_allowed;
struct cdma_connman_settings *settings;
DBusMessage *pending;
+ struct ofono_cdma_netreg *cdma_netreg;
+ unsigned int cdma_netreg_watch;
const struct ofono_cdma_connman_driver *driver;
void *driver_data;
struct ofono_atom *atom;
@@ -338,6 +341,17 @@ static void cdma_connman_settings_append_properties(
dbus_message_iter_close_container(dict, &entry);
}
+ofono_bool_t cdma_connman_netreg_update(struct ofono_cdma_connman *cm)
+{
I think this function should be named a bit better. Wouldn't
is_registered be clearer?
+ ofono_bool_t registered;
+ int status = ofono_cdma_netreg_get_status(cm->cdma_netreg);
+
+ registered = status == NETWORK_REGISTRATION_STATUS_REGISTERED;
+
+ return registered || (cm->roaming_allowed &&
+ status == NETWORK_REGISTRATION_STATUS_ROAMING);
You seem to be doing quite a bit of work to accomplish your goal. If
you use __ofono_modem_find_atom then you can drop all the atom watch
bits and make this implementation way easier.
+}
+
static DBusMessage *cdma_connman_get_properties(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -365,6 +379,10 @@ static DBusMessage *cdma_connman_get_properties(DBusConnection
*conn,
value = cm->dormant;
ofono_dbus_dict_append(&dict, "Dormant", DBUS_TYPE_BOOLEAN, &value);
+ value = cm->roaming_allowed;
+ ofono_dbus_dict_append(&dict, "RoamingAllowed",
+ DBUS_TYPE_BOOLEAN, &value);
+
if (cm->settings)
cdma_connman_settings_append_properties(cm, &dict);
@@ -450,7 +468,23 @@ static DBusMessage *cdma_connman_set_property(DBusConnection *conn,
dbus_message_iter_recurse(&iter, &var);
- if (!strcmp(property, "Powered")) {
+ if (!strcmp(property, "RoamingAllowed")) {
+ if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_BOOLEAN)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_get_basic(&var, &value);
+
+ if (cm->roaming_allowed == (ofono_bool_t) value)
+ return dbus_message_new_method_return(msg);
+
+ cm->roaming_allowed = value;
+
+ if (cdma_connman_netreg_update(cm) == FALSE &&
+ cm->powered == TRUE)
+ cm->driver->deactivate(cm, deactivate_callback, cm);
+
Can you please put the RoamingAllowed details in a separate patch
(preferably among the last in the series), this one might need to be
thought about some more.
+ return NULL;
+ } if (!strcmp(property, "Powered")) {
if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_BOOLEAN)
return __ofono_error_invalid_args(msg);
@@ -463,9 +497,11 @@ static DBusMessage *cdma_connman_set_property(DBusConnection *conn,
cm->driver->deactivate == NULL)
return __ofono_error_not_implemented(msg);
+ if (cdma_connman_netreg_update(cm) == FALSE)
+ return __ofono_error_not_registered(msg);
+
cm->pending = dbus_message_ref(msg);
- /* TODO: add logic to support CDMA Network Registration */
if (value)
cm->driver->activate(cm, cm->username, cm->password,
activate_callback, cm);
@@ -529,11 +565,18 @@ void ofono_cdma_connman_driver_unregister(
static void cdma_connman_unregister(struct ofono_atom *atom)
{
DBusConnection *conn = ofono_dbus_get_connection();
+ struct ofono_cdma_connman *cm = __ofono_atom_get_data(atom);
struct ofono_modem *modem = __ofono_atom_get_modem(atom);
const char *path = __ofono_atom_get_path(atom);
DBG("");
+ if (cm->cdma_netreg_watch) {
+ __ofono_modem_remove_atom_watch(modem, cm->cdma_netreg_watch);
+ cm->cdma_netreg_watch = 0;
+ cm->cdma_netreg = NULL;
+ }
+
g_dbus_unregister_interface(conn, path,
OFONO_CDMA_CONNECTION_MANAGER_INTERFACE);
ofono_modem_remove_interface(modem,
@@ -593,6 +636,20 @@ struct ofono_cdma_connman *ofono_cdma_connman_create(
return cm;
}
+static void cdma_netreg_watch(struct ofono_atom *atom,
+ enum ofono_atom_watch_condition cond,
+ void *data)
+{
+ struct ofono_cdma_connman *cm = data;
+
+ if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) {
+ cm->cdma_netreg = NULL;
+ return;
+ }
+
+ cm->cdma_netreg = __ofono_atom_get_data(atom);
+}
+
void ofono_cdma_connman_register(struct ofono_cdma_connman *cm)
{
DBusConnection *conn = ofono_dbus_get_connection();
@@ -613,7 +670,9 @@ void ofono_cdma_connman_register(struct ofono_cdma_connman *cm)
ofono_modem_add_interface(modem,
OFONO_CDMA_CONNECTION_MANAGER_INTERFACE);
- /* TODO: add watch to support CDMA Network Registration atom */
+ cm->cdma_netreg_watch = __ofono_modem_add_atom_watch(modem,
+ OFONO_ATOM_TYPE_CDMA_NETREG,
+ cdma_netreg_watch, cm, NULL);
__ofono_atom_register(cm->atom, cdma_connman_unregister);
}
Regards,
-Denis