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 GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyAccountSettings)
36 G_DEFINE_TYPE(EmpathyAccountSettings, empathy_account_settings, G_TYPE_OBJECT)
43 PROP_DISPLAY_NAME_OVERRIDDEN,
47 /* private structure */
48 typedef struct _EmpathyAccountSettingsPriv EmpathyAccountSettingsPriv;
50 struct _EmpathyAccountSettingsPriv
52 gboolean dispose_has_run;
53 EmpathyConnectionManagers *managers;
54 EmpathyAccountManager *account_manager;
55 gulong account_manager_ready_id;
57 TpConnectionManager *manager;
58 const TpConnectionManagerProtocol *tp_protocol;
60 EmpathyAccount *account;
65 gboolean display_name_overridden;
68 GHashTable *parameters;
69 GArray *unset_parameters;
70 GArray *required_params;
72 gulong managers_ready_id;
73 gulong account_ready_id;
75 GSimpleAsyncResult *apply_result;
79 empathy_account_settings_init (EmpathyAccountSettings *obj)
81 EmpathyAccountSettingsPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE ((obj),
82 EMPATHY_TYPE_ACCOUNT_SETTINGS, EmpathyAccountSettingsPriv);
86 /* allocate any data required by the object here */
87 priv->managers = empathy_connection_managers_dup_singleton ();
88 priv->account_manager = empathy_account_manager_dup_singleton ();
90 priv->parameters = g_hash_table_new_full (g_str_hash, g_str_equal,
91 g_free, (GDestroyNotify) tp_g_value_slice_free);
93 priv->unset_parameters = g_array_new (TRUE, FALSE, sizeof (gchar *));
96 static void empathy_account_settings_dispose (GObject *object);
97 static void empathy_account_settings_finalize (GObject *object);
98 static void empathy_account_settings_ready_cb (GObject *obj,
99 GParamSpec *spec, gpointer user_data);
100 static void empathy_account_settings_check_readyness (
101 EmpathyAccountSettings *self);
104 empathy_account_settings_set_property (GObject *object,
109 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (object);
110 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
115 priv->account = g_value_dup_object (value);
118 priv->cm_name = g_value_dup_string (value);
121 priv->protocol = g_value_dup_string (value);
123 case PROP_DISPLAY_NAME:
124 priv->display_name = g_value_dup_string (value);
126 case PROP_DISPLAY_NAME_OVERRIDDEN:
127 priv->display_name_overridden = g_value_get_boolean (value);
130 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
136 empathy_account_settings_get_property (GObject *object,
141 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (object);
142 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
147 g_value_set_object (value, priv->account);
150 g_value_set_string (value, priv->cm_name);
153 g_value_set_string (value, priv->protocol);
155 case PROP_DISPLAY_NAME:
156 g_value_set_string (value, priv->display_name);
158 case PROP_DISPLAY_NAME_OVERRIDDEN:
159 g_value_set_boolean (value, priv->display_name_overridden);
162 g_value_set_boolean (value, priv->ready);
165 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
171 empathy_account_settings_constructed (GObject *object)
173 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
174 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
176 if (priv->account != NULL)
178 g_free (priv->cm_name);
179 g_free (priv->protocol);
182 g_strdup (empathy_account_get_connection_manager (priv->account));
184 g_strdup (empathy_account_get_protocol (priv->account));
185 priv->icon_name = g_strdup
186 (empathy_account_get_icon_name (priv->account));
190 priv->icon_name = empathy_protocol_icon_name (priv->protocol);
193 g_assert (priv->cm_name != NULL && priv->protocol != NULL);
195 empathy_account_settings_check_readyness (self);
199 g_signal_connect (priv->account, "notify::ready",
200 G_CALLBACK (empathy_account_settings_ready_cb), self);
201 g_signal_connect (priv->managers, "notify::ready",
202 G_CALLBACK (empathy_account_settings_ready_cb), self);
206 empathy_account_settings_parent_class)->constructed != NULL)
208 empathy_account_settings_parent_class)->constructed (object);
213 empathy_account_settings_class_init (
214 EmpathyAccountSettingsClass *empathy_account_settings_class)
216 GObjectClass *object_class = G_OBJECT_CLASS (empathy_account_settings_class);
218 g_type_class_add_private (empathy_account_settings_class, sizeof
219 (EmpathyAccountSettingsPriv));
221 object_class->dispose = empathy_account_settings_dispose;
222 object_class->finalize = empathy_account_settings_finalize;
223 object_class->set_property = empathy_account_settings_set_property;
224 object_class->get_property = empathy_account_settings_get_property;
225 object_class->constructed = empathy_account_settings_constructed;
227 g_object_class_install_property (object_class, PROP_ACCOUNT,
228 g_param_spec_object ("account",
230 "The EmpathyAccount backing these settings",
231 EMPATHY_TYPE_ACCOUNT,
232 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
234 g_object_class_install_property (object_class, PROP_CM_NAME,
235 g_param_spec_string ("connection-manager",
236 "connection-manager",
237 "The name of the connection manager this account uses",
239 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
241 g_object_class_install_property (object_class, PROP_PROTOCOL,
242 g_param_spec_string ("protocol",
244 "The name of the protocol this account uses",
246 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
248 g_object_class_install_property (object_class, PROP_DISPLAY_NAME,
249 g_param_spec_string ("display-name",
251 "The display name account these settings belong to",
253 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
255 g_object_class_install_property (object_class, PROP_DISPLAY_NAME_OVERRIDDEN,
256 g_param_spec_boolean ("display-name-overridden",
257 "display-name-overridden",
258 "Whether the display name for this account has been manually "
261 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
263 g_object_class_install_property (object_class, PROP_READY,
264 g_param_spec_boolean ("ready",
266 "Whether this account is ready to be used",
268 G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
272 empathy_account_settings_dispose (GObject *object)
274 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
275 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
277 if (priv->dispose_has_run)
280 priv->dispose_has_run = TRUE;
282 if (priv->managers_ready_id != 0)
283 g_signal_handler_disconnect (priv->managers, priv->managers_ready_id);
284 priv->managers_ready_id = 0;
286 if (priv->managers != NULL)
287 g_object_unref (priv->managers);
288 priv->managers = NULL;
290 if (priv->manager != NULL)
291 g_object_unref (priv->manager);
292 priv->manager = NULL;
294 if (priv->account_manager_ready_id != 0)
295 g_signal_handler_disconnect (priv->account_manager,
296 priv->account_manager_ready_id);
297 priv->account_manager_ready_id = 0;
299 if (priv->account_manager != NULL)
300 g_object_unref (priv->account_manager);
301 priv->account_manager = NULL;
303 if (priv->account_ready_id != 0)
304 g_signal_handler_disconnect (priv->account, priv->account_ready_id);
305 priv->account_ready_id = 0;
307 if (priv->account != NULL)
308 g_object_unref (priv->account);
309 priv->account = NULL;
311 /* release any references held by the object here */
312 if (G_OBJECT_CLASS (empathy_account_settings_parent_class)->dispose)
313 G_OBJECT_CLASS (empathy_account_settings_parent_class)->dispose (object);
317 empathy_account_settings_free_unset_parameters (
318 EmpathyAccountSettings *settings)
320 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
323 for (i = 0 ; i < priv->unset_parameters->len; i++)
324 g_free (g_array_index (priv->unset_parameters, gchar *, i));
326 g_array_set_size (priv->unset_parameters, 0);
330 empathy_account_settings_finalize (GObject *object)
332 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
333 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
335 /* free any data held directly by the object here */
336 g_free (priv->cm_name);
337 g_free (priv->protocol);
338 g_free (priv->display_name);
339 g_free (priv->icon_name);
341 if (priv->required_params != NULL)
342 g_array_free (priv->required_params, TRUE);
344 g_hash_table_destroy (priv->parameters);
346 empathy_account_settings_free_unset_parameters (self);
347 g_array_free (priv->unset_parameters, TRUE);
349 G_OBJECT_CLASS (empathy_account_settings_parent_class)->finalize (object);
353 empathy_account_settings_check_readyness (EmpathyAccountSettings *self)
355 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
360 if (priv->account != NULL && !empathy_account_is_ready (priv->account))
363 if (!empathy_connection_managers_is_ready (priv->managers))
366 priv->manager = empathy_connection_managers_get_cm (
367 priv->managers, priv->cm_name);
369 if (priv->manager == NULL)
372 if (priv->account != NULL)
374 g_free (priv->display_name);
376 g_strdup (empathy_account_get_display_name (priv->account));
378 g_free (priv->icon_name);
380 g_strdup (empathy_account_get_icon_name (priv->account));
383 priv->tp_protocol = tp_connection_manager_get_protocol (priv->manager,
386 if (priv->tp_protocol == NULL)
388 priv->manager = NULL;
392 if (priv->required_params == NULL)
394 TpConnectionManagerParam *cur;
397 priv->required_params = g_array_new (TRUE, FALSE, sizeof (gchar *));
399 for (cur = priv->tp_protocol->params; cur->name != NULL; cur++)
401 if (tp_connection_manager_param_is_required (cur))
403 val = g_strdup (cur->name);
404 g_array_append_val (priv->required_params, val);
409 g_object_ref (priv->manager);
412 g_object_notify (G_OBJECT (self), "ready");
416 empathy_account_settings_ready_cb (GObject *obj,
420 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
422 empathy_account_settings_check_readyness (settings);
425 EmpathyAccountSettings *
426 empathy_account_settings_new (const gchar *connection_manager,
427 const gchar *protocol,
428 const char *display_name)
430 return g_object_new (EMPATHY_TYPE_ACCOUNT_SETTINGS,
431 "connection-manager", connection_manager,
432 "protocol", protocol,
433 "display-name", display_name,
437 EmpathyAccountSettings *
438 empathy_account_settings_new_for_account (EmpathyAccount *account)
440 return g_object_new (EMPATHY_TYPE_ACCOUNT_SETTINGS,
445 TpConnectionManagerParam *
446 empathy_account_settings_get_tp_params (EmpathyAccountSettings *settings)
448 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
450 g_return_val_if_fail (priv->tp_protocol != NULL, NULL);
452 return priv->tp_protocol->params;
456 empathy_account_settings_is_ready (EmpathyAccountSettings *settings)
458 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
464 empathy_account_settings_get_cm (EmpathyAccountSettings *settings)
466 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
468 return priv->cm_name;
472 empathy_account_settings_get_protocol (EmpathyAccountSettings *settings)
474 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
476 return priv->protocol;
480 empathy_account_settings_get_icon_name (EmpathyAccountSettings *settings)
482 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
484 return priv->icon_name;
488 empathy_account_settings_get_display_name (EmpathyAccountSettings *settings)
490 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
492 return priv->display_name;
496 empathy_account_settings_get_account (EmpathyAccountSettings *settings)
498 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
500 return priv->account;
504 empathy_account_settings_is_unset (EmpathyAccountSettings *settings,
507 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
511 a = priv->unset_parameters;
513 for (i = 0; i < a->len; i++)
515 if (!tp_strdiff (g_array_index (a, gchar *, i), param))
522 static TpConnectionManagerParam *
523 empathy_account_settings_get_tp_param (EmpathyAccountSettings *settings,
526 TpConnectionManagerParam *tp_params =
527 empathy_account_settings_get_tp_params (settings);
528 TpConnectionManagerParam *p;
530 for (p = tp_params; p != NULL && p->name != NULL; p++)
532 if (tp_strdiff (p->name, param))
542 account_settings_remove_from_unset (EmpathyAccountSettings *settings,
545 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
549 for (idx = 0; idx < priv->unset_parameters->len; idx++)
551 val = g_array_index (priv->unset_parameters, gchar *, idx);
553 if (!tp_strdiff (val, param))
555 priv->unset_parameters =
556 g_array_remove_index (priv->unset_parameters, idx);
565 empathy_account_settings_get_default (EmpathyAccountSettings *settings,
568 TpConnectionManagerParam *p;
570 p = empathy_account_settings_get_tp_param (settings, param);
572 if (p == NULL || !(p->flags & TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT))
575 return &(p->default_value);
579 empathy_account_settings_get_dbus_signature (EmpathyAccountSettings *settings,
582 TpConnectionManagerParam *p;
584 p = empathy_account_settings_get_tp_param (settings, param);
589 return p->dbus_signature;
593 empathy_account_settings_get (EmpathyAccountSettings *settings,
596 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
597 const GValue *result = NULL;
599 /* Lookup the update parameters we set */
600 result = tp_asv_lookup (priv->parameters, param);
604 /* If the parameters isn't unset use the accounts setting if any */
605 if (priv->account != NULL
606 && !empathy_account_settings_is_unset (settings, param))
608 const GHashTable *parameters;
610 parameters = empathy_account_get_parameters (priv->account);
611 result = tp_asv_lookup (parameters, param);
617 /* fallback to the default */
618 return empathy_account_settings_get_default (settings, param);
622 empathy_account_settings_unset (EmpathyAccountSettings *settings,
625 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
627 if (empathy_account_settings_is_unset (settings, param))
630 v = g_strdup (param);
632 g_array_append_val (priv->unset_parameters, v);
633 g_hash_table_remove (priv->parameters, param);
637 empathy_account_settings_discard_changes (EmpathyAccountSettings *settings)
639 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
641 g_hash_table_remove_all (priv->parameters);
642 empathy_account_settings_free_unset_parameters (settings);
646 empathy_account_settings_get_string (EmpathyAccountSettings *settings,
651 v = empathy_account_settings_get (settings, param);
653 if (v == NULL || !G_VALUE_HOLDS_STRING (v))
656 return g_value_get_string (v);
660 empathy_account_settings_get_int32 (EmpathyAccountSettings *settings,
666 v = empathy_account_settings_get (settings, param);
671 switch G_VALUE_TYPE (v)
674 ret = g_value_get_uchar (v);
677 ret = g_value_get_int (v);
680 ret = CLAMP (G_MININT32, g_value_get_uint (v), G_MAXINT32);
683 ret = CLAMP (G_MININT32, g_value_get_int64 (v), G_MAXINT32);
686 ret = CLAMP (G_MININT32, g_value_get_uint64 (v), G_MAXINT32);
697 empathy_account_settings_get_int64 (EmpathyAccountSettings *settings,
703 v = empathy_account_settings_get (settings, param);
707 switch G_VALUE_TYPE (v)
710 ret = g_value_get_uchar (v);
713 ret = g_value_get_int (v);
716 ret = g_value_get_uint (v);
719 ret = g_value_get_int64 (v);
722 ret = CLAMP (G_MININT64, g_value_get_uint64 (v), G_MAXINT64);
733 empathy_account_settings_get_uint32 (EmpathyAccountSettings *settings,
739 v = empathy_account_settings_get (settings, param);
743 switch G_VALUE_TYPE (v)
746 ret = g_value_get_uchar (v);
749 ret = MAX (0, g_value_get_int (v));
752 ret = g_value_get_uint (v);
755 ret = CLAMP (0, g_value_get_int64 (v), G_MAXUINT32);
758 ret = CLAMP (0, g_value_get_uint64 (v), G_MAXUINT32);
769 empathy_account_settings_get_uint64 (EmpathyAccountSettings *settings,
775 v = empathy_account_settings_get (settings, param);
777 if (v == NULL || !G_VALUE_HOLDS_INT (v))
780 switch G_VALUE_TYPE (v)
783 ret = g_value_get_uchar (v);
786 ret = MAX (0, g_value_get_int (v));
789 ret = g_value_get_uint (v);
792 ret = MAX (0, g_value_get_int64 (v));
795 ret = CLAMP (0, g_value_get_uint64 (v), G_MAXUINT64);
806 empathy_account_settings_get_boolean (EmpathyAccountSettings *settings,
811 v = empathy_account_settings_get (settings, param);
813 if (v == NULL || !G_VALUE_HOLDS_BOOLEAN (v))
816 return g_value_get_boolean (v);
820 empathy_account_settings_set_string (EmpathyAccountSettings *settings,
824 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
826 tp_asv_set_string (priv->parameters, g_strdup (param), value);
828 account_settings_remove_from_unset (settings, param);
832 empathy_account_settings_set_int32 (EmpathyAccountSettings *settings,
836 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
838 tp_asv_set_int32 (priv->parameters, g_strdup (param), value);
840 account_settings_remove_from_unset (settings, param);
844 empathy_account_settings_set_int64 (EmpathyAccountSettings *settings,
848 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
850 tp_asv_set_int64 (priv->parameters, g_strdup (param), value);
852 account_settings_remove_from_unset (settings, param);
856 empathy_account_settings_set_uint32 (EmpathyAccountSettings *settings,
860 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
862 tp_asv_set_uint32 (priv->parameters, g_strdup (param), value);
864 account_settings_remove_from_unset (settings, param);
868 empathy_account_settings_set_uint64 (EmpathyAccountSettings *settings,
872 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
874 tp_asv_set_uint64 (priv->parameters, g_strdup (param), value);
876 account_settings_remove_from_unset (settings, param);
880 empathy_account_settings_set_boolean (EmpathyAccountSettings *settings,
884 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
886 tp_asv_set_boolean (priv->parameters, g_strdup (param), value);
888 account_settings_remove_from_unset (settings, param);
892 account_settings_display_name_set_cb (GObject *src,
896 GError *error = NULL;
897 EmpathyAccount *account = EMPATHY_ACCOUNT (src);
898 GSimpleAsyncResult *set_result = user_data;
900 empathy_account_set_display_name_finish (account, res, &error);
904 g_simple_async_result_set_from_error (set_result, error);
905 g_error_free (error);
908 g_simple_async_result_complete (set_result);
909 g_object_unref (set_result);
913 empathy_account_settings_set_display_name_async (
914 EmpathyAccountSettings *settings,
916 GAsyncReadyCallback callback,
919 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
920 GSimpleAsyncResult *result;
922 result = g_simple_async_result_new (G_OBJECT (settings),
923 callback, user_data, empathy_account_settings_set_display_name_finish);
925 if (priv->account == NULL)
927 if (priv->display_name != NULL)
928 g_free (priv->display_name);
930 priv->display_name = g_strdup (name);
932 g_simple_async_result_complete_in_idle (result);
937 empathy_account_set_display_name_async (priv->account, name,
938 account_settings_display_name_set_cb, result);
942 empathy_account_settings_set_display_name_finish (
943 EmpathyAccountSettings *settings,
944 GAsyncResult *result,
947 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
951 g_return_val_if_fail (g_simple_async_result_is_valid (result,
952 G_OBJECT (settings), empathy_account_settings_set_display_name_finish),
959 account_settings_icon_name_set_cb (GObject *src,
963 GError *error = NULL;
964 EmpathyAccount *account = EMPATHY_ACCOUNT (src);
965 GSimpleAsyncResult *set_result = user_data;
967 empathy_account_set_icon_name_finish (account, res, &error);
971 g_simple_async_result_set_from_error (set_result, error);
972 g_error_free (error);
975 g_simple_async_result_complete (set_result);
976 g_object_unref (set_result);
980 empathy_account_settings_set_icon_name_async (
981 EmpathyAccountSettings *settings,
983 GAsyncReadyCallback callback,
986 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
987 GSimpleAsyncResult *result;
989 result = g_simple_async_result_new (G_OBJECT (settings),
990 callback, user_data, empathy_account_settings_set_icon_name_finish);
992 if (priv->account == NULL)
994 if (priv->icon_name != NULL)
995 g_free (priv->icon_name);
997 priv->icon_name = g_strdup (name);
999 g_simple_async_result_complete_in_idle (result);
1004 empathy_account_set_icon_name_async (priv->account, name,
1005 account_settings_icon_name_set_cb, result);
1009 empathy_account_settings_set_icon_name_finish (
1010 EmpathyAccountSettings *settings,
1011 GAsyncResult *result,
1014 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
1018 g_return_val_if_fail (g_simple_async_result_is_valid (result,
1019 G_OBJECT (settings), empathy_account_settings_set_icon_name_finish),
1026 empathy_account_settings_account_updated (GObject *source,
1027 GAsyncResult *result,
1030 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
1031 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1032 GSimpleAsyncResult *r;
1033 GError *error = NULL;
1035 if (!empathy_account_update_settings_finish (EMPATHY_ACCOUNT (source),
1038 g_simple_async_result_set_from_error (priv->apply_result, error);
1039 g_error_free (error);
1043 empathy_account_settings_discard_changes (settings);
1046 r = priv->apply_result;
1047 priv->apply_result = NULL;
1049 g_simple_async_result_complete (r);
1054 empathy_account_settings_created_cb (GObject *source,
1055 GAsyncResult *result,
1058 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
1059 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1060 EmpathyAccount *account;
1061 GError *error = NULL;
1062 GSimpleAsyncResult *r;
1064 account = empathy_account_manager_create_account_finish (
1065 EMPATHY_ACCOUNT_MANAGER (source), result, &error);
1067 if (account == NULL)
1069 g_simple_async_result_set_from_error (priv->apply_result, error);
1073 priv->account = g_object_ref (account);
1074 empathy_account_settings_discard_changes (settings);
1077 r = priv->apply_result;
1078 priv->apply_result = NULL;
1080 g_simple_async_result_complete (r);
1086 empathy_account_settings_do_create_account (EmpathyAccountSettings *settings)
1088 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1089 GHashTable *properties;
1090 TpConnectionPresenceType type;
1094 properties = tp_asv_new (NULL, NULL);
1096 type = empathy_account_manager_get_requested_global_presence
1097 (priv->account_manager, &status, &message);
1099 if (type != TP_CONNECTION_PRESENCE_TYPE_UNSET)
1101 /* Create the account with the requested presence the same as the current
1102 * global requested presence, but don't enable it */
1103 GValueArray *presence;
1104 GValue vtype = { 0, };
1105 GValue vstatus = { 0, };
1106 GValue vmessage = { 0, };
1108 presence = g_value_array_new (3);
1110 g_value_init (&vtype, G_TYPE_UINT);
1111 g_value_set_uint (&vtype, type);
1112 g_value_array_append (presence, &vtype);
1114 g_value_init (&vstatus, G_TYPE_STRING);
1115 g_value_take_string (&vstatus, status);
1116 g_value_array_append (presence, &vstatus);
1118 g_value_init (&vmessage, G_TYPE_STRING);
1119 g_value_take_string (&vmessage, message);
1120 g_value_array_append (presence, &vmessage);
1122 tp_asv_take_boxed (properties, TP_IFACE_ACCOUNT ".RequestedPresence",
1123 TP_STRUCT_TYPE_SIMPLE_PRESENCE, presence);
1126 tp_asv_set_string (properties, TP_IFACE_ACCOUNT ".Icon",
1129 empathy_account_manager_create_account_async (priv->account_manager,
1130 priv->cm_name, priv->protocol, priv->display_name,
1131 priv->parameters, properties,
1132 empathy_account_settings_created_cb,
1135 g_hash_table_unref (properties);
1139 empathy_account_settings_manager_ready_cb (EmpathyAccountManager *manager,
1143 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
1144 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1146 if (empathy_account_manager_is_ready (manager))
1148 g_assert (priv->apply_result != NULL && priv->account == NULL);
1149 g_signal_handler_disconnect (priv->account_manager,
1150 priv->account_manager_ready_id);
1151 priv->account_manager_ready_id = 0;
1153 empathy_account_settings_do_create_account (settings);
1158 empathy_account_settings_apply_async (EmpathyAccountSettings *settings,
1159 GAsyncReadyCallback callback,
1162 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1164 if (priv->apply_result != NULL)
1166 g_simple_async_report_error_in_idle (G_OBJECT (settings),
1167 callback, user_data,
1168 G_IO_ERROR, G_IO_ERROR_PENDING, "Applying already in progress");
1172 priv->apply_result = g_simple_async_result_new (G_OBJECT (settings),
1173 callback, user_data, empathy_account_settings_apply_finish);
1175 if (priv->account == NULL)
1177 if (empathy_account_manager_is_ready (priv->account_manager))
1178 empathy_account_settings_do_create_account (settings);
1180 priv->account_manager_ready_id = g_signal_connect (
1181 priv->account_manager,
1183 G_CALLBACK (empathy_account_settings_manager_ready_cb),
1188 empathy_account_update_settings_async (priv->account,
1189 priv->parameters, (const gchar **)priv->unset_parameters->data,
1190 empathy_account_settings_account_updated, settings);
1195 empathy_account_settings_apply_finish (EmpathyAccountSettings *settings,
1196 GAsyncResult *result,
1199 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
1203 g_return_val_if_fail (g_simple_async_result_is_valid (result,
1204 G_OBJECT (settings), empathy_account_settings_apply_finish), FALSE);
1210 empathy_account_settings_has_account (EmpathyAccountSettings *settings,
1211 EmpathyAccount *account)
1213 EmpathyAccountSettingsPriv *priv;
1215 g_return_val_if_fail (EMPATHY_IS_ACCOUNT_SETTINGS (settings), FALSE);
1216 g_return_val_if_fail (EMPATHY_IS_ACCOUNT (account), FALSE);
1218 priv = GET_PRIV (settings);
1220 return (account == priv->account);
1224 empathy_account_settings_is_valid (EmpathyAccountSettings *settings)
1226 EmpathyAccountSettingsPriv *priv;
1229 gboolean missed = FALSE;
1231 g_return_val_if_fail (EMPATHY_IS_ACCOUNT_SETTINGS (settings), FALSE);
1233 priv = GET_PRIV (settings);
1235 for (idx = 0; idx < priv->required_params->len; idx++)
1237 current = g_array_index (priv->required_params, gchar *, idx);
1239 /* first, look if it's set in our own parameters */
1240 if (tp_asv_lookup (priv->parameters, current))
1243 /* if we did not unset the parameter, look if it's in the account */
1244 if (priv->account != NULL &&
1245 !empathy_account_settings_is_unset (settings, current))
1247 const GHashTable *account_params;
1249 account_params = empathy_account_get_parameters (priv->account);
1250 if (tp_asv_lookup (account_params, current))