Hi Denis,

On 02/11/2011 16:27, Denis Kenzior wrote:
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?

Yes.

+       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.

I will remove the atom watch and try to find it, if it fails I will return FALSE.

+}
+
  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.

Ok I will separate it.

+               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


Kind regards,
Guillaume
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to