2 * empathy-account-settings.c - Source for EmpathyAccountSettings
3 * Copyright (C) 2009 Collabora Ltd.
4 * @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 #include <telepathy-glib/util.h>
26 #include <telepathy-glib/interfaces.h>
27 #include <telepathy-glib/gtypes.h>
29 #include "empathy-account-settings.h"
30 #include "empathy-account-manager.h"
31 #include "empathy-connection-managers.h"
32 #include "empathy-utils.h"
34 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT
35 #include <libempathy/empathy-debug.h>
37 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyAccountSettings)
39 G_DEFINE_TYPE(EmpathyAccountSettings, empathy_account_settings, G_TYPE_OBJECT)
46 PROP_DISPLAY_NAME_OVERRIDDEN,
50 /* private structure */
51 typedef struct _EmpathyAccountSettingsPriv EmpathyAccountSettingsPriv;
53 struct _EmpathyAccountSettingsPriv
55 gboolean dispose_has_run;
56 EmpathyConnectionManagers *managers;
57 EmpathyAccountManager *account_manager;
58 gulong account_manager_ready_id;
60 TpConnectionManager *manager;
62 EmpathyAccount *account;
67 gboolean display_name_overridden;
70 GHashTable *parameters;
71 GArray *unset_parameters;
72 GArray *required_params;
74 gulong managers_ready_id;
75 gulong account_ready_id;
77 GSimpleAsyncResult *apply_result;
81 empathy_account_settings_init (EmpathyAccountSettings *obj)
83 EmpathyAccountSettingsPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE ((obj),
84 EMPATHY_TYPE_ACCOUNT_SETTINGS, EmpathyAccountSettingsPriv);
88 /* allocate any data required by the object here */
89 priv->managers = empathy_connection_managers_dup_singleton ();
90 priv->account_manager = empathy_account_manager_dup_singleton ();
92 priv->parameters = g_hash_table_new_full (g_str_hash, g_str_equal,
93 g_free, (GDestroyNotify) tp_g_value_slice_free);
95 priv->unset_parameters = g_array_new (TRUE, FALSE, sizeof (gchar *));
98 static void empathy_account_settings_dispose (GObject *object);
99 static void empathy_account_settings_finalize (GObject *object);
100 static void empathy_account_settings_ready_cb (GObject *obj,
101 GParamSpec *spec, gpointer user_data);
102 static void empathy_account_settings_check_readyness (
103 EmpathyAccountSettings *self);
106 empathy_account_settings_set_property (GObject *object,
111 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (object);
112 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
117 priv->account = g_value_dup_object (value);
120 priv->cm_name = g_value_dup_string (value);
123 priv->protocol = g_value_dup_string (value);
125 case PROP_DISPLAY_NAME:
126 priv->display_name = g_value_dup_string (value);
128 case PROP_DISPLAY_NAME_OVERRIDDEN:
129 priv->display_name_overridden = g_value_get_boolean (value);
132 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
138 empathy_account_settings_get_property (GObject *object,
143 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (object);
144 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
149 g_value_set_object (value, priv->account);
152 g_value_set_string (value, priv->cm_name);
155 g_value_set_string (value, priv->protocol);
157 case PROP_DISPLAY_NAME:
158 g_value_set_string (value, priv->display_name);
160 case PROP_DISPLAY_NAME_OVERRIDDEN:
161 g_value_set_boolean (value, priv->display_name_overridden);
164 g_value_set_boolean (value, priv->ready);
167 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
173 empathy_account_settings_constructed (GObject *object)
175 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
176 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
178 if (priv->account != NULL)
180 g_free (priv->cm_name);
181 g_free (priv->protocol);
184 g_strdup (empathy_account_get_connection_manager (priv->account));
186 g_strdup (empathy_account_get_protocol (priv->account));
187 priv->icon_name = g_strdup
188 (empathy_account_get_icon_name (priv->account));
192 priv->icon_name = empathy_protocol_icon_name (priv->protocol);
195 g_assert (priv->cm_name != NULL && priv->protocol != NULL);
197 empathy_account_settings_check_readyness (self);
201 g_signal_connect (priv->account, "notify::ready",
202 G_CALLBACK (empathy_account_settings_ready_cb), self);
203 g_signal_connect (priv->managers, "notify::ready",
204 G_CALLBACK (empathy_account_settings_ready_cb), self);
208 empathy_account_settings_parent_class)->constructed != NULL)
210 empathy_account_settings_parent_class)->constructed (object);
215 empathy_account_settings_class_init (
216 EmpathyAccountSettingsClass *empathy_account_settings_class)
218 GObjectClass *object_class = G_OBJECT_CLASS (empathy_account_settings_class);
220 g_type_class_add_private (empathy_account_settings_class, sizeof
221 (EmpathyAccountSettingsPriv));
223 object_class->dispose = empathy_account_settings_dispose;
224 object_class->finalize = empathy_account_settings_finalize;
225 object_class->set_property = empathy_account_settings_set_property;
226 object_class->get_property = empathy_account_settings_get_property;
227 object_class->constructed = empathy_account_settings_constructed;
229 g_object_class_install_property (object_class, PROP_ACCOUNT,
230 g_param_spec_object ("account",
232 "The EmpathyAccount backing these settings",
233 EMPATHY_TYPE_ACCOUNT,
234 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
236 g_object_class_install_property (object_class, PROP_CM_NAME,
237 g_param_spec_string ("connection-manager",
238 "connection-manager",
239 "The name of the connection manager this account uses",
241 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
243 g_object_class_install_property (object_class, PROP_PROTOCOL,
244 g_param_spec_string ("protocol",
246 "The name of the protocol this account uses",
248 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
250 g_object_class_install_property (object_class, PROP_DISPLAY_NAME,
251 g_param_spec_string ("display-name",
253 "The display name account these settings belong to",
255 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
257 g_object_class_install_property (object_class, PROP_DISPLAY_NAME_OVERRIDDEN,
258 g_param_spec_boolean ("display-name-overridden",
259 "display-name-overridden",
260 "Whether the display name for this account has been manually "
263 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
265 g_object_class_install_property (object_class, PROP_READY,
266 g_param_spec_boolean ("ready",
268 "Whether this account is ready to be used",
270 G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
274 empathy_account_settings_dispose (GObject *object)
276 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
277 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
279 if (priv->dispose_has_run)
282 priv->dispose_has_run = TRUE;
284 if (priv->managers_ready_id != 0)
285 g_signal_handler_disconnect (priv->managers, priv->managers_ready_id);
286 priv->managers_ready_id = 0;
288 if (priv->managers != NULL)
289 g_object_unref (priv->managers);
290 priv->managers = NULL;
292 if (priv->manager != NULL)
293 g_object_unref (priv->manager);
294 priv->manager = NULL;
296 if (priv->account_manager_ready_id != 0)
297 g_signal_handler_disconnect (priv->account_manager,
298 priv->account_manager_ready_id);
299 priv->account_manager_ready_id = 0;
301 if (priv->account_manager != NULL)
302 g_object_unref (priv->account_manager);
303 priv->account_manager = NULL;
305 if (priv->account_ready_id != 0)
306 g_signal_handler_disconnect (priv->account, priv->account_ready_id);
307 priv->account_ready_id = 0;
309 if (priv->account != NULL)
310 g_object_unref (priv->account);
311 priv->account = NULL;
313 /* release any references held by the object here */
314 if (G_OBJECT_CLASS (empathy_account_settings_parent_class)->dispose)
315 G_OBJECT_CLASS (empathy_account_settings_parent_class)->dispose (object);
319 empathy_account_settings_free_unset_parameters (
320 EmpathyAccountSettings *settings)
322 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
325 for (i = 0 ; i < priv->unset_parameters->len; i++)
326 g_free (g_array_index (priv->unset_parameters, gchar *, i));
328 g_array_set_size (priv->unset_parameters, 0);
332 empathy_account_settings_finalize (GObject *object)
334 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
335 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
337 /* free any data held directly by the object here */
338 g_free (priv->cm_name);
339 g_free (priv->protocol);
340 g_free (priv->display_name);
341 g_free (priv->icon_name);
343 if (priv->required_params != NULL)
344 g_array_free (priv->required_params, TRUE);
346 g_hash_table_destroy (priv->parameters);
348 empathy_account_settings_free_unset_parameters (self);
349 g_array_free (priv->unset_parameters, TRUE);
351 G_OBJECT_CLASS (empathy_account_settings_parent_class)->finalize (object);
355 empathy_account_settings_check_readyness (EmpathyAccountSettings *self)
357 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
358 const TpConnectionManagerProtocol *tp_protocol;
363 if (priv->account != NULL && !empathy_account_is_ready (priv->account))
366 if (!empathy_connection_managers_is_ready (priv->managers))
369 priv->manager = empathy_connection_managers_get_cm (
370 priv->managers, priv->cm_name);
372 if (priv->manager == NULL)
375 if (priv->account != NULL)
377 g_free (priv->display_name);
379 g_strdup (empathy_account_get_display_name (priv->account));
381 g_free (priv->icon_name);
383 g_strdup (empathy_account_get_icon_name (priv->account));
386 tp_protocol = tp_connection_manager_get_protocol (priv->manager,
389 if (tp_protocol == NULL)
391 priv->manager = NULL;
395 if (priv->required_params == NULL)
397 TpConnectionManagerParam *cur;
400 priv->required_params = g_array_new (TRUE, FALSE, sizeof (gchar *));
402 for (cur = tp_protocol->params; cur->name != NULL; cur++)
404 if (tp_connection_manager_param_is_required (cur))
406 val = g_strdup (cur->name);
407 g_array_append_val (priv->required_params, val);
412 g_object_ref (priv->manager);
415 g_object_notify (G_OBJECT (self), "ready");
419 empathy_account_settings_ready_cb (GObject *obj,
423 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
425 empathy_account_settings_check_readyness (settings);
428 EmpathyAccountSettings *
429 empathy_account_settings_new (const gchar *connection_manager,
430 const gchar *protocol,
431 const char *display_name)
433 return g_object_new (EMPATHY_TYPE_ACCOUNT_SETTINGS,
434 "connection-manager", connection_manager,
435 "protocol", protocol,
436 "display-name", display_name,
440 EmpathyAccountSettings *
441 empathy_account_settings_new_for_account (EmpathyAccount *account)
443 return g_object_new (EMPATHY_TYPE_ACCOUNT_SETTINGS,
448 TpConnectionManagerParam *
449 empathy_account_settings_get_tp_params (EmpathyAccountSettings *settings)
451 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
452 const TpConnectionManagerProtocol *tp_protocol;
454 g_return_val_if_fail (priv->manager != NULL, NULL);
455 g_return_val_if_fail (priv->protocol != NULL, NULL);
457 tp_protocol = tp_connection_manager_get_protocol (priv->manager,
459 if (tp_protocol == NULL)
461 DEBUG ("Can't retrieve TpConnectionManagerProtocol for protocol '%s'",
466 return tp_protocol->params;
470 empathy_account_settings_is_ready (EmpathyAccountSettings *settings)
472 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
478 empathy_account_settings_get_cm (EmpathyAccountSettings *settings)
480 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
482 return priv->cm_name;
486 empathy_account_settings_get_protocol (EmpathyAccountSettings *settings)
488 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
490 return priv->protocol;
494 empathy_account_settings_get_icon_name (EmpathyAccountSettings *settings)
496 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
498 return priv->icon_name;
502 empathy_account_settings_get_display_name (EmpathyAccountSettings *settings)
504 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
506 return priv->display_name;
510 empathy_account_settings_get_account (EmpathyAccountSettings *settings)
512 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
514 return priv->account;
518 empathy_account_settings_is_unset (EmpathyAccountSettings *settings,
521 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
525 a = priv->unset_parameters;
527 for (i = 0; i < a->len; i++)
529 if (!tp_strdiff (g_array_index (a, gchar *, i), param))
536 static TpConnectionManagerParam *
537 empathy_account_settings_get_tp_param (EmpathyAccountSettings *settings,
540 TpConnectionManagerParam *tp_params =
541 empathy_account_settings_get_tp_params (settings);
542 TpConnectionManagerParam *p;
544 for (p = tp_params; p != NULL && p->name != NULL; p++)
546 if (tp_strdiff (p->name, param))
556 account_settings_remove_from_unset (EmpathyAccountSettings *settings,
559 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
563 for (idx = 0; idx < priv->unset_parameters->len; idx++)
565 val = g_array_index (priv->unset_parameters, gchar *, idx);
567 if (!tp_strdiff (val, param))
569 priv->unset_parameters =
570 g_array_remove_index (priv->unset_parameters, idx);
579 empathy_account_settings_get_default (EmpathyAccountSettings *settings,
582 TpConnectionManagerParam *p;
584 p = empathy_account_settings_get_tp_param (settings, param);
586 if (p == NULL || !(p->flags & TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT))
589 return &(p->default_value);
593 empathy_account_settings_get_dbus_signature (EmpathyAccountSettings *settings,
596 TpConnectionManagerParam *p;
598 p = empathy_account_settings_get_tp_param (settings, param);
603 return p->dbus_signature;
607 empathy_account_settings_get (EmpathyAccountSettings *settings,
610 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
611 const GValue *result = NULL;
613 /* Lookup the update parameters we set */
614 result = tp_asv_lookup (priv->parameters, param);
618 /* If the parameters isn't unset use the accounts setting if any */
619 if (priv->account != NULL
620 && !empathy_account_settings_is_unset (settings, param))
622 const GHashTable *parameters;
624 parameters = empathy_account_get_parameters (priv->account);
625 result = tp_asv_lookup (parameters, param);
631 /* fallback to the default */
632 return empathy_account_settings_get_default (settings, param);
636 empathy_account_settings_unset (EmpathyAccountSettings *settings,
639 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
641 if (empathy_account_settings_is_unset (settings, param))
644 v = g_strdup (param);
646 g_array_append_val (priv->unset_parameters, v);
647 g_hash_table_remove (priv->parameters, param);
651 empathy_account_settings_discard_changes (EmpathyAccountSettings *settings)
653 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
655 g_hash_table_remove_all (priv->parameters);
656 empathy_account_settings_free_unset_parameters (settings);
660 empathy_account_settings_get_string (EmpathyAccountSettings *settings,
665 v = empathy_account_settings_get (settings, param);
667 if (v == NULL || !G_VALUE_HOLDS_STRING (v))
670 return g_value_get_string (v);
674 empathy_account_settings_get_int32 (EmpathyAccountSettings *settings,
680 v = empathy_account_settings_get (settings, param);
685 switch G_VALUE_TYPE (v)
688 ret = g_value_get_uchar (v);
691 ret = g_value_get_int (v);
694 ret = CLAMP (g_value_get_uint (v), (guint) G_MININT32,
698 ret = CLAMP (g_value_get_int64 (v), G_MININT32, G_MAXINT32);
701 ret = CLAMP (g_value_get_uint64 (v), (guint64) G_MININT32,
713 empathy_account_settings_get_int64 (EmpathyAccountSettings *settings,
719 v = empathy_account_settings_get (settings, param);
723 switch G_VALUE_TYPE (v)
726 ret = g_value_get_uchar (v);
729 ret = g_value_get_int (v);
732 ret = g_value_get_uint (v);
735 ret = g_value_get_int64 (v);
738 ret = CLAMP (g_value_get_uint64 (v), (guint64) G_MININT64, G_MAXINT64);
749 empathy_account_settings_get_uint32 (EmpathyAccountSettings *settings,
755 v = empathy_account_settings_get (settings, param);
759 switch G_VALUE_TYPE (v)
762 ret = g_value_get_uchar (v);
765 ret = MAX (0, g_value_get_int (v));
768 ret = g_value_get_uint (v);
771 ret = CLAMP (g_value_get_int64 (v), 0, G_MAXUINT32);
774 ret = MIN (g_value_get_uint64 (v), G_MAXUINT32);
785 empathy_account_settings_get_uint64 (EmpathyAccountSettings *settings,
791 v = empathy_account_settings_get (settings, param);
793 if (v == NULL || !G_VALUE_HOLDS_INT (v))
796 switch G_VALUE_TYPE (v)
799 ret = g_value_get_uchar (v);
802 ret = MAX (0, g_value_get_int (v));
805 ret = g_value_get_uint (v);
808 ret = MAX (0, g_value_get_int64 (v));
811 ret = g_value_get_uint64 (v);
822 empathy_account_settings_get_boolean (EmpathyAccountSettings *settings,
827 v = empathy_account_settings_get (settings, param);
829 if (v == NULL || !G_VALUE_HOLDS_BOOLEAN (v))
832 return g_value_get_boolean (v);
836 empathy_account_settings_set_string (EmpathyAccountSettings *settings,
840 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
842 tp_asv_set_string (priv->parameters, g_strdup (param), value);
844 account_settings_remove_from_unset (settings, param);
848 empathy_account_settings_set_int32 (EmpathyAccountSettings *settings,
852 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
854 tp_asv_set_int32 (priv->parameters, g_strdup (param), value);
856 account_settings_remove_from_unset (settings, param);
860 empathy_account_settings_set_int64 (EmpathyAccountSettings *settings,
864 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
866 tp_asv_set_int64 (priv->parameters, g_strdup (param), value);
868 account_settings_remove_from_unset (settings, param);
872 empathy_account_settings_set_uint32 (EmpathyAccountSettings *settings,
876 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
878 tp_asv_set_uint32 (priv->parameters, g_strdup (param), value);
880 account_settings_remove_from_unset (settings, param);
884 empathy_account_settings_set_uint64 (EmpathyAccountSettings *settings,
888 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
890 tp_asv_set_uint64 (priv->parameters, g_strdup (param), value);
892 account_settings_remove_from_unset (settings, param);
896 empathy_account_settings_set_boolean (EmpathyAccountSettings *settings,
900 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
902 tp_asv_set_boolean (priv->parameters, g_strdup (param), value);
904 account_settings_remove_from_unset (settings, param);
908 account_settings_display_name_set_cb (GObject *src,
912 GError *error = NULL;
913 EmpathyAccount *account = EMPATHY_ACCOUNT (src);
914 GSimpleAsyncResult *set_result = user_data;
916 empathy_account_set_display_name_finish (account, res, &error);
920 g_simple_async_result_set_from_error (set_result, error);
921 g_error_free (error);
924 g_simple_async_result_complete (set_result);
925 g_object_unref (set_result);
929 empathy_account_settings_set_display_name_async (
930 EmpathyAccountSettings *settings,
932 GAsyncReadyCallback callback,
935 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
936 GSimpleAsyncResult *result;
938 result = g_simple_async_result_new (G_OBJECT (settings),
939 callback, user_data, empathy_account_settings_set_display_name_finish);
941 if (priv->account == NULL)
943 if (priv->display_name != NULL)
944 g_free (priv->display_name);
946 priv->display_name = g_strdup (name);
948 g_simple_async_result_complete_in_idle (result);
953 empathy_account_set_display_name_async (priv->account, name,
954 account_settings_display_name_set_cb, result);
958 empathy_account_settings_set_display_name_finish (
959 EmpathyAccountSettings *settings,
960 GAsyncResult *result,
963 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
967 g_return_val_if_fail (g_simple_async_result_is_valid (result,
968 G_OBJECT (settings), empathy_account_settings_set_display_name_finish),
975 account_settings_icon_name_set_cb (GObject *src,
979 GError *error = NULL;
980 EmpathyAccount *account = EMPATHY_ACCOUNT (src);
981 GSimpleAsyncResult *set_result = user_data;
983 empathy_account_set_icon_name_finish (account, res, &error);
987 g_simple_async_result_set_from_error (set_result, error);
988 g_error_free (error);
991 g_simple_async_result_complete (set_result);
992 g_object_unref (set_result);
996 empathy_account_settings_set_icon_name_async (
997 EmpathyAccountSettings *settings,
999 GAsyncReadyCallback callback,
1002 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1003 GSimpleAsyncResult *result;
1005 result = g_simple_async_result_new (G_OBJECT (settings),
1006 callback, user_data, empathy_account_settings_set_icon_name_finish);
1008 if (priv->account == NULL)
1010 if (priv->icon_name != NULL)
1011 g_free (priv->icon_name);
1013 priv->icon_name = g_strdup (name);
1015 g_simple_async_result_complete_in_idle (result);
1020 empathy_account_set_icon_name_async (priv->account, name,
1021 account_settings_icon_name_set_cb, result);
1025 empathy_account_settings_set_icon_name_finish (
1026 EmpathyAccountSettings *settings,
1027 GAsyncResult *result,
1030 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
1034 g_return_val_if_fail (g_simple_async_result_is_valid (result,
1035 G_OBJECT (settings), empathy_account_settings_set_icon_name_finish),
1042 empathy_account_settings_account_updated (GObject *source,
1043 GAsyncResult *result,
1046 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
1047 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1048 GSimpleAsyncResult *r;
1049 GError *error = NULL;
1051 if (!empathy_account_update_settings_finish (EMPATHY_ACCOUNT (source),
1054 g_simple_async_result_set_from_error (priv->apply_result, error);
1055 g_error_free (error);
1059 empathy_account_settings_discard_changes (settings);
1062 r = priv->apply_result;
1063 priv->apply_result = NULL;
1065 g_simple_async_result_complete (r);
1070 empathy_account_settings_created_cb (GObject *source,
1071 GAsyncResult *result,
1074 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
1075 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1076 EmpathyAccount *account;
1077 GError *error = NULL;
1078 GSimpleAsyncResult *r;
1080 account = empathy_account_manager_create_account_finish (
1081 EMPATHY_ACCOUNT_MANAGER (source), result, &error);
1083 if (account == NULL)
1085 g_simple_async_result_set_from_error (priv->apply_result, error);
1089 priv->account = g_object_ref (account);
1090 empathy_account_settings_discard_changes (settings);
1093 r = priv->apply_result;
1094 priv->apply_result = NULL;
1096 g_simple_async_result_complete (r);
1102 empathy_account_settings_do_create_account (EmpathyAccountSettings *settings)
1104 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1105 GHashTable *properties;
1106 TpConnectionPresenceType type;
1110 properties = tp_asv_new (NULL, NULL);
1112 type = empathy_account_manager_get_requested_global_presence
1113 (priv->account_manager, &status, &message);
1115 if (type != TP_CONNECTION_PRESENCE_TYPE_UNSET)
1117 /* Create the account with the requested presence the same as the current
1118 * global requested presence, but don't enable it */
1119 GValueArray *presence;
1120 GValue vtype = { 0, };
1121 GValue vstatus = { 0, };
1122 GValue vmessage = { 0, };
1124 presence = g_value_array_new (3);
1126 g_value_init (&vtype, G_TYPE_UINT);
1127 g_value_set_uint (&vtype, type);
1128 g_value_array_append (presence, &vtype);
1130 g_value_init (&vstatus, G_TYPE_STRING);
1131 g_value_take_string (&vstatus, status);
1132 g_value_array_append (presence, &vstatus);
1134 g_value_init (&vmessage, G_TYPE_STRING);
1135 g_value_take_string (&vmessage, message);
1136 g_value_array_append (presence, &vmessage);
1138 tp_asv_take_boxed (properties, TP_IFACE_ACCOUNT ".RequestedPresence",
1139 TP_STRUCT_TYPE_SIMPLE_PRESENCE, presence);
1142 tp_asv_set_string (properties, TP_IFACE_ACCOUNT ".Icon",
1145 empathy_account_manager_create_account_async (priv->account_manager,
1146 priv->cm_name, priv->protocol, priv->display_name,
1147 priv->parameters, properties,
1148 empathy_account_settings_created_cb,
1151 g_hash_table_unref (properties);
1155 empathy_account_settings_manager_ready_cb (EmpathyAccountManager *manager,
1159 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
1160 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1162 if (empathy_account_manager_is_ready (manager))
1164 g_assert (priv->apply_result != NULL && priv->account == NULL);
1165 g_signal_handler_disconnect (priv->account_manager,
1166 priv->account_manager_ready_id);
1167 priv->account_manager_ready_id = 0;
1169 empathy_account_settings_do_create_account (settings);
1174 empathy_account_settings_apply_async (EmpathyAccountSettings *settings,
1175 GAsyncReadyCallback callback,
1178 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1180 if (priv->apply_result != NULL)
1182 g_simple_async_report_error_in_idle (G_OBJECT (settings),
1183 callback, user_data,
1184 G_IO_ERROR, G_IO_ERROR_PENDING, "Applying already in progress");
1188 priv->apply_result = g_simple_async_result_new (G_OBJECT (settings),
1189 callback, user_data, empathy_account_settings_apply_finish);
1191 if (priv->account == NULL)
1193 if (empathy_account_manager_is_ready (priv->account_manager))
1194 empathy_account_settings_do_create_account (settings);
1196 priv->account_manager_ready_id = g_signal_connect (
1197 priv->account_manager,
1199 G_CALLBACK (empathy_account_settings_manager_ready_cb),
1204 empathy_account_update_settings_async (priv->account,
1205 priv->parameters, (const gchar **)priv->unset_parameters->data,
1206 empathy_account_settings_account_updated, settings);
1211 empathy_account_settings_apply_finish (EmpathyAccountSettings *settings,
1212 GAsyncResult *result,
1215 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
1219 g_return_val_if_fail (g_simple_async_result_is_valid (result,
1220 G_OBJECT (settings), empathy_account_settings_apply_finish), FALSE);
1226 empathy_account_settings_has_account (EmpathyAccountSettings *settings,
1227 EmpathyAccount *account)
1229 EmpathyAccountSettingsPriv *priv;
1231 g_return_val_if_fail (EMPATHY_IS_ACCOUNT_SETTINGS (settings), FALSE);
1232 g_return_val_if_fail (EMPATHY_IS_ACCOUNT (account), FALSE);
1234 priv = GET_PRIV (settings);
1236 return (account == priv->account);
1240 empathy_account_settings_is_valid (EmpathyAccountSettings *settings)
1242 EmpathyAccountSettingsPriv *priv;
1245 gboolean missed = FALSE;
1247 g_return_val_if_fail (EMPATHY_IS_ACCOUNT_SETTINGS (settings), FALSE);
1249 priv = GET_PRIV (settings);
1251 for (idx = 0; idx < priv->required_params->len; idx++)
1253 current = g_array_index (priv->required_params, gchar *, idx);
1255 /* first, look if it's set in our own parameters */
1256 if (tp_asv_lookup (priv->parameters, current))
1259 /* if we did not unset the parameter, look if it's in the account */
1260 if (priv->account != NULL &&
1261 !empathy_account_settings_is_unset (settings, current))
1263 const GHashTable *account_params;
1265 account_params = empathy_account_get_parameters (priv->account);
1266 if (tp_asv_lookup (account_params, current))