]> 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 4005d279031cde9aa1ec41ebde6f3f886ec89281..cf269bdc84e997168a8fec4c287a54e4b283763a 100644 (file)
@@ -100,6 +100,12 @@ struct _EmpathyAccountSettingsPriv
   gulong managers_ready_id;
   gboolean preparing_protocol;
 
+  /* 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;
 };
 
@@ -243,6 +249,7 @@ empathy_account_settings_constructed (GObject *object)
       GQuark features[] = {
           TP_ACCOUNT_FEATURE_CORE,
           TP_ACCOUNT_FEATURE_STORAGE,
+          TP_ACCOUNT_FEATURE_ADDRESSING,
           0 };
 
       if (priv->account != NULL)
@@ -331,7 +338,7 @@ empathy_account_settings_class_init (
       g_signal_new ("password-retrieved",
           G_TYPE_FROM_CLASS (empathy_account_settings_class),
           G_SIGNAL_RUN_LAST, 0, NULL, NULL,
-          g_cclosure_marshal_VOID__VOID,
+          g_cclosure_marshal_generic,
           G_TYPE_NONE, 0);
 }
 
@@ -397,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);
 }
@@ -561,6 +568,8 @@ empathy_account_settings_check_readyness (EmpathyAccountSettings *self)
       g_free (priv->icon_name);
       priv->icon_name =
         g_strdup (tp_account_get_icon_name (priv->account));
+
+      priv->uri_scheme_tel = empathy_account_has_uri_scheme_tel (priv->account);
     }
 
   tp_protocol = tp_connection_manager_get_protocol (priv->manager,
@@ -736,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)
 {
@@ -919,6 +943,11 @@ empathy_account_settings_discard_changes (EmpathyAccountSettings *settings)
   priv->password_changed = FALSE;
   g_free (priv->password);
   priv->password = g_strdup (priv->password_original);
+
+  if (priv->account != NULL)
+    priv->uri_scheme_tel = empathy_account_has_uri_scheme_tel (priv->account);
+  else
+    priv->uri_scheme_tel = FALSE;
 }
 
 const gchar *
@@ -1420,6 +1449,45 @@ empathy_account_settings_delete_password_cb (GObject *source,
       empathy_keyring_delete_account_password_finish);
 }
 
+static void
+update_account_uri_schemes (EmpathyAccountSettings *self)
+{
+  EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
+
+  if (priv->uri_scheme_tel == empathy_account_has_uri_scheme_tel (
+        priv->account))
+    return;
+
+  tp_account_set_uri_scheme_association_async (priv->account, "tel",
+      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,
@@ -1460,6 +1528,9 @@ empathy_account_settings_account_updated (GObject *source,
       return;
     }
 
+  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);
 
@@ -1508,6 +1579,8 @@ empathy_account_settings_created_cb (GObject *source,
           return;
         }
 
+      update_account_uri_schemes (settings);
+
       empathy_account_settings_discard_changes (settings);
     }
 
@@ -1588,7 +1661,7 @@ empathy_account_settings_manager_ready_cb (GObject *source_object,
   TpAccountManager *account_manager = TP_ACCOUNT_MANAGER (source_object);
   GError *error = NULL;
 
-  if (!tp_account_manager_prepare_finish (account_manager, result, &error))
+  if (!tp_proxy_prepare_finish (account_manager, result, &error))
     {
       DEBUG ("Failed to prepare account manager: %s", error->message);
       g_error_free (error);
@@ -1623,7 +1696,7 @@ empathy_account_settings_apply_async (EmpathyAccountSettings *settings,
 
   if (priv->account == NULL)
     {
-      tp_account_manager_prepare_async (priv->account_manager, NULL,
+      tp_proxy_prepare_async (priv->account_manager, NULL,
           empathy_account_settings_manager_ready_cb, settings);
     }
   else
@@ -1785,3 +1858,30 @@ empathy_account_settings_supports_sasl (EmpathyAccountSettings *self)
 
   return priv->supports_sasl;
 }
+
+gboolean
+empathy_account_settings_param_is_supported (EmpathyAccountSettings *self,
+    const gchar *param)
+{
+  EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
+
+  return tp_protocol_has_param (priv->protocol_obj, param);
+}
+
+void
+empathy_account_settings_set_uri_scheme_tel (EmpathyAccountSettings *self,
+    gboolean associate)
+{
+  EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
+
+  priv->uri_scheme_tel = associate;
+}
+
+gboolean
+empathy_account_settings_has_uri_scheme_tel (
+    EmpathyAccountSettings *self)
+{
+  EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
+
+  return priv->uri_scheme_tel;
+}