diff options
Diffstat (limited to 'src/mm-iface-modem.c')
-rw-r--r-- | src/mm-iface-modem.c | 198 |
1 files changed, 122 insertions, 76 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 135f18f0..59be9e67 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -2124,7 +2124,7 @@ handle_set_current_bands (MmGdbusModem *skeleton, } /*****************************************************************************/ -/* ALLOWED MODES */ +/* Set current modes */ typedef struct { MMIfaceModem *self; @@ -2132,10 +2132,10 @@ typedef struct { GSimpleAsyncResult *result; MMModemMode allowed; MMModemMode preferred; -} SetAllowedModesContext; +} SetCurrentModesContext; static void -set_allowed_modes_context_complete_and_free (SetAllowedModesContext *ctx) +set_current_modes_context_complete_and_free (SetCurrentModesContext *ctx) { g_simple_async_result_complete_in_idle (ctx->result); g_object_unref (ctx->result); @@ -2146,7 +2146,7 @@ set_allowed_modes_context_complete_and_free (SetAllowedModesContext *ctx) } gboolean -mm_iface_modem_set_allowed_modes_finish (MMIfaceModem *self, +mm_iface_modem_set_current_modes_finish (MMIfaceModem *self, GAsyncResult *res, GError **error) { @@ -2154,39 +2154,87 @@ mm_iface_modem_set_allowed_modes_finish (MMIfaceModem *self, } static void -set_allowed_modes_ready (MMIfaceModem *self, +after_set_load_current_modes_ready (MMIfaceModem *self, + GAsyncResult *res, + SetCurrentModesContext *ctx) +{ + MMModemMode allowed = MM_MODEM_MODE_NONE; + MMModemMode preferred = MM_MODEM_MODE_NONE; + GError *error = NULL; + + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->load_current_modes_finish (self, + res, + &allowed, + &preferred, + &error)) { + /* Errors when getting allowed/preferred won't be critical */ + mm_warn ("couldn't load current allowed/preferred modes: '%s'", error->message); + g_error_free (error); + + /* If errors getting allowed modes, default to the ones we asked for */ + mm_gdbus_modem_set_current_modes (ctx->skeleton, g_variant_new ("(uu)", ctx->allowed, ctx->preferred)); + } else + mm_gdbus_modem_set_current_modes (ctx->skeleton, g_variant_new ("(uu)", allowed, preferred)); + + /* Done */ + set_current_modes_context_complete_and_free (ctx); +} + +static void +set_current_modes_ready (MMIfaceModem *self, GAsyncResult *res, - SetAllowedModesContext *ctx) + SetCurrentModesContext *ctx) { + MMModemState modem_state; GError *error = NULL; - if (!MM_IFACE_MODEM_GET_INTERFACE (self)->set_allowed_modes_finish (self, res, &error)) + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->set_current_modes_finish (self, res, &error)) { g_simple_async_result_take_error (ctx->result, error); - else { - mm_gdbus_modem_set_allowed_modes (ctx->skeleton, ctx->allowed); - mm_gdbus_modem_set_preferred_mode (ctx->skeleton, ctx->preferred); - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); + set_current_modes_context_complete_and_free (ctx); + return; } - set_allowed_modes_context_complete_and_free (ctx); + /* If modem is not enabled, avoid updating the current modes */ + modem_state = MM_MODEM_STATE_UNKNOWN; + g_object_get (ctx->self, + MM_IFACE_MODEM_STATE, &modem_state, + NULL); + if (modem_state >= MM_MODEM_STATE_ENABLING) { + if (MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_current_modes && + MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_current_modes_finish) { + MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_current_modes ( + ctx->self, + (GAsyncReadyCallback)after_set_load_current_modes_ready, + ctx); + return; + } + + mm_gdbus_modem_set_current_modes (ctx->skeleton, + g_variant_new ("(uu)", + ctx->allowed, + ctx->preferred)); + } + + g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); + set_current_modes_context_complete_and_free (ctx); } void -mm_iface_modem_set_allowed_modes (MMIfaceModem *self, +mm_iface_modem_set_current_modes (MMIfaceModem *self, MMModemMode allowed, MMModemMode preferred, GAsyncReadyCallback callback, gpointer user_data) { GArray *supported; - SetAllowedModesContext *ctx; - MMModemMode current_allowed; - MMModemMode current_preferred; + SetCurrentModesContext *ctx; + MMModemMode current_allowed = MM_MODEM_MODE_ANY; + MMModemMode current_preferred = MM_MODEM_MODE_NONE; guint i; /* If setting allowed modes is not implemented, report an error */ - if (!MM_IFACE_MODEM_GET_INTERFACE (self)->set_allowed_modes || - !MM_IFACE_MODEM_GET_INTERFACE (self)->set_allowed_modes_finish) { + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->set_current_modes || + !MM_IFACE_MODEM_GET_INTERFACE (self)->set_current_modes_finish) { g_simple_async_report_error_in_idle (G_OBJECT (self), callback, user_data, @@ -2197,12 +2245,12 @@ mm_iface_modem_set_allowed_modes (MMIfaceModem *self, } /* Setup context */ - ctx = g_new0 (SetAllowedModesContext, 1); + ctx = g_new0 (SetCurrentModesContext, 1); ctx->self = g_object_ref (self); ctx->result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, - mm_iface_modem_set_allowed_modes); + mm_iface_modem_set_current_modes); ctx->allowed = allowed; ctx->preferred = preferred; g_object_get (self, @@ -2213,7 +2261,7 @@ mm_iface_modem_set_allowed_modes (MMIfaceModem *self, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Couldn't get interface skeleton"); - set_allowed_modes_context_complete_and_free (ctx); + set_current_modes_context_complete_and_free (ctx); return; } @@ -2228,7 +2276,7 @@ mm_iface_modem_set_allowed_modes (MMIfaceModem *self, MM_CORE_ERROR_UNSUPPORTED, "Cannot change modes: only one combination supported"); g_array_unref (supported); - set_allowed_modes_context_complete_and_free (ctx); + set_current_modes_context_complete_and_free (ctx); return; } @@ -2257,7 +2305,7 @@ mm_iface_modem_set_allowed_modes (MMIfaceModem *self, MM_CORE_ERROR_UNSUPPORTED, "The given combination of allowed and preferred modes is not supported"); g_array_unref (supported); - set_allowed_modes_context_complete_and_free (ctx); + set_current_modes_context_complete_and_free (ctx); return; } } @@ -2265,12 +2313,14 @@ mm_iface_modem_set_allowed_modes (MMIfaceModem *self, g_array_unref (supported); /* Check if we already are in the requested setup */ - current_allowed = mm_gdbus_modem_get_allowed_modes (ctx->skeleton); - current_preferred = mm_gdbus_modem_get_preferred_mode (ctx->skeleton); + g_variant_get (mm_gdbus_modem_get_current_modes (ctx->skeleton), + "(uu)", + ¤t_allowed, + ¤t_preferred); if (current_allowed == allowed && current_preferred == preferred) { g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); - set_allowed_modes_context_complete_and_free (ctx); + set_current_modes_context_complete_and_free (ctx); return; } @@ -2290,16 +2340,16 @@ mm_iface_modem_set_allowed_modes (MMIfaceModem *self, g_free (preferred_str); g_free (allowed_str); - set_allowed_modes_context_complete_and_free (ctx); + set_current_modes_context_complete_and_free (ctx); return; } ctx->allowed = allowed; ctx->preferred = preferred; - MM_IFACE_MODEM_GET_INTERFACE (self)->set_allowed_modes (self, + MM_IFACE_MODEM_GET_INTERFACE (self)->set_current_modes (self, allowed, preferred, - (GAsyncReadyCallback)set_allowed_modes_ready, + (GAsyncReadyCallback)set_current_modes_ready, ctx); } @@ -2309,10 +2359,10 @@ typedef struct { MMIfaceModem *self; MMModemMode allowed; MMModemMode preferred; -} HandleSetAllowedModesContext; +} HandleSetCurrentModesContext; static void -handle_set_allowed_modes_context_free (HandleSetAllowedModesContext *ctx) +handle_set_current_modes_context_free (HandleSetCurrentModesContext *ctx) { g_object_unref (ctx->skeleton); g_object_unref (ctx->invocation); @@ -2321,31 +2371,31 @@ handle_set_allowed_modes_context_free (HandleSetAllowedModesContext *ctx) } static void -handle_set_allowed_modes_ready (MMIfaceModem *self, +handle_set_current_modes_ready (MMIfaceModem *self, GAsyncResult *res, - HandleSetAllowedModesContext *ctx) + HandleSetCurrentModesContext *ctx) { GError *error = NULL; - if (!mm_iface_modem_set_allowed_modes_finish (self, res, &error)) + if (!mm_iface_modem_set_current_modes_finish (self, res, &error)) g_dbus_method_invocation_take_error (ctx->invocation, error); else - mm_gdbus_modem_complete_set_allowed_modes (ctx->skeleton, ctx->invocation); + mm_gdbus_modem_complete_set_current_modes (ctx->skeleton, ctx->invocation); - handle_set_allowed_modes_context_free (ctx); + handle_set_current_modes_context_free (ctx); } static void -handle_set_allowed_modes_auth_ready (MMBaseModem *self, +handle_set_current_modes_auth_ready (MMBaseModem *self, GAsyncResult *res, - HandleSetAllowedModesContext *ctx) + HandleSetCurrentModesContext *ctx) { MMModemState modem_state; GError *error = NULL; if (!mm_base_modem_authorize_finish (self, res, &error)) { g_dbus_method_invocation_take_error (ctx->invocation, error); - handle_set_allowed_modes_context_free (ctx); + handle_set_current_modes_context_free (ctx); return; } @@ -2360,37 +2410,39 @@ handle_set_allowed_modes_auth_ready (MMBaseModem *self, MM_CORE_ERROR_WRONG_STATE, "Cannot set allowed modes: " "not initialized/unlocked yet"); - handle_set_allowed_modes_context_free (ctx); + handle_set_current_modes_context_free (ctx); return; } - mm_iface_modem_set_allowed_modes (MM_IFACE_MODEM (self), + mm_iface_modem_set_current_modes (MM_IFACE_MODEM (self), ctx->allowed, ctx->preferred, - (GAsyncReadyCallback)handle_set_allowed_modes_ready, + (GAsyncReadyCallback)handle_set_current_modes_ready, ctx); } static gboolean -handle_set_allowed_modes (MmGdbusModem *skeleton, +handle_set_current_modes (MmGdbusModem *skeleton, GDBusMethodInvocation *invocation, - guint allowed, - guint preferred, + GVariant *variant, MMIfaceModem *self) { - HandleSetAllowedModesContext *ctx; + HandleSetCurrentModesContext *ctx; - ctx = g_new (HandleSetAllowedModesContext, 1); + ctx = g_new (HandleSetCurrentModesContext, 1); ctx->skeleton = g_object_ref (skeleton); ctx->invocation = g_object_ref (invocation); ctx->self = g_object_ref (self); - ctx->allowed = allowed; - ctx->preferred = preferred; + + g_variant_get (variant, + "(uu)", + &ctx->allowed, + &ctx->preferred); mm_base_modem_authorize (MM_BASE_MODEM (self), invocation, MM_AUTHORIZATION_DEVICE_CONTROL, - (GAsyncReadyCallback)handle_set_allowed_modes_auth_ready, + (GAsyncReadyCallback)handle_set_current_modes_auth_ready, ctx); return TRUE; } @@ -2982,7 +3034,7 @@ static void interface_disabling_step (DisablingContext *ctx); typedef enum { DISABLING_STEP_FIRST, DISABLING_STEP_CURRENT_BANDS, - DISABLING_STEP_ALLOWED_MODES, + DISABLING_STEP_CURRENT_MODES, DISABLING_STEP_LAST } DisablingStep; @@ -3027,10 +3079,9 @@ interface_disabling_step (DisablingContext *ctx) /* Fall down to next step */ ctx->step++; - case DISABLING_STEP_ALLOWED_MODES: + case DISABLING_STEP_CURRENT_MODES: /* Clear allowed/preferred modes */ - mm_gdbus_modem_set_allowed_modes (ctx->skeleton, MM_MODEM_MODE_NONE); - mm_gdbus_modem_set_preferred_mode (ctx->skeleton, MM_MODEM_MODE_NONE); + mm_gdbus_modem_set_current_modes (ctx->skeleton, g_variant_new ("(uu)", MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE)); /* Fall down to next step */ ctx->step++; @@ -3086,7 +3137,7 @@ typedef enum { ENABLING_STEP_FLOW_CONTROL, ENABLING_STEP_SUPPORTED_CHARSETS, ENABLING_STEP_CHARSET, - ENABLING_STEP_ALLOWED_MODES, + ENABLING_STEP_CURRENT_MODES, ENABLING_STEP_CURRENT_BANDS, ENABLING_STEP_LAST } EnablingStep; @@ -3213,7 +3264,7 @@ setup_charset_ready (MMIfaceModem *self, } static void -load_allowed_modes_ready (MMIfaceModem *self, +load_current_modes_ready (MMIfaceModem *self, GAsyncResult *res, EnablingContext *ctx) { @@ -3221,7 +3272,7 @@ load_allowed_modes_ready (MMIfaceModem *self, MMModemMode preferred = MM_MODEM_MODE_NONE; GError *error = NULL; - if (!MM_IFACE_MODEM_GET_INTERFACE (self)->load_allowed_modes_finish (self, + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->load_current_modes_finish (self, res, &allowed, &preferred, @@ -3231,12 +3282,9 @@ load_allowed_modes_ready (MMIfaceModem *self, g_error_free (error); /* If errors getting allowed modes, assume ANY/NONE */ - allowed = MM_MODEM_MODE_ANY; - preferred = MM_MODEM_MODE_NONE; - } - - mm_gdbus_modem_set_allowed_modes (ctx->skeleton, allowed); - mm_gdbus_modem_set_preferred_mode (ctx->skeleton, preferred); + mm_gdbus_modem_set_current_modes (ctx->skeleton, g_variant_new ("(uu)", MM_MODEM_MODE_ANY, MM_MODEM_MODE_NONE)); + } else + mm_gdbus_modem_set_current_modes (ctx->skeleton, g_variant_new ("(uu)", allowed, preferred)); /* Done, Go on to next step */ ctx->step++; @@ -3374,20 +3422,19 @@ interface_enabling_step (EnablingContext *ctx) /* Fall down to next step */ ctx->step++; - case ENABLING_STEP_ALLOWED_MODES: - if (MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_allowed_modes && - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_allowed_modes_finish) { - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_allowed_modes ( + case ENABLING_STEP_CURRENT_MODES: + if (MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_current_modes && + MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_current_modes_finish) { + MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_current_modes ( ctx->self, - (GAsyncReadyCallback)load_allowed_modes_ready, + (GAsyncReadyCallback)load_current_modes_ready, ctx); return; } - /* If no way to get allowed modes, assume allowed=any, - * and none preferred */ - mm_gdbus_modem_set_allowed_modes (ctx->skeleton, MM_MODEM_MODE_ANY); - mm_gdbus_modem_set_preferred_mode (ctx->skeleton, MM_MODEM_MODE_NONE); + /* If no way to get modes, assume ANY/NONE */ + mm_gdbus_modem_set_current_modes (ctx->skeleton, g_variant_new ("(uu)", MM_MODEM_MODE_ANY, MM_MODEM_MODE_NONE)); + /* Fall down to next step */ ctx->step++; @@ -4227,8 +4274,8 @@ interface_initialization_step (InitializationContext *ctx) G_CALLBACK (handle_set_current_bands), ctx->self); g_signal_connect (ctx->skeleton, - "handle-set-allowed-modes", - G_CALLBACK (handle_set_allowed_modes), + "handle-set-current-modes", + G_CALLBACK (handle_set_current_modes), ctx->self); g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); } @@ -4289,8 +4336,7 @@ mm_iface_modem_initialize (MMIfaceModem *self, mm_gdbus_modem_set_access_technologies (skeleton, MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN); mm_gdbus_modem_set_signal_quality (skeleton, g_variant_new ("(ub)", 0, FALSE)); mm_gdbus_modem_set_supported_modes (skeleton, mm_common_build_mode_combinations_default ()); - mm_gdbus_modem_set_allowed_modes (skeleton, MM_MODEM_MODE_NONE); - mm_gdbus_modem_set_preferred_mode (skeleton, MM_MODEM_MODE_NONE); + mm_gdbus_modem_set_current_modes (skeleton,g_variant_new ("(uu)", MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE)); mm_gdbus_modem_set_supported_bands (skeleton, mm_common_build_bands_unknown ()); mm_gdbus_modem_set_current_bands (skeleton, mm_common_build_bands_unknown ()); mm_gdbus_modem_set_supported_ip_families (skeleton, MM_BEARER_IP_FAMILY_NONE); |