diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-04-03 21:19:54 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-04-29 10:13:22 +0000 |
commit | 2d43ea48e1d2bae37f9d0594c385451739287bef (patch) | |
tree | c7c10edaac1cdaa15ac36e0b82b496fb2e201ad4 /libmm-glib | |
parent | 793370f2f8efc6472d7265892013f6615188344e (diff) |
api,modem: new Modem3gpp.ProfileManager interface
This new interface allows modems to expose the list of available
connection profiles stored in the device and edit or delete them; as
long as the underlying device/protocol allows it.
Diffstat (limited to 'libmm-glib')
-rw-r--r-- | libmm-glib/Makefile.am | 3 | ||||
-rw-r--r-- | libmm-glib/generated/Makefile.am | 4 | ||||
-rw-r--r-- | libmm-glib/libmm-glib.h | 1 | ||||
-rw-r--r-- | libmm-glib/mm-manager.c | 27 | ||||
-rw-r--r-- | libmm-glib/mm-modem-3gpp-profile-manager.c | 489 | ||||
-rw-r--r-- | libmm-glib/mm-modem-3gpp-profile-manager.h | 112 | ||||
-rw-r--r-- | libmm-glib/mm-object.c | 46 | ||||
-rw-r--r-- | libmm-glib/mm-object.h | 51 |
8 files changed, 696 insertions, 37 deletions
diff --git a/libmm-glib/Makefile.am b/libmm-glib/Makefile.am index 36d16505..ee59f557 100644 --- a/libmm-glib/Makefile.am +++ b/libmm-glib/Makefile.am @@ -18,6 +18,8 @@ libmm_glib_la_SOURCES = \ mm-modem.c \ mm-modem-3gpp.h \ mm-modem-3gpp.c \ + mm-modem-3gpp-profile-manager.h \ + mm-modem-3gpp-profile-manager.c \ mm-modem-3gpp-ussd.h \ mm-modem-3gpp-ussd.c \ mm-modem-cdma.h \ @@ -129,6 +131,7 @@ include_HEADERS = \ mm-object.h \ mm-modem.h \ mm-modem-3gpp.h \ + mm-modem-3gpp-profile-manager.h \ mm-modem-3gpp-ussd.h \ mm-modem-cdma.h \ mm-modem-messaging.h \ diff --git a/libmm-glib/generated/Makefile.am b/libmm-glib/generated/Makefile.am index 93e0d991..0016df4d 100644 --- a/libmm-glib/generated/Makefile.am +++ b/libmm-glib/generated/Makefile.am @@ -44,6 +44,7 @@ GENERATED_DOC = \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Oma.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.ModemCdma.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.xml \ + mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Sar.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Simple.xml \ @@ -119,6 +120,7 @@ mm_gdbus_modem_generated = \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Oma.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.ModemCdma.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.xml \ + mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Sar.xml \ mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Simple.xml \ @@ -134,6 +136,7 @@ mm_gdbus_modem_deps = \ $(top_srcdir)/introspection/org.freedesktop.ModemManager1.Modem.Oma.xml \ $(top_srcdir)/introspection/org.freedesktop.ModemManager1.Modem.ModemCdma.xml \ $(top_srcdir)/introspection/org.freedesktop.ModemManager1.Modem.Modem3gpp.xml \ + $(top_srcdir)/introspection/org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager.xml \ $(top_srcdir)/introspection/org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd.xml \ $(top_srcdir)/introspection/org.freedesktop.ModemManager1.Modem.Sar.xml \ $(top_srcdir)/introspection/org.freedesktop.ModemManager1.Modem.Simple.xml \ @@ -149,6 +152,7 @@ mm-gdbus-modem.c: $(mm_gdbus_modem_deps) --annotate "org.freedesktop.ModemManager1.Modem.ModemCdma" org.gtk.GDBus.C.Name ModemCdma \ --annotate "org.freedesktop.ModemManager1.Modem.Modem3gpp" org.gtk.GDBus.C.Name Modem3gpp \ --annotate "org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd" org.gtk.GDBus.C.Name Modem3gppUssd \ + --annotate "org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager" org.gtk.GDBus.C.Name Modem3gppProfileManager \ $^ \ $(NULL) $(filter-out mm-gdbus-modem.c, $(mm_gdbus_modem_generated)): $(mm_gdbus_modem_deps) mm-gdbus-modem.c diff --git a/libmm-glib/libmm-glib.h b/libmm-glib/libmm-glib.h index f288d628..03b3f1f4 100644 --- a/libmm-glib/libmm-glib.h +++ b/libmm-glib/libmm-glib.h @@ -40,6 +40,7 @@ # include <mm-bearer.h> # include <mm-modem.h> # include <mm-modem-3gpp.h> +# include <mm-modem-3gpp-profile-manager.h> # include <mm-modem-3gpp-ussd.h> # include <mm-modem-cdma.h> # include <mm-modem-simple.h> diff --git a/libmm-glib/mm-manager.c b/libmm-glib/mm-manager.c index c7585ed1..d22c2136 100644 --- a/libmm-glib/mm-manager.c +++ b/libmm-glib/mm-manager.c @@ -65,19 +65,20 @@ get_proxy_type (GDBusObjectManagerClient *manager, if (g_once_init_enter (&once_init_value)) { lookup_hash = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem", GSIZE_TO_POINTER (MM_TYPE_MODEM)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Messaging", GSIZE_TO_POINTER (MM_TYPE_MODEM_MESSAGING)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Voice", GSIZE_TO_POINTER (MM_TYPE_MODEM_VOICE)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Location", GSIZE_TO_POINTER (MM_TYPE_MODEM_LOCATION)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Time", GSIZE_TO_POINTER (MM_TYPE_MODEM_TIME)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Signal", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIGNAL)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Firmware", GSIZE_TO_POINTER (MM_TYPE_MODEM_FIRMWARE)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Oma", GSIZE_TO_POINTER (MM_TYPE_MODEM_OMA)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.ModemCdma", GSIZE_TO_POINTER (MM_TYPE_MODEM_CDMA)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Modem3gpp", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP_USSD)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Simple", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIMPLE)); - /* g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Contacts", GSIZE_TO_POINTER (MM_GDBUS_TYPE_MODEM_CONTACTS_PROXY)); */ + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem", GSIZE_TO_POINTER (MM_TYPE_MODEM)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Messaging", GSIZE_TO_POINTER (MM_TYPE_MODEM_MESSAGING)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Voice", GSIZE_TO_POINTER (MM_TYPE_MODEM_VOICE)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Location", GSIZE_TO_POINTER (MM_TYPE_MODEM_LOCATION)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Time", GSIZE_TO_POINTER (MM_TYPE_MODEM_TIME)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Signal", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIGNAL)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Firmware", GSIZE_TO_POINTER (MM_TYPE_MODEM_FIRMWARE)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Oma", GSIZE_TO_POINTER (MM_TYPE_MODEM_OMA)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.ModemCdma", GSIZE_TO_POINTER (MM_TYPE_MODEM_CDMA)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Modem3gpp", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP_PROFILE_MANAGER)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP_USSD)); + g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Simple", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIMPLE)); + /* g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Contacts", GSIZE_TO_POINTER (MM_GDBUS_TYPE_MODEM_CONTACTS_PROXY)); */ g_once_init_leave (&once_init_value, 1); } diff --git a/libmm-glib/mm-modem-3gpp-profile-manager.c b/libmm-glib/mm-modem-3gpp-profile-manager.c new file mode 100644 index 00000000..742299e0 --- /dev/null +++ b/libmm-glib/mm-modem-3gpp-profile-manager.c @@ -0,0 +1,489 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * libmm -- Access modem status & information from glib applications + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * Copyright (C) 2021 Aleksander Morgado <aleksander@aleksander.es> + * Copyright (C) 2021 Google, Inc. + */ + +#include <gio/gio.h> + +#include "mm-helpers.h" +#include "mm-errors-types.h" +#include "mm-modem-3gpp-profile-manager.h" + +/** + * SECTION: mm-modem-3gpp-profile-manager + * @title: MMModem3gppProfileManager + * @short_description: The 3GPP profile manager interface + * + * The #MMModem3gppProfileManager is an object providing access to the methods + * and signals of the 3GPP Profile Manager interface. + * + * This interface is only exposed when the 3GPP modem is known to handle profile + * management operations. + */ + +G_DEFINE_TYPE (MMModem3gppProfileManager, mm_modem_3gpp_profile_manager, MM_GDBUS_TYPE_MODEM3GPP_PROFILE_MANAGER_PROXY) + +/*****************************************************************************/ + +/** + * mm_modem_3gpp_profile_manager_get_path: + * @self: A #MMModem3gppProfileManager. + * + * Gets the DBus path of the #MMObject which implements this interface. + * + * Returns: (transfer none): The DBus path of the #MMObject object. + * + * Since: 1.18 + */ +const gchar * +mm_modem_3gpp_profile_manager_get_path (MMModem3gppProfileManager *self) +{ + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), NULL); + + RETURN_NON_EMPTY_CONSTANT_STRING ( + g_dbus_proxy_get_object_path (G_DBUS_PROXY (self))); +} + +/** + * mm_modem_3gpp_profile_manager_dup_path: + * @self: A #MMModem3gppProfileManager. + * + * Gets a copy of the DBus path of the #MMObject object which implements this + * interface. + * + * Returns: (transfer full): The DBus path of the #MMObject. The returned value + * should be freed with g_free(). + * + * Since: 1.18 + */ +gchar * +mm_modem_3gpp_profile_manager_dup_path (MMModem3gppProfileManager *self) +{ + gchar *value; + + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), NULL); + + g_object_get (G_OBJECT (self), + "g-object-path", &value, + NULL); + RETURN_NON_EMPTY_STRING (value); +} + +/*****************************************************************************/ + +static gboolean +build_list_results (GVariant *dictionaries, + GList **out_profiles, + GError **error) +{ + g_autoptr(GError) saved_error = NULL; + GVariantIter iter; + guint n; + GList *profiles = NULL; + + if (out_profiles) + *out_profiles = NULL; + + if (!dictionaries) + return TRUE; + + /* Parse array of dictionaries */ + g_variant_iter_init (&iter, dictionaries); + n = g_variant_iter_n_children (&iter); + + if (n > 0) { + g_autoptr(GVariant) dictionary = NULL; + + while ((dictionary = g_variant_iter_next_value (&iter))) { + MM3gppProfile *profile = NULL; + g_autoptr(GError) inner_error = NULL; + + profile = mm_3gpp_profile_new_from_dictionary (dictionary, &inner_error); + if (!profile) { + g_warning ("Couldn't create 3GPP profile: %s", inner_error->message); + if (!saved_error) + saved_error = g_steal_pointer (&inner_error); + } else + profiles = g_list_append (profiles, profile); + } + } + + if (saved_error && !profiles) { + g_propagate_error (error, g_steal_pointer (&saved_error)); + return FALSE; + } + + if (out_profiles) + *out_profiles = profiles; + else + g_list_free_full (profiles, g_object_unref); + return TRUE; +} + +/** + * mm_modem_3gpp_profile_manager_list_finish: + * @self: A #MMModem3gppProfileManager. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_modem_3gpp_profile_manager_list(). + * @profiles: (out) (allow-none) (transfer full) (element-type ModemManager.3gppProfile): + * A list of #MM3gppProfile objects available in the device. The returned value + * should be freed with g_list_free_full() using g_object_unref() as + * #GDestroyNotify. + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_3gpp_profile_manager_list(). + * + * Returns: %TRUE if the list was correctly retrieved, %FALSE if @error is set. + * + * Since: 1.18 + */ +gboolean +mm_modem_3gpp_profile_manager_list_finish (MMModem3gppProfileManager *self, + GAsyncResult *res, + GList **profiles, + GError **error) +{ + g_autoptr(GVariant) dictionaries = NULL; + + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), FALSE); + + if (!mm_gdbus_modem3gpp_profile_manager_call_list_finish (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + &dictionaries, + res, + error)) + return FALSE; + + return build_list_results (dictionaries, profiles, error); +} + +/** + * mm_modem_3gpp_profile_manager_list: + * @self: A #MMModem3gppProfileManager. + * @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 gets the list of available connection profiles. + * + * 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_3gpp_profile_manager_list_finish() to get the result of the + * operation. + * + * See mm_modem_3gpp_profile_manager_list_sync() for the synchronous, blocking + * version of this method. + * + * Since: 1.18 + */ +void +mm_modem_3gpp_profile_manager_list (MMModem3gppProfileManager *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self)); + + mm_gdbus_modem3gpp_profile_manager_call_list (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + cancellable, + callback, + user_data); +} + +/** + * mm_modem_3gpp_profile_manager_list_sync: + * @self: A #MMModem3gppProfileManager. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @profiles: (out) (allow-none) (transfer full) (element-type ModemManager.3gppProfile): + * A list of #MM3gppProfile objects available in the device. The returned value + * should be freed with g_list_free_full() using g_object_unref() as + * #GDestroyNotify. + * @error: Return location for error or %NULL. + * + * Synchronously gets the list of available connection profiles. + * + * The calling thread is blocked until a reply is received. See + * mm_modem_3gpp_profile_manager_list() for the asynchronous version of this + * method. + * + * Returns: %TRUE if the list was correctly retrieved, %FALSE if @error is set. + * + * Since: 1.18 + */ +gboolean +mm_modem_3gpp_profile_manager_list_sync (MMModem3gppProfileManager *self, + GCancellable *cancellable, + GList **profiles, + GError **error) +{ + g_autoptr(GVariant) dictionaries = NULL; + + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), FALSE); + + if (!mm_gdbus_modem3gpp_profile_manager_call_list_sync (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + &dictionaries, + cancellable, + error)) + return FALSE; + + return build_list_results (dictionaries, profiles, error); +} + +/*****************************************************************************/ + +/** + * mm_modem_3gpp_profile_manager_set_finish: + * @self: A #MMModem3gppProfileManager. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_modem_3gpp_profile_manager_set(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_3gpp_profile_manager_set(). + * + * Returns: (transfer full): A #MM3gppProfile with the stored settings, or %NULL if @error is set. + * + * Since: 1.18 + */ +MM3gppProfile * +mm_modem_3gpp_profile_manager_set_finish (MMModem3gppProfileManager *self, + GAsyncResult *res, + GError **error) +{ + g_autoptr(GVariant) stored_dictionary = NULL; + + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), NULL); + + if (!mm_gdbus_modem3gpp_profile_manager_call_set_finish (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + &stored_dictionary, + res, + error)) + return NULL; + + return mm_3gpp_profile_new_from_dictionary (stored_dictionary, error); +} + +/** + * mm_modem_3gpp_profile_manager_set: + * @self: A #MMModem3gppProfileManager. + * @requested: A #MM3gppProfile with the requested settings. + * @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 updates a connection profile with the settings + * given in @profile. + * + * If @profile does not have an explicit profile ID set, a new profile will + * be created. + * + * 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_3gpp_profile_manager_set_finish() to get the result of the + * operation. + * + * See mm_modem_3gpp_profile_manager_set_sync() for the synchronous, blocking + * version of this method. + * + * Since: 1.18 + */ +void +mm_modem_3gpp_profile_manager_set (MMModem3gppProfileManager *self, + MM3gppProfile *requested, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GVariant) requested_dictionary = NULL; + + g_return_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self)); + + requested_dictionary = mm_3gpp_profile_get_dictionary (requested); + mm_gdbus_modem3gpp_profile_manager_call_set (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + requested_dictionary, + cancellable, + callback, + user_data); +} + +/** + * mm_modem_3gpp_profile_manager_set_sync: + * @self: A #MMModem3gppProfileManager. + * @requested: A #MM3gppProfile with the requested settings. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously updates a connection profile with the settings + * given in @profile. + * + * If @profile does not have an explicit profile ID set, a new profile will + * be created. + * + * The calling thread is blocked until a reply is received. See + * mm_modem_3gpp_profile_manager_set() for the asynchronous version of this + * method. + * + * Returns: (transfer full): A #MM3gppProfile with the stored settings, or %NULL if @error is set. + * + * Since: 1.18 + */ +MM3gppProfile * +mm_modem_3gpp_profile_manager_set_sync (MMModem3gppProfileManager *self, + MM3gppProfile *requested, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GVariant) requested_dictionary = NULL; + g_autoptr(GVariant) stored_dictionary = NULL; + + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), NULL); + + requested_dictionary = mm_3gpp_profile_get_dictionary (requested); + + if (!mm_gdbus_modem3gpp_profile_manager_call_set_sync (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + requested_dictionary, + &stored_dictionary, + cancellable, + error)) + return NULL; + + return mm_3gpp_profile_new_from_dictionary (stored_dictionary, error); +} + +/*****************************************************************************/ + +/** + * mm_modem_3gpp_profile_manager_delete_finish: + * @self: A #MMModem3gppProfileManager. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_modem_3gpp_profile_manager_delete(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_modem_3gpp_profile_manager_delete(). + * + * Returns: %TRUE if the operation was successful, %FALSE if @error is set. + * + * Since: 1.18 + */ +gboolean +mm_modem_3gpp_profile_manager_delete_finish (MMModem3gppProfileManager *self, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), FALSE); + + return mm_gdbus_modem3gpp_profile_manager_call_delete_finish (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), res, error); +} + +/** + * mm_modem_3gpp_profile_manager_delete: + * @self: A #MMModem3gppProfileManager. + * @profile: A #MM3gppProfile. + * @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 deletes the connection profile. + * + * The @profile should have at least the profile ID set for the delete operation + * to succeed. + * + * 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_3gpp_profile_manager_delete_finish() to get the result of the + * operation. + * + * See mm_modem_3gpp_profile_manager_delete_sync() for the synchronous, blocking + * version of this method. + * + * Since: 1.18 + */ +void +mm_modem_3gpp_profile_manager_delete (MMModem3gppProfileManager *self, + MM3gppProfile *profile, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GVariant) profile_dictionary = NULL; + + g_return_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self)); + + profile_dictionary = mm_3gpp_profile_get_dictionary (profile); + mm_gdbus_modem3gpp_profile_manager_call_delete (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + profile_dictionary, + cancellable, + callback, + user_data); +} + +/** + * mm_modem_3gpp_profile_manager_delete_sync: + * @self: A #MMModem3gppProfileManager. + * @profile: A #MM3gppProfile. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously deletes the connection profile. + * + * The @profile should have at least the profile ID set for the delete operation + * to succeed. + * + * The calling thread is blocked until a reply is received. See + * mm_modem_3gpp_profile_manager_delete() for the asynchronous version of this + * method. + * + * Returns: %TRUE if the operation was successful, %FALSE if @error is set. + * + * Since: 1.18 + */ +gboolean +mm_modem_3gpp_profile_manager_delete_sync (MMModem3gppProfileManager *self, + MM3gppProfile *profile, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GVariant) profile_dictionary = NULL; + + g_return_val_if_fail (MM_IS_MODEM_3GPP_PROFILE_MANAGER (self), FALSE); + + profile_dictionary = mm_3gpp_profile_get_dictionary (profile); + return mm_gdbus_modem3gpp_profile_manager_call_delete_sync (MM_GDBUS_MODEM3GPP_PROFILE_MANAGER (self), + profile_dictionary, + cancellable, + error); +} + +/*****************************************************************************/ + +static void +mm_modem_3gpp_profile_manager_init (MMModem3gppProfileManager *self) +{ +} + +static void +mm_modem_3gpp_profile_manager_class_init (MMModem3gppProfileManagerClass *modem_class) +{ +} diff --git a/libmm-glib/mm-modem-3gpp-profile-manager.h b/libmm-glib/mm-modem-3gpp-profile-manager.h new file mode 100644 index 00000000..ebfd6cc1 --- /dev/null +++ b/libmm-glib/mm-modem-3gpp-profile-manager.h @@ -0,0 +1,112 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * libmm -- Access modem status & information from glib applications + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * Copyright (C) 2021 Aleksander Morgado <aleksander@aleksander.es> + * Copyright (C) 2021 Google, Inc. + */ + +#ifndef _MM_MODEM_3GPP_PROFILE_MANAGER_H_ +#define _MM_MODEM_3GPP_PROFILE_MANAGER_H_ + +#if !defined (__LIBMM_GLIB_H_INSIDE__) && !defined (LIBMM_GLIB_COMPILATION) +#error "Only <libmm-glib.h> can be included directly." +#endif + +#include <ModemManager.h> + +#include "mm-3gpp-profile.h" +#include "mm-gdbus-modem.h" + +G_BEGIN_DECLS + +#define MM_TYPE_MODEM_3GPP_PROFILE_MANAGER (mm_modem_3gpp_profile_manager_get_type ()) +#define MM_MODEM_3GPP_PROFILE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_MODEM_3GPP_PROFILE_MANAGER, MMModem3gppProfileManager)) +#define MM_MODEM_3GPP_PROFILE_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MM_TYPE_MODEM_3GPP_PROFILE_MANAGER, MMModem3gppProfileManagerClass)) +#define MM_IS_MODEM_3GPP_PROFILE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_MODEM_3GPP_PROFILE_MANAGER)) +#define MM_IS_MODEM_3GPP_PROFILE_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), MM_TYPE_MODEM_3GPP_PROFILE_MANAGER)) +#define MM_MODEM_3GPP_PROFILE_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_MODEM_3GPP_PROFILE_MANAGER, MMModem3gppProfileManagerClass)) + +typedef struct _MMModem3gppProfileManager MMModem3gppProfileManager; +typedef struct _MMModem3gppProfileManagerClass MMModem3gppProfileManagerClass; + +/** + * MMModem3gppProfileManager: + * + * The #MMModem3gppProfileManager structure contains private data and should only be accessed + * using the provided API. + */ +struct _MMModem3gppProfileManager { + /*< private >*/ + MmGdbusModem3gppProfileManagerProxy parent; + gpointer unused; +}; + +struct _MMModem3gppProfileManagerClass { + /*< private >*/ + MmGdbusModem3gppProfileManagerProxyClass parent; +}; + +GType mm_modem_3gpp_profile_manager_get_type (void); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMModem3gppProfileManager, g_object_unref) + +const gchar *mm_modem_3gpp_profile_manager_get_path (MMModem3gppProfileManager *self); +gchar *mm_modem_3gpp_profile_manager_dup_path (MMModem3gppProfileManager *self); + +void mm_modem_3gpp_profile_manager_list (MMModem3gppProfileManager *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_modem_3gpp_profile_manager_list_finish (MMModem3gppProfileManager *self, + GAsyncResult *res, + GList **profiles, + GError **error); +gboolean mm_modem_3gpp_profile_manager_list_sync (MMModem3gppProfileManager *self, + GCancellable *cancellable, + GList **profiles, + GError **error); + +void mm_modem_3gpp_profile_manager_set (MMModem3gppProfileManager *self, + MM3gppProfile *requested, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +MM3gppProfile *mm_modem_3gpp_profile_manager_set_finish (MMModem3gppProfileManager *self, + GAsyncResult *res, + GError **error); +MM3gppProfile *mm_modem_3gpp_profile_manager_set_sync (MMModem3gppProfileManager *self, + MM3gppProfile *requested, + GCancellable *cancellable, + GError **error); + +void mm_modem_3gpp_profile_manager_delete (MMModem3gppProfileManager *self, + MM3gppProfile *profile, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_modem_3gpp_profile_manager_delete_finish (MMModem3gppProfileManager *self, + GAsyncResult *res, + GError **error); +gboolean mm_modem_3gpp_profile_manager_delete_sync (MMModem3gppProfileManager *self, + MM3gppProfile *profile, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* _MM_MODEM_3GPP_PROFILE_MANAGER_H_ */ diff --git a/libmm-glib/mm-object.c b/libmm-glib/mm-object.c index 8041c50d..de446942 100644 --- a/libmm-glib/mm-object.c +++ b/libmm-glib/mm-object.c @@ -184,6 +184,52 @@ mm_object_peek_modem_3gpp (MMObject *self) /*****************************************************************************/ /** + * mm_object_get_modem_3gpp_profile_manager: + * @self: A #MMObject. + * + * Gets the #MMModem3gppProfileManager instance for the D-Bus interface + * org.freedesktop.ModemManager1.Modem.Modem3gpp-ProfileManager on @self, if any. + * + * Returns: (transfer full): A #MMModem3gppProfileManager that must be freed with + * g_object_unref() or %NULL if @self does not implement the interface. + * + * Since: 1.18 + */ +MMModem3gppProfileManager * +mm_object_get_modem_3gpp_profile_manager (MMObject *self) +{ + g_return_val_if_fail (MM_IS_OBJECT (MM_GDBUS_OBJECT (self)), NULL); + + return (MMModem3gppProfileManager *)mm_gdbus_object_get_modem3gpp_profile_manager (MM_GDBUS_OBJECT (self)); +} + +/** + * mm_object_peek_modem_3gpp_profile_manager: (skip) + * @self: A #MMObject. + * + * Like mm_object_get_modem_3gpp_profile_manager() but doesn't increase the reference count + * on the returned object. + * + * <warning>It is not safe to use the returned object if you are on another + * thread than the one where the #MMManager is running.</warning> + * + * Returns: (transfer none): A #MMModem3gppProfileManager or %NULL if @self does not + * implement the interface. Do not free the returned object, it is owned by + * @self. + * + * Since: 1.18 + */ +MMModem3gppProfileManager * +mm_object_peek_modem_3gpp_profile_manager (MMObject *self) +{ + g_return_val_if_fail (MM_IS_OBJECT (MM_GDBUS_OBJECT (self)), NULL); + + return (MMModem3gppProfileManager *)mm_gdbus_object_peek_modem3gpp_profile_manager (MM_GDBUS_OBJECT (self)); +} + +/*****************************************************************************/ + +/** * mm_object_get_modem_3gpp_ussd: * @self: A #MMObject. * diff --git a/libmm-glib/mm-object.h b/libmm-glib/mm-object.h index 92f43c75..817c6f32 100644 --- a/libmm-glib/mm-object.h +++ b/libmm-glib/mm-object.h @@ -33,6 +33,7 @@ #include "mm-gdbus-modem.h" #include "mm-modem.h" #include "mm-modem-3gpp.h" +#include "mm-modem-3gpp-profile-manager.h" #include "mm-modem-3gpp-ussd.h" #include "mm-modem-cdma.h" #include "mm-modem-simple.h" @@ -79,31 +80,33 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMObject, g_object_unref) const gchar *mm_object_get_path (MMObject *self); gchar *mm_object_dup_path (MMObject *self); -MMModem *mm_object_get_modem (MMObject *self); -MMModem3gpp *mm_object_get_modem_3gpp (MMObject *self); -MMModem3gppUssd *mm_object_get_modem_3gpp_ussd (MMObject *self); -MMModemCdma *mm_object_get_modem_cdma (MMObject *self); -MMModemSimple *mm_object_get_modem_simple (MMObject *self); -MMModemLocation *mm_object_get_modem_location (MMObject *self); -MMModemMessaging *mm_object_get_modem_messaging (MMObject *self); -MMModemVoice *mm_object_get_modem_voice (MMObject *self); -MMModemTime *mm_object_get_modem_time (MMObject *self); -MMModemFirmware *mm_object_get_modem_firmware (MMObject *self); -MMModemSignal *mm_object_get_modem_signal (MMObject *self); -MMModemOma *mm_object_get_modem_oma (MMObject *self); +MMModem *mm_object_get_modem (MMObject *self); +MMModem3gpp *mm_object_get_modem_3gpp (MMObject *self); +MMModem3gppProfileManager *mm_object_get_modem_3gpp_profile_manager (MMObject *self); +MMModem3gppUssd *mm_object_get_modem_3gpp_ussd (MMObject *self); +MMModemCdma *mm_object_get_modem_cdma (MMObject *self); +MMModemSimple *mm_object_get_modem_simple (MMObject *self); +MMModemLocation *mm_object_get_modem_location (MMObject *self); +MMModemMessaging *mm_object_get_modem_messaging (MMObject *self); +MMModemVoice *mm_object_get_modem_voice (MMObject *self); +MMModemTime *mm_object_get_modem_time (MMObject *self); +MMModemFirmware *mm_object_get_modem_firmware (MMObject *self); +MMModemSignal *mm_object_get_modem_signal (MMObject *self); +MMModemOma *mm_object_get_modem_oma (MMObject *self); -MMModem *mm_object_peek_modem (MMObject *self); -MMModem3gpp *mm_object_peek_modem_3gpp (MMObject *self); -MMModem3gppUssd *mm_object_peek_modem_3gpp_ussd (MMObject *self); -MMModemCdma *mm_object_peek_modem_cdma (MMObject *self); -MMModemSimple *mm_object_peek_modem_simple (MMObject *self); -MMModemLocation *mm_object_peek_modem_location (MMObject *self); -MMModemMessaging *mm_object_peek_modem_messaging (MMObject *self); -MMModemVoice *mm_object_peek_modem_voice (MMObject *self); -MMModemTime *mm_object_peek_modem_time (MMObject *self); -MMModemFirmware *mm_object_peek_modem_firmware (MMObject *self); -MMModemSignal *mm_object_peek_modem_signal (MMObject *self); -MMModemOma *mm_object_peek_modem_oma (MMObject *self); +MMModem *mm_object_peek_modem (MMObject *self); +MMModem3gpp *mm_object_peek_modem_3gpp (MMObject *self); +MMModem3gppProfileManager *mm_object_peek_modem_3gpp_profile_manager (MMObject *self); +MMModem3gppUssd *mm_object_peek_modem_3gpp_ussd (MMObject *self); +MMModemCdma *mm_object_peek_modem_cdma (MMObject *self); +MMModemSimple *mm_object_peek_modem_simple (MMObject *self); +MMModemLocation *mm_object_peek_modem_location (MMObject *self); +MMModemMessaging *mm_object_peek_modem_messaging (MMObject *self); +MMModemVoice *mm_object_peek_modem_voice (MMObject *self); +MMModemTime *mm_object_peek_modem_time (MMObject *self); +MMModemFirmware *mm_object_peek_modem_firmware (MMObject *self); +MMModemSignal *mm_object_peek_modem_signal (MMObject *self); +MMModemOma *mm_object_peek_modem_oma (MMObject *self); G_END_DECLS |