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)
46 /* private structure */
47 typedef struct _EmpathyAccountSettingsPriv EmpathyAccountSettingsPriv;
49 struct _EmpathyAccountSettingsPriv
51 gboolean dispose_has_run;
52 EmpathyConnectionManagers *managers;
53 EmpathyAccountManager *account_manager;
54 gulong account_manager_ready_id;
56 TpConnectionManager *manager;
57 const TpConnectionManagerProtocol *tp_protocol;
59 EmpathyAccount *account;
66 GHashTable *parameters;
67 GArray *unset_parameters;
68 GArray *required_params;
70 gulong managers_ready_id;
71 gulong account_ready_id;
73 GSimpleAsyncResult *apply_result;
77 empathy_account_settings_init (EmpathyAccountSettings *obj)
79 EmpathyAccountSettingsPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE ((obj),
80 EMPATHY_TYPE_ACCOUNT_SETTINGS, EmpathyAccountSettingsPriv);
84 /* allocate any data required by the object here */
85 priv->managers = empathy_connection_managers_dup_singleton ();
86 priv->account_manager = empathy_account_manager_dup_singleton ();
88 priv->parameters = g_hash_table_new_full (g_str_hash, g_str_equal,
89 g_free, (GDestroyNotify) tp_g_value_slice_free);
91 priv->unset_parameters = g_array_new (TRUE, FALSE, sizeof (gchar *));
94 static void empathy_account_settings_dispose (GObject *object);
95 static void empathy_account_settings_finalize (GObject *object);
96 static void empathy_account_settings_ready_cb (GObject *obj,
97 GParamSpec *spec, gpointer user_data);
98 static void empathy_account_settings_check_readyness (
99 EmpathyAccountSettings *self);
102 empathy_account_settings_set_property (GObject *object,
107 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (object);
108 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
113 priv->account = g_value_dup_object (value);
116 priv->cm_name = g_value_dup_string (value);
119 priv->protocol = g_value_dup_string (value);
121 case PROP_DISPLAY_NAME:
122 priv->display_name = g_value_dup_string (value);
125 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
131 empathy_account_settings_get_property (GObject *object,
136 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (object);
137 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
142 g_value_set_object (value, priv->account);
145 g_value_set_string (value, priv->cm_name);
148 g_value_set_string (value, priv->protocol);
150 case PROP_DISPLAY_NAME:
151 g_value_set_string (value, priv->display_name);
154 g_value_set_boolean (value, priv->ready);
157 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
163 empathy_account_settings_constructed (GObject *object)
165 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
166 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
168 if (priv->account != NULL)
170 g_free (priv->cm_name);
171 g_free (priv->protocol);
174 g_strdup (empathy_account_get_connection_manager (priv->account));
176 g_strdup (empathy_account_get_protocol (priv->account));
179 priv->icon_name = g_strdup_printf ("im-%s", priv->protocol);
181 g_assert (priv->cm_name != NULL && priv->protocol != NULL);
183 empathy_account_settings_check_readyness (self);
187 g_signal_connect (priv->account, "notify::ready",
188 G_CALLBACK (empathy_account_settings_ready_cb), self);
189 g_signal_connect (priv->managers, "notify::ready",
190 G_CALLBACK (empathy_account_settings_ready_cb), self);
194 empathy_account_settings_parent_class)->constructed != NULL)
196 empathy_account_settings_parent_class)->constructed (object);
201 empathy_account_settings_class_init (
202 EmpathyAccountSettingsClass *empathy_account_settings_class)
204 GObjectClass *object_class = G_OBJECT_CLASS (empathy_account_settings_class);
206 g_type_class_add_private (empathy_account_settings_class, sizeof
207 (EmpathyAccountSettingsPriv));
209 object_class->dispose = empathy_account_settings_dispose;
210 object_class->finalize = empathy_account_settings_finalize;
211 object_class->set_property = empathy_account_settings_set_property;
212 object_class->get_property = empathy_account_settings_get_property;
213 object_class->constructed = empathy_account_settings_constructed;
215 g_object_class_install_property (object_class, PROP_ACCOUNT,
216 g_param_spec_object ("account",
218 "The EmpathyAccount backing these settings",
219 EMPATHY_TYPE_ACCOUNT,
220 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
222 g_object_class_install_property (object_class, PROP_CM_NAME,
223 g_param_spec_string ("connection-manager",
224 "connection-manager",
225 "The name of the connection manager this account uses",
227 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
229 g_object_class_install_property (object_class, PROP_PROTOCOL,
230 g_param_spec_string ("protocol",
232 "The name of the protocol this account uses",
234 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
236 g_object_class_install_property (object_class, PROP_DISPLAY_NAME,
237 g_param_spec_string ("display-name",
239 "The display name account these settings belong to",
241 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
243 g_object_class_install_property (object_class, PROP_READY,
244 g_param_spec_boolean ("ready",
246 "Whether this account is ready to be used",
248 G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
252 empathy_account_settings_dispose (GObject *object)
254 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
255 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
257 if (priv->dispose_has_run)
260 priv->dispose_has_run = TRUE;
262 if (priv->managers_ready_id != 0)
263 g_signal_handler_disconnect (priv->managers, priv->managers_ready_id);
264 priv->managers_ready_id = 0;
266 if (priv->managers != NULL)
267 g_object_unref (priv->managers);
268 priv->managers = NULL;
270 if (priv->manager != NULL)
271 g_object_unref (priv->manager);
272 priv->manager = NULL;
274 if (priv->account_manager_ready_id != 0)
275 g_signal_handler_disconnect (priv->account_manager,
276 priv->account_manager_ready_id);
277 priv->account_manager_ready_id = 0;
279 if (priv->account_manager != NULL)
280 g_object_unref (priv->account_manager);
281 priv->account_manager = NULL;
283 if (priv->account_ready_id != 0)
284 g_signal_handler_disconnect (priv->account, priv->account_ready_id);
285 priv->account_ready_id = 0;
287 if (priv->account != NULL)
288 g_object_unref (priv->account);
289 priv->account = NULL;
291 /* release any references held by the object here */
292 if (G_OBJECT_CLASS (empathy_account_settings_parent_class)->dispose)
293 G_OBJECT_CLASS (empathy_account_settings_parent_class)->dispose (object);
297 empathy_account_settings_free_unset_parameters (
298 EmpathyAccountSettings *settings)
300 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
303 for (i = 0 ; i < priv->unset_parameters->len; i++)
304 g_free (g_array_index (priv->unset_parameters, gchar *, i));
306 g_array_set_size (priv->unset_parameters, 0);
310 empathy_account_settings_finalize (GObject *object)
312 EmpathyAccountSettings *self = EMPATHY_ACCOUNT_SETTINGS (object);
313 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
315 /* free any data held directly by the object here */
316 g_free (priv->cm_name);
317 g_free (priv->protocol);
318 g_free (priv->display_name);
319 g_free (priv->icon_name);
321 g_hash_table_destroy (priv->parameters);
323 empathy_account_settings_free_unset_parameters (self);
324 g_array_free (priv->unset_parameters, TRUE);
326 G_OBJECT_CLASS (empathy_account_settings_parent_class)->finalize (object);
330 empathy_account_settings_check_readyness (EmpathyAccountSettings *self)
332 EmpathyAccountSettingsPriv *priv = GET_PRIV (self);
337 if (priv->account != NULL && !empathy_account_is_ready (priv->account))
340 if (!empathy_connection_managers_is_ready (priv->managers))
343 priv->manager = empathy_connection_managers_get_cm (
344 priv->managers, priv->cm_name);
346 if (priv->manager == NULL)
349 if (priv->account != NULL)
351 g_free (priv->display_name);
353 g_strdup (empathy_account_get_display_name (priv->account));
355 g_free (priv->icon_name);
357 g_strdup (empathy_account_get_icon_name (priv->account));
360 priv->tp_protocol = tp_connection_manager_get_protocol (priv->manager,
363 if (priv->tp_protocol == NULL)
365 priv->manager = NULL;
369 if (priv->required_params == NULL)
371 TpConnectionManagerParam *cur;
374 priv->required_params = g_array_new (TRUE, FALSE, sizeof (gchar *));
376 for (cur = priv->tp_protocol->params; cur->name != NULL; cur++)
378 if (tp_connection_manager_param_is_required (cur))
380 val = g_strdup (cur->name);
381 g_array_append_val (priv->required_params, val);
386 g_object_ref (priv->manager);
389 g_object_notify (G_OBJECT (self), "ready");
393 empathy_account_settings_ready_cb (GObject *obj,
397 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
399 empathy_account_settings_check_readyness (settings);
402 EmpathyAccountSettings *
403 empathy_account_settings_new (const gchar *connection_manager,
404 const gchar *protocol,
405 const char *display_name)
407 return g_object_new (EMPATHY_TYPE_ACCOUNT_SETTINGS,
408 "connection-manager", connection_manager,
409 "protocol", protocol,
410 "display-name", display_name,
414 EmpathyAccountSettings *
415 empathy_account_settings_new_for_account (EmpathyAccount *account)
417 return g_object_new (EMPATHY_TYPE_ACCOUNT_SETTINGS,
422 TpConnectionManagerParam *
423 empathy_account_settings_get_tp_params (EmpathyAccountSettings *settings)
425 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
427 g_return_val_if_fail (priv->tp_protocol != NULL, NULL);
429 return priv->tp_protocol->params;
433 empathy_account_settings_is_ready (EmpathyAccountSettings *settings)
435 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
441 empathy_account_settings_get_cm (EmpathyAccountSettings *settings)
443 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
445 return priv->cm_name;
449 empathy_account_settings_get_protocol (EmpathyAccountSettings *settings)
451 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
453 return priv->protocol;
457 empathy_account_settings_get_icon_name (EmpathyAccountSettings *settings)
459 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
461 return priv->icon_name;
465 empathy_account_settings_get_display_name (EmpathyAccountSettings *settings)
467 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
469 return priv->display_name;
473 empathy_account_settings_get_account (EmpathyAccountSettings *settings)
475 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
477 return priv->account;
481 empathy_account_settings_is_unset (EmpathyAccountSettings *settings,
484 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
488 a = priv->unset_parameters;
490 for (i = 0; i < a->len; i++)
492 if (!tp_strdiff (g_array_index (a, gchar *, i), param))
499 static TpConnectionManagerParam *
500 empathy_account_settings_get_tp_param (EmpathyAccountSettings *settings,
503 TpConnectionManagerParam *tp_params =
504 empathy_account_settings_get_tp_params (settings);
505 TpConnectionManagerParam *p;
507 for (p = tp_params; p != NULL && p->name != NULL; p++)
509 if (tp_strdiff (p->name, param))
519 account_settings_remove_from_unset (EmpathyAccountSettings *settings,
522 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
526 for (idx = 0; idx < priv->unset_parameters->len; idx++)
528 val = g_array_index (priv->unset_parameters, gchar *, idx);
530 if (!tp_strdiff (val, param))
532 priv->unset_parameters =
533 g_array_remove_index (priv->unset_parameters, idx);
542 empathy_account_settings_get_default (EmpathyAccountSettings *settings,
545 TpConnectionManagerParam *p;
547 p = empathy_account_settings_get_tp_param (settings, param);
549 if (p == NULL || !(p->flags & TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT))
552 return &(p->default_value);
556 empathy_account_settings_get_dbus_signature (EmpathyAccountSettings *settings,
559 TpConnectionManagerParam *p;
561 p = empathy_account_settings_get_tp_param (settings, param);
566 return p->dbus_signature;
570 empathy_account_settings_get (EmpathyAccountSettings *settings,
573 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
574 const GValue *result = NULL;
576 /* Lookup the update parameters we set */
577 result = tp_asv_lookup (priv->parameters, param);
581 /* If the parameters isn't unset use the accounts setting if any */
582 if (priv->account != NULL
583 && !empathy_account_settings_is_unset (settings, param))
585 const GHashTable *parameters;
587 parameters = empathy_account_get_parameters (priv->account);
588 result = tp_asv_lookup (parameters, param);
594 /* fallback to the default */
595 return empathy_account_settings_get_default (settings, param);
599 empathy_account_settings_unset (EmpathyAccountSettings *settings,
602 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
604 if (empathy_account_settings_is_unset (settings, param))
607 v = g_strdup (param);
609 g_array_append_val (priv->unset_parameters, v);
610 g_hash_table_remove (priv->parameters, param);
614 empathy_account_settings_get_string (EmpathyAccountSettings *settings,
619 v = empathy_account_settings_get (settings, param);
621 if (v == NULL || !G_VALUE_HOLDS_STRING (v))
624 return g_value_get_string (v);
628 empathy_account_settings_get_int32 (EmpathyAccountSettings *settings,
634 v = empathy_account_settings_get (settings, param);
639 switch G_VALUE_TYPE (v)
642 ret = g_value_get_uchar (v);
645 ret = g_value_get_int (v);
648 ret = CLAMP (G_MININT32, g_value_get_uint (v), G_MAXINT32);
651 ret = CLAMP (G_MININT32, g_value_get_int64 (v), G_MAXINT32);
654 ret = CLAMP (G_MININT32, g_value_get_uint64 (v), G_MAXINT32);
665 empathy_account_settings_get_int64 (EmpathyAccountSettings *settings,
671 v = empathy_account_settings_get (settings, param);
675 switch G_VALUE_TYPE (v)
678 ret = g_value_get_uchar (v);
681 ret = g_value_get_int (v);
684 ret = g_value_get_uint (v);
687 ret = g_value_get_int64 (v);
690 ret = CLAMP (G_MININT64, g_value_get_uint64 (v), G_MAXINT64);
701 empathy_account_settings_get_uint32 (EmpathyAccountSettings *settings,
707 v = empathy_account_settings_get (settings, param);
709 switch G_VALUE_TYPE (v)
712 ret = g_value_get_uchar (v);
715 ret = MAX (0, g_value_get_int (v));
718 ret = g_value_get_uint (v);
721 ret = CLAMP (0, g_value_get_int64 (v), G_MAXUINT32);
724 ret = CLAMP (0, g_value_get_uint64 (v), G_MAXUINT32);
735 empathy_account_settings_get_uint64 (EmpathyAccountSettings *settings,
741 v = empathy_account_settings_get (settings, param);
743 if (v == NULL || !G_VALUE_HOLDS_INT (v))
746 switch G_VALUE_TYPE (v)
749 ret = g_value_get_uchar (v);
752 ret = MAX (0, g_value_get_int (v));
755 ret = g_value_get_uint (v);
758 ret = MAX (0, g_value_get_int64 (v));
761 ret = CLAMP (0, g_value_get_uint64 (v), G_MAXUINT64);
772 empathy_account_settings_get_boolean (EmpathyAccountSettings *settings,
777 v = empathy_account_settings_get (settings, param);
779 if (v == NULL || !G_VALUE_HOLDS_BOOLEAN (v))
782 return g_value_get_boolean (v);
786 empathy_account_settings_set_string (EmpathyAccountSettings *settings,
790 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
792 tp_asv_set_string (priv->parameters, g_strdup (param), value);
794 account_settings_remove_from_unset (settings, param);
798 empathy_account_settings_set_int32 (EmpathyAccountSettings *settings,
802 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
804 tp_asv_set_int32 (priv->parameters, g_strdup (param), value);
806 account_settings_remove_from_unset (settings, param);
810 empathy_account_settings_set_int64 (EmpathyAccountSettings *settings,
814 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
816 tp_asv_set_int64 (priv->parameters, g_strdup (param), value);
818 account_settings_remove_from_unset (settings, param);
822 empathy_account_settings_set_uint32 (EmpathyAccountSettings *settings,
826 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
828 tp_asv_set_uint32 (priv->parameters, g_strdup (param), value);
830 account_settings_remove_from_unset (settings, param);
834 empathy_account_settings_set_uint64 (EmpathyAccountSettings *settings,
838 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
840 tp_asv_set_uint64 (priv->parameters, g_strdup (param), value);
842 account_settings_remove_from_unset (settings, param);
846 empathy_account_settings_set_boolean (EmpathyAccountSettings *settings,
850 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
852 tp_asv_set_boolean (priv->parameters, g_strdup (param), value);
854 account_settings_remove_from_unset (settings, param);
858 account_settings_display_name_set_cb (GObject *src,
862 GError *error = NULL;
863 EmpathyAccount *account = EMPATHY_ACCOUNT (src);
864 GSimpleAsyncResult *set_result = user_data;
866 empathy_account_set_display_name_finish (account, res, &error);
870 g_simple_async_result_set_from_error (set_result, error);
871 g_error_free (error);
874 g_simple_async_result_complete (set_result);
875 g_object_unref (set_result);
879 empathy_account_settings_set_display_name_async (
880 EmpathyAccountSettings *settings,
882 GAsyncReadyCallback callback,
885 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
886 GSimpleAsyncResult *result;
888 result = g_simple_async_result_new (G_OBJECT (settings),
889 callback, user_data, empathy_account_settings_set_display_name_finish);
891 if (priv->account == NULL)
893 if (priv->display_name != NULL)
894 g_free (priv->display_name);
896 priv->display_name = g_strdup (name);
898 g_simple_async_result_complete_in_idle (result);
903 empathy_account_set_display_name_async (priv->account, name,
904 account_settings_display_name_set_cb, result);
908 empathy_account_settings_set_display_name_finish (
909 EmpathyAccountSettings *settings,
910 GAsyncResult *result,
913 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
917 g_return_val_if_fail (g_simple_async_result_is_valid (result,
918 G_OBJECT (settings), empathy_account_settings_set_display_name_finish),
925 empathy_account_settings_account_updated (GObject *source,
926 GAsyncResult *result,
929 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
930 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
931 GSimpleAsyncResult *r;
932 GError *error = NULL;
934 if (!empathy_account_update_settings_finish (EMPATHY_ACCOUNT (source),
937 g_simple_async_result_set_from_error (priv->apply_result, error);
938 g_error_free (error);
941 r = priv->apply_result;
942 priv->apply_result = NULL;
944 g_simple_async_result_complete (r);
949 empathy_account_settings_created_cb (GObject *source,
950 GAsyncResult *result,
953 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
954 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
955 EmpathyAccount *account;
956 GError *error = NULL;
957 GSimpleAsyncResult *r;
959 account = empathy_account_manager_create_account_finish (
960 EMPATHY_ACCOUNT_MANAGER (source), result, &error);
964 g_simple_async_result_set_from_error (priv->apply_result, error);
968 priv->account = g_object_ref (account);
971 r = priv->apply_result;
972 priv->apply_result = NULL;
974 g_simple_async_result_complete (r);
980 empathy_account_settings_do_create_account (EmpathyAccountSettings *settings)
982 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
983 GHashTable *properties;
984 TpConnectionPresenceType type;
988 properties = tp_asv_new (NULL, NULL);
990 type = empathy_account_manager_get_requested_global_presence
991 (priv->account_manager, &status, &message);
993 if (type != TP_CONNECTION_PRESENCE_TYPE_UNSET)
995 /* Create the account with the requested presence the same as the current
996 * global requested presence, but don't enable it */
997 GValueArray *presence;
998 GValue vtype = { 0, };
999 GValue vstatus = { 0, };
1000 GValue vmessage = { 0, };
1002 presence = g_value_array_new (3);
1004 g_value_init (&vtype, G_TYPE_UINT);
1005 g_value_set_uint (&vtype, type);
1006 g_value_array_append (presence, &vtype);
1008 g_value_init (&vstatus, G_TYPE_STRING);
1009 g_value_take_string (&vstatus, status);
1010 g_value_array_append (presence, &vstatus);
1012 g_value_init (&vmessage, G_TYPE_STRING);
1013 g_value_take_string (&vmessage, message);
1014 g_value_array_append (presence, &vmessage);
1016 tp_asv_take_boxed (properties, TP_IFACE_ACCOUNT ".RequestedPresence",
1017 TP_STRUCT_TYPE_SIMPLE_PRESENCE, presence);
1020 empathy_account_manager_create_account_async (priv->account_manager,
1021 priv->cm_name, priv->protocol, priv->display_name,
1022 priv->parameters, properties,
1023 empathy_account_settings_created_cb,
1026 g_hash_table_unref (properties);
1030 empathy_account_settings_manager_ready_cb (EmpathyAccountManager *manager,
1034 EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (user_data);
1035 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1037 if (empathy_account_manager_is_ready (manager))
1039 g_assert (priv->apply_result != NULL && priv->account == NULL);
1040 g_signal_handler_disconnect (priv->account_manager,
1041 priv->account_manager_ready_id);
1042 priv->account_manager_ready_id = 0;
1044 empathy_account_settings_do_create_account (settings);
1049 empathy_account_settings_apply_async (EmpathyAccountSettings *settings,
1050 GAsyncReadyCallback callback,
1053 EmpathyAccountSettingsPriv *priv = GET_PRIV (settings);
1055 if (priv->apply_result != NULL)
1057 g_simple_async_report_error_in_idle (G_OBJECT (settings),
1058 callback, user_data,
1059 G_IO_ERROR, G_IO_ERROR_PENDING, "Applying already in progress");
1063 priv->apply_result = g_simple_async_result_new (G_OBJECT (settings),
1064 callback, user_data, empathy_account_settings_apply_finish);
1066 if (priv->account == NULL)
1068 if (empathy_account_manager_is_ready (priv->account_manager))
1069 empathy_account_settings_do_create_account (settings);
1071 priv->account_manager_ready_id = g_signal_connect (
1072 priv->account_manager,
1074 G_CALLBACK (empathy_account_settings_manager_ready_cb),
1079 empathy_account_update_settings_async (priv->account,
1080 priv->parameters, (const gchar **)priv->unset_parameters->data,
1081 empathy_account_settings_account_updated, settings);
1083 g_hash_table_remove_all (priv->parameters);
1084 empathy_account_settings_free_unset_parameters (settings);
1089 empathy_account_settings_apply_finish (EmpathyAccountSettings *settings,
1090 GAsyncResult *result,
1093 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
1097 g_return_val_if_fail (g_simple_async_result_is_valid (result,
1098 G_OBJECT (settings), empathy_account_settings_apply_finish), FALSE);
1104 empathy_account_settings_has_account (EmpathyAccountSettings *settings,
1105 EmpathyAccount *account)
1107 EmpathyAccountSettingsPriv *priv;
1109 g_return_val_if_fail (EMPATHY_IS_ACCOUNT_SETTINGS (settings), FALSE);
1110 g_return_val_if_fail (EMPATHY_IS_ACCOUNT (account), FALSE);
1112 priv = GET_PRIV (settings);
1114 return (account == priv->account);
1118 empathy_account_settings_is_valid (EmpathyAccountSettings *settings)
1120 EmpathyAccountSettingsPriv *priv;
1123 gboolean missed = FALSE;
1125 g_return_val_if_fail (EMPATHY_IS_ACCOUNT_SETTINGS (settings), FALSE);
1127 priv = GET_PRIV (settings);
1129 for (idx = 0; idx < priv->required_params->len; idx++)
1131 current = g_array_index (priv->required_params, gchar *, idx);
1133 /* first, look if it's set in our own parameters */
1134 if (tp_asv_lookup (priv->parameters, current))
1137 /* if we did not unset the parameter, look if it's in the account */
1138 if (priv->account != NULL &&
1139 !empathy_account_settings_is_unset (settings, current))
1141 const GHashTable *account_params;
1143 account_params = empathy_account_get_parameters (priv->account);
1144 if (tp_asv_lookup (account_params, current))