---
 src/modem.c |   70 +++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 40 insertions(+), 30 deletions(-)

diff --git a/src/modem.c b/src/modem.c
index 6233944..1828a3b 100644
--- a/src/modem.c
+++ b/src/modem.c
@@ -70,6 +70,7 @@ struct ofono_modem {
        guint                   interface_update;
        ofono_bool_t            powered;
        ofono_bool_t            powered_pending;
+       ofono_bool_t            get_online;
        guint                   timeout;
        ofono_bool_t            online;
        struct ofono_watchlist  *online_watches;
@@ -434,30 +435,6 @@ static void modem_change_state(struct ofono_modem *modem,
        }
 }
 
-static void sim_state_watch(enum ofono_sim_state new_state, void *user)
-{
-       struct ofono_modem *modem = user;
-
-       switch (new_state) {
-       case OFONO_SIM_STATE_NOT_PRESENT:
-               modem_change_state(modem, MODEM_STATE_PRE_SIM);
-               break;
-       case OFONO_SIM_STATE_INSERTED:
-               break;
-       case OFONO_SIM_STATE_READY:
-               modem_change_state(modem, MODEM_STATE_OFFLINE);
-
-               /*
-                * If we don't have the set_online method, also proceed
-                * straight to the online state
-                */
-               if (modem->driver->set_online == NULL)
-                       modem_change_state(modem, MODEM_STATE_ONLINE);
-
-               break;
-       }
-}
-
 unsigned int __ofono_modem_add_online_watch(struct ofono_modem *modem,
                                        ofono_modem_online_notify_func notify,
                                        void *data, ofono_destroy_func destroy)
@@ -488,16 +465,18 @@ static void online_cb(const struct ofono_error *error, 
void *data)
        DBusMessage *reply;
 
        if (error->type == OFONO_ERROR_TYPE_NO_ERROR &&
-                       modem->modem_state == MODEM_STATE_OFFLINE)
+                       modem->modem_state == MODEM_STATE_OFFLINE) {
+               modem_change_state(modem, MODEM_STATE_ONLINE);
+
+               if (!modem->pending)
+                       return;
+
                reply = dbus_message_new_method_return(modem->pending);
-       else
+       } else {
                reply = __ofono_error_failed(modem->pending);
+       }
 
        __ofono_dbus_pending_reply(&modem->pending, reply);
-
-       if (error->type == OFONO_ERROR_TYPE_NO_ERROR &&
-                       modem->modem_state == MODEM_STATE_OFFLINE)
-               modem_change_state(modem, MODEM_STATE_ONLINE);
 }
 
 static void offline_cb(const struct ofono_error *error, void *data)
@@ -517,6 +496,34 @@ static void offline_cb(const struct ofono_error *error, 
void *data)
                modem_change_state(modem, MODEM_STATE_OFFLINE);
 }
 
+static void sim_state_watch(enum ofono_sim_state new_state, void *user)
+{
+       struct ofono_modem *modem = user;
+
+       switch (new_state) {
+       case OFONO_SIM_STATE_NOT_PRESENT:
+               modem_change_state(modem, MODEM_STATE_PRE_SIM);
+               break;
+       case OFONO_SIM_STATE_INSERTED:
+               break;
+       case OFONO_SIM_STATE_READY:
+               modem_change_state(modem, MODEM_STATE_OFFLINE);
+
+               /*
+                * If we don't have the set_online method, also proceed
+                * straight to the online state
+                */
+               if (modem->driver->set_online == NULL)
+                       modem_change_state(modem, MODEM_STATE_ONLINE);
+               else if (modem->get_online)
+                       modem->driver->set_online(modem, 1, online_cb, modem);
+
+               modem->get_online = FALSE;
+
+               break;
+       }
+}
+
 static DBusMessage *set_property_online(struct ofono_modem *modem,
                                        DBusMessage *msg,
                                        DBusMessageIter *var)
@@ -1621,6 +1628,9 @@ void ofono_modem_reset(struct ofono_modem *modem)
 
        DBG("%p", modem);
 
+       if (modem->modem_state == MODEM_STATE_ONLINE)
+               modem->get_online = TRUE;
+
        ofono_modem_set_powered(modem, FALSE);
 
        err = set_powered(modem, TRUE);
-- 
1.7.3.2

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to