diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2022-01-07 12:00:01 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-01-18 09:00:10 +0000 |
commit | dbeeb987456150c8a49ba5f6062ad6b96887cd38 (patch) | |
tree | d070a473c46f31d2956ee8c230668431768a149e /libmm-glib | |
parent | ec7bcc88d30595423621c50113eebff4e2282fdd (diff) |
libmm-glib,modem: new methods to get list of cell infos
Diffstat (limited to 'libmm-glib')
-rw-r--r-- | libmm-glib/mm-modem.c | 130 | ||||
-rw-r--r-- | libmm-glib/mm-modem.h | 12 |
2 files changed, 141 insertions, 1 deletions
diff --git a/libmm-glib/mm-modem.c b/libmm-glib/mm-modem.c index 5e244314..8e1a80f2 100644 --- a/libmm-glib/mm-modem.c +++ b/libmm-glib/mm-modem.c @@ -23,7 +23,6 @@ #include <gio/gio.h> #include <string.h> - #include "mm-common-helpers.h" #include "mm-errors-types.h" #include "mm-helpers.h" @@ -3247,6 +3246,135 @@ mm_modem_set_primary_sim_slot_sync (MMModem *self, /*****************************************************************************/ +static GList * +create_cell_info_list (GVariant *variant, + GError **error) +{ + GError *inner_error = NULL; + GList *list = NULL; + GVariantIter dict_iter; + GVariant *dict; + + /* Input is aa{sv} */ + g_variant_iter_init (&dict_iter, variant); + while ((dict = g_variant_iter_next_value (&dict_iter))) { + MMCellInfo *cell_info; + + cell_info = mm_cell_info_new_from_dictionary (dict, &inner_error); + if (inner_error) + break; + + list = g_list_prepend (list, cell_info); + g_variant_unref (dict); + } + + if (inner_error) { + g_list_free_full (g_steal_pointer (&list), g_object_unref); + g_propagate_error (error, inner_error); + } + + g_variant_unref (variant); + + return list; +} + +/** + * mm_modem_get_cell_info_finish: + * @self: A #MMModem. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_modem_get_cell_info(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_get_cell_info(). + * + * Returns: (transfer full) (element-type ModemManager.CellInfo): a list + * of #MMCellInfo objects, or #NULL if @error is set. The returned value + * should be freed with g_list_free_full() using g_object_unref() as + * #GDestroyNotify function. + * + * Since: 1.20 + */ +GList * +mm_modem_get_cell_info_finish (MMModem *self, + GAsyncResult *res, + GError **error) +{ + GVariant *result = NULL; + + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + + if (!mm_gdbus_modem_call_get_cell_info_finish (MM_GDBUS_MODEM (self), &result, res, error)) + return NULL; + + return create_cell_info_list (result, error); +} + +/** + * mm_modem_get_cell_info: + * @self: A #MMModem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or + * %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously requests to get info about serving and neighboring cells. + * + * When the operation is finished, @callback will be invoked in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * of the thread you are calling this method from. You can then call + * mm_modem_get_cell_info_finish() to get the result of the operation. + * + * See mm_modem_get_cell_info_sync() for the synchronous, blocking version of this + * method. + * + * Since: 1.20 + */ +void +mm_modem_get_cell_info (MMModem *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM (self)); + + mm_gdbus_modem_call_get_cell_info (MM_GDBUS_MODEM (self), cancellable, callback, user_data); +} + +/** + * mm_modem_get_cell_info_sync: + * @self: A #MMModem. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously requests to get info about serving and neighboring cells. + * + * The calling thread is blocked until a reply is received. See + * mm_modem_get_cell_info() for the asynchronous version of this method. + * + * Returns: (transfer full) (element-type ModemManager.CellInfo): a list + * of #MMCellInfo objects, or #NULL if @error is set. The returned value + * should be freed with g_list_free_full() using g_object_unref() as + * #GDestroyNotify function. + * + * Since: 1.20 + */ +GList * +mm_modem_get_cell_info_sync (MMModem *self, + GCancellable *cancellable, + GError **error) +{ + GVariant *result = NULL; + + g_return_val_if_fail (MM_IS_MODEM (self), FALSE); + + if (!mm_gdbus_modem_call_get_cell_info_sync (MM_GDBUS_MODEM (self), &result, cancellable, error)) + return NULL; + + return create_cell_info_list (result, error); +} + +/*****************************************************************************/ + static void mm_modem_init (MMModem *self) { diff --git a/libmm-glib/mm-modem.h b/libmm-glib/mm-modem.h index 655e6f47..9d1a7333 100644 --- a/libmm-glib/mm-modem.h +++ b/libmm-glib/mm-modem.h @@ -34,6 +34,7 @@ #include "mm-unlock-retries.h" #include "mm-sim.h" #include "mm-bearer.h" +#include "mm-cell-info.h" #include "mm-helper-types.h" G_BEGIN_DECLS @@ -372,6 +373,17 @@ gboolean mm_modem_set_primary_sim_slot_sync (MMModem *self, GCancellable *cancellable, GError **error); +void mm_modem_get_cell_info (MMModem *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GList *mm_modem_get_cell_info_finish (MMModem *self, + GAsyncResult *res, + GError **error); +GList *mm_modem_get_cell_info_sync (MMModem *self, + GCancellable *cancellable, + GError **error); + G_END_DECLS #endif /* _MM_MODEM_H_ */ |