diff options
Diffstat (limited to 'src/mm-broadband-modem-mbim.c')
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 81 |
1 files changed, 77 insertions, 4 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 9ab36a90..b4d3ff1d 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -2301,6 +2301,81 @@ modem_3gpp_register_in_network (MMIfaceModem3gpp *self, } /*****************************************************************************/ +/* Scan networks (3GPP interface) */ + +static GList * +modem_3gpp_scan_networks_finish (MMIfaceModem3gpp *self, + GAsyncResult *res, + GError **error) +{ + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) + return NULL; + + return g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); +} + +static void +visible_providers_query_ready (MbimDevice *device, + GAsyncResult *res, + GSimpleAsyncResult *simple) +{ + MbimMessage *response; + GError *error = NULL; + MbimProvider **providers; + guint n_providers; + + response = mbim_device_command_finish (device, res, &error); + if (response && + mbim_message_command_done_get_result (response, &error) && + mbim_message_visible_providers_response_parse ( + response, + &n_providers, + &providers, + &error)) { + GList *info_list; + + info_list = mm_3gpp_network_info_list_from_mbim_providers ((const MbimProvider *const *)providers, + n_providers); + g_simple_async_result_set_op_res_gpointer (simple, info_list, NULL); + mbim_provider_array_free (providers); + } else + g_simple_async_result_take_error (simple, error); + + if (response) + mbim_message_unref (response); + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +modem_3gpp_scan_networks (MMIfaceModem3gpp *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; + MbimDevice *device; + MbimMessage *message; + + if (!peek_device (self, &device, callback, user_data)) + return; + + result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + modem_3gpp_scan_networks); + + mm_dbg ("scanning networks..."); + message = mbim_message_visible_providers_query_new (MBIM_VISIBLE_PROVIDERS_ACTION_FULL_SCAN, NULL); + mbim_device_command (device, + message, + 120, + NULL, + (GAsyncReadyCallback)visible_providers_query_ready, + result); + mbim_message_unref (message); +} + +/*****************************************************************************/ /* Check support (Messaging interface) */ static gboolean @@ -2698,10 +2773,8 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface) iface->run_registration_checks_finish = modem_3gpp_run_registration_checks_finish; iface->register_in_network = modem_3gpp_register_in_network; iface->register_in_network_finish = modem_3gpp_register_in_network_finish; - - /* TODO: use MBIM_CID_VISIBLE_PROVIDERS */ - iface->scan_networks = NULL; - iface->scan_networks_finish = NULL; + iface->scan_networks = modem_3gpp_scan_networks; + iface->scan_networks_finish = modem_3gpp_scan_networks_finish; } static void |