iface-modem: allow state updates without bearer list

E.g. if we reach the failed state before the bearer list is created.
This commit is contained in:
Aleksander Morgado
2022-05-20 14:58:43 +02:00
parent 9c773fcad4
commit 63d02f9da2

View File

@@ -1922,28 +1922,23 @@ bearer_list_count_connected (MMBaseBearer *bearer,
} }
static void static void
update_state_internal (MMIfaceModem *self, update_state_internal (MMIfaceModem *self,
MMModemState new_state, MMModemState new_state,
MMModemStateChangeReason reason, MMModemStateChangeReason reason,
MMModemStateFailedReason failed_reason) MMModemStateFailedReason failed_reason)
{ {
MMModemState old_state = MM_MODEM_STATE_UNKNOWN; MMModemState old_state = MM_MODEM_STATE_UNKNOWN;
MmGdbusModem *skeleton = NULL; g_autoptr(MmGdbusModemSkeleton) skeleton = NULL;
MMBearerList *bearer_list = NULL; g_autoptr(MMBearerList) bearer_list = NULL;
g_object_get (self, g_object_get (self,
MM_IFACE_MODEM_STATE, &old_state, MM_IFACE_MODEM_STATE, &old_state,
MM_IFACE_MODEM_DBUS_SKELETON, &skeleton, MM_IFACE_MODEM_DBUS_SKELETON, &skeleton,
MM_IFACE_MODEM_BEARER_LIST, &bearer_list, MM_IFACE_MODEM_BEARER_LIST, &bearer_list,
NULL); NULL);
if (!skeleton || !bearer_list) { if (!skeleton)
if (skeleton)
g_object_unref (skeleton);
if (bearer_list)
g_object_unref (bearer_list);
return; return;
}
/* While connected we don't want registration status changes to change /* While connected we don't want registration status changes to change
* the modem's state away from CONNECTED. */ * the modem's state away from CONNECTED. */
@@ -1981,17 +1976,14 @@ update_state_internal (MMIfaceModem *self,
/* Signal status change */ /* Signal status change */
if (skeleton) { if (skeleton) {
/* Set failure reason */ /* Set failure reason */
if (failed_reason != mm_gdbus_modem_get_state_failed_reason (skeleton)) if (failed_reason != mm_gdbus_modem_get_state_failed_reason (MM_GDBUS_MODEM (skeleton)))
mm_gdbus_modem_set_state_failed_reason (skeleton, failed_reason); mm_gdbus_modem_set_state_failed_reason (MM_GDBUS_MODEM (skeleton), failed_reason);
/* Flush current change before signaling the state change, /* Flush current change before signaling the state change,
* so that clients get the proper state already in the * so that clients get the proper state already in the
* state-changed callback */ * state-changed callback */
g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (skeleton)); g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (skeleton));
mm_gdbus_modem_emit_state_changed (skeleton, mm_gdbus_modem_emit_state_changed (MM_GDBUS_MODEM (skeleton), old_state, new_state, reason);
old_state,
new_state,
reason);
} }
/* If we go to a registered/connected state (from unregistered), setup /* If we go to a registered/connected state (from unregistered), setup
@@ -2003,11 +1995,6 @@ update_state_internal (MMIfaceModem *self,
else if (old_state >= MM_MODEM_STATE_REGISTERED && new_state < MM_MODEM_STATE_REGISTERED) else if (old_state >= MM_MODEM_STATE_REGISTERED && new_state < MM_MODEM_STATE_REGISTERED)
periodic_signal_check_disable (self, TRUE); periodic_signal_check_disable (self, TRUE);
} }
if (skeleton)
g_object_unref (skeleton);
if (bearer_list)
g_object_unref (bearer_list);
} }
void void