]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-account-settings.c
account-settings: allow to change the service
[empathy.git] / libempathy / empathy-account-settings.c
index cd6b69e8c2a3b9b8da34f1c68a59c9741a9e7e56..cf269bdc84e997168a8fec4c287a54e4b283763a 100644 (file)
@@ -103,6 +103,8 @@ struct _EmpathyAccountSettingsPriv
   /* If TRUE, the account should have 'tel' in its
    * Account.Interface.Addressing.URISchemes property. */
   gboolean uri_scheme_tel;
+  /* If TRUE, Service property needs to be updated when applying changes */
+  gboolean update_service;
 
   GSimpleAsyncResult *apply_result;
 };
@@ -402,11 +404,11 @@ empathy_account_settings_finalize (GObject *object)
       g_list_free (priv->required_params);
     }
 
-  g_hash_table_destroy (priv->parameters);
-  g_hash_table_destroy (priv->param_regexps);
+  g_hash_table_unref (priv->parameters);
+  g_hash_table_unref (priv->param_regexps);
 
   empathy_account_settings_free_unset_parameters (self);
-  g_array_free (priv->unset_parameters, TRUE);
+  g_array_unref (priv->unset_parameters);
 
   G_OBJECT_CLASS (empathy_account_settings_parent_class)->finalize (object);
 }
@@ -743,6 +745,21 @@ empathy_account_settings_get_service (EmpathyAccountSettings *settings)
   return priv->service;
 }
 
+void
+empathy_account_settings_set_service (EmpathyAccountSettings *settings,
+    const gchar *service)
+{
+  EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
+
+  if (!tp_strdiff (priv->service, service))
+    return;
+
+  g_free (priv->service);
+  priv->service = g_strdup (service);
+  g_object_notify (G_OBJECT (settings), "service");
+  priv->update_service = TRUE;
+}
+
 gchar *
 empathy_account_settings_get_icon_name (EmpathyAccountSettings *settings)
 {
@@ -1445,6 +1462,32 @@ update_account_uri_schemes (EmpathyAccountSettings *self)
       priv->uri_scheme_tel, NULL, NULL);
 }
 
+static void
+set_service_cb (GObject *source,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  GError *error = NULL;
+
+  if (!tp_account_set_service_finish (TP_ACCOUNT (source), result, &error))
+    {
+      DEBUG ("Failed to set Account.Service: %s", error->message);
+      g_error_free (error);
+    }
+}
+
+static void
+update_account_service (EmpathyAccountSettings *self)
+{
+  EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
+
+  if (!priv->update_service)
+    return;
+
+  tp_account_set_service_async (priv->account,
+      priv->service != NULL ? priv->service : "", set_service_cb, self);
+}
+
 static void
 empathy_account_settings_account_updated (GObject *source,
     GAsyncResult *result,
@@ -1486,6 +1529,7 @@ empathy_account_settings_account_updated (GObject *source,
     }
 
   update_account_uri_schemes (settings);
+  update_account_service (settings);
 
   g_simple_async_result_set_op_res_gboolean (priv->apply_result,
       g_strv_length (reconnect_required) > 0);