--- a/libpurple/purplecredentialmanager.c Tue Dec 22 00:19:36 2020 -0600
+++ b/libpurple/purplecredentialmanager.c Tue Dec 22 00:23:48 2020 -0600
@@ -28,6 +28,7 @@
SIG_PROVIDER_UNREGISTERED,
+ SIG_ACTIVE_PROVIDER_CHANGED, static guint signals[N_SIGNALS] = {0, };
@@ -186,6 +187,8 @@
* @provider: The #PurpleCredentialProvider that was registered.
* Emitted after @provider has been registered in @manager.
signals[SIG_PROVIDER_REGISTERED] = g_signal_new(
@@ -205,6 +208,8 @@
* @provider: The #PurpleCredentialProvider that was unregistered.
* Emitted after @provider has been unregistered from @manager.
signals[SIG_PROVIDER_UNREGISTERED] = g_signal_new(
@@ -217,6 +222,29 @@
PURPLE_TYPE_CREDENTIAL_PROVIDER);
+ * PurpleCredentialManager::active-provider-changed: + * @manager: The #PurpleCredentialManager instance. + * @old: The #PurpleCredentialProvider that was previously active. + * @current: The #PurpleCredenetialProvider that is now currently active. + * Emitted after @provider has become the active provider for @manager. + signals[SIG_ACTIVE_PROVIDER_CHANGED] = g_signal_new( + "active-provider-changed", + G_OBJECT_CLASS_TYPE(klass), + G_STRUCT_OFFSET(PurpleCredentialManagerClass, active_provider_changed), + PURPLE_TYPE_CREDENTIAL_PROVIDER, + PURPLE_TYPE_CREDENTIAL_PROVIDER); /******************************************************************************
@@ -316,28 +344,33 @@
const gchar *id, GError **error)
PurpleCredentialManagerPrivate *priv = NULL;
- PurpleCredentialProvider *provider = NULL;
+ PurpleCredentialProvider *old = NULL, *provider = NULL; g_return_val_if_fail(PURPLE_IS_CREDENTIAL_MANAGER(manager), FALSE);
priv = purple_credential_manager_get_instance_private(manager);
- /* Unset the active provider if the id is NULL. */
- g_clear_object(&priv->active_provider);
+ /* First look up the new provider if we're given one. */ + provider = g_hash_table_lookup(priv->providers, id); + if(!PURPLE_IS_CREDENTIAL_PROVIDER(provider)) { + g_set_error(error, PURPLE_CREDENTIAL_MANAGER_DOMAIN, 0, + "no credential provider found with id %s", id);
- provider = g_hash_table_lookup(priv->providers, id);
- if(!PURPLE_IS_CREDENTIAL_PROVIDER(provider)) {
- g_set_error(error, PURPLE_CREDENTIAL_MANAGER_DOMAIN, 0,
- "no credential provider found with id %s", id);
+ if(PURPLE_IS_CREDENTIAL_PROVIDER(priv->active_provider)) { + old = PURPLE_CREDENTIAL_PROVIDER(g_object_ref(priv->active_provider)); - g_set_object(&priv->active_provider, provider);
+ if(g_set_object(&priv->active_provider, provider)) { + g_signal_emit(G_OBJECT(manager), signals[SIG_ACTIVE_PROVIDER_CHANGED], + 0, old, priv->active_provider); --- a/libpurple/purplecredentialmanager.h Tue Dec 22 00:19:36 2020 -0600
+++ b/libpurple/purplecredentialmanager.h Tue Dec 22 00:23:48 2020 -0600
@@ -92,6 +92,7 @@
void (*provider_registered)(PurpleCredentialManager *manager, PurpleCredentialProvider *provider);
void (*provider_unregistered)(PurpleCredentialManager *manager, PurpleCredentialProvider *provider);
+ void (*active_provider_changed)(PurpleCredentialManager *manager, PurpleCredentialProvider *old, PurpleCredentialProvider *current);