comparison libpurple/account.c @ 21366:8858a42ca237

Make PurpleAccount keep track of the last connection error suffered (or not, if the account is happily connected or is disconnected without error). Add a signal which fires when the current error changes, and an accessor to get the current error. The error itself is stored inside a private struct.
author Will Thompson <will.thompson@collabora.co.uk>
date Sat, 27 Oct 2007 17:26:17 +0000
parents a20ef7180680
children 0aa18e21a595
comparison
equal deleted inserted replaced
21365:3a269007711e 21366:8858a42ca237
39 #include "signals.h" 39 #include "signals.h"
40 #include "status.h" 40 #include "status.h"
41 #include "util.h" 41 #include "util.h"
42 #include "xmlnode.h" 42 #include "xmlnode.h"
43 43
44 typedef struct
45 {
46 PurpleAccountCurrentError *current_error;
47 } PurpleAccountPrivate;
48
49 #define PURPLE_ACCOUNT_GET_PRIVATE(account) \
50 ((PurpleAccountPrivate *) (account->priv))
51
44 /* TODO: Should use PurpleValue instead of this? What about "ui"? */ 52 /* TODO: Should use PurpleValue instead of this? What about "ui"? */
45 typedef struct 53 typedef struct
46 { 54 {
47 PurplePrefType type; 55 PurplePrefType type;
48 56
74 static GList *accounts = NULL; 82 static GList *accounts = NULL;
75 static guint save_timer = 0; 83 static guint save_timer = 0;
76 static gboolean accounts_loaded = FALSE; 84 static gboolean accounts_loaded = FALSE;
77 85
78 static GList *handles = NULL; 86 static GList *handles = NULL;
87
88 static void clear_current_error(PurpleAccount *account);
79 89
80 /********************************************************************* 90 /*********************************************************************
81 * Writing to disk * 91 * Writing to disk *
82 *********************************************************************/ 92 *********************************************************************/
83 93
825 835
826 PurpleAccount * 836 PurpleAccount *
827 purple_account_new(const char *username, const char *protocol_id) 837 purple_account_new(const char *username, const char *protocol_id)
828 { 838 {
829 PurpleAccount *account = NULL; 839 PurpleAccount *account = NULL;
840 PurpleAccountPrivate *priv = NULL;
830 PurplePlugin *prpl = NULL; 841 PurplePlugin *prpl = NULL;
831 PurplePluginProtocolInfo *prpl_info = NULL; 842 PurplePluginProtocolInfo *prpl_info = NULL;
832 PurpleStatusType *status_type; 843 PurpleStatusType *status_type;
833 844
834 g_return_val_if_fail(username != NULL, NULL); 845 g_return_val_if_fail(username != NULL, NULL);
839 if (account != NULL) 850 if (account != NULL)
840 return account; 851 return account;
841 852
842 account = g_new0(PurpleAccount, 1); 853 account = g_new0(PurpleAccount, 1);
843 PURPLE_DBUS_REGISTER_POINTER(account, PurpleAccount); 854 PURPLE_DBUS_REGISTER_POINTER(account, PurpleAccount);
855 priv = g_new0(PurpleAccountPrivate, 1);
856 account->priv = priv;
844 857
845 purple_account_set_username(account, username); 858 purple_account_set_username(account, username);
846 859
847 purple_account_set_protocol_id(account, protocol_id); 860 purple_account_set_protocol_id(account, protocol_id);
848 861
879 } 892 }
880 893
881 void 894 void
882 purple_account_destroy(PurpleAccount *account) 895 purple_account_destroy(PurpleAccount *account)
883 { 896 {
897 PurpleAccountPrivate *priv = NULL;
884 GList *l; 898 GList *l;
885 899
886 g_return_if_fail(account != NULL); 900 g_return_if_fail(account != NULL);
887 901
888 purple_debug_info("account", "Destroying account %p\n", account); 902 purple_debug_info("account", "Destroying account %p\n", account);
909 923
910 purple_presence_destroy(account->presence); 924 purple_presence_destroy(account->presence);
911 925
912 if(account->system_log) 926 if(account->system_log)
913 purple_log_free(account->system_log); 927 purple_log_free(account->system_log);
928
929 priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
930 g_free(priv->current_error);
931 g_free(priv);
914 932
915 PURPLE_DBUS_UNREGISTER_POINTER(account); 933 PURPLE_DBUS_UNREGISTER_POINTER(account);
916 g_free(account); 934 g_free(account);
917 } 935 }
918 936
2212 if (!prpl_info || !prpl_info->offline_message) 2230 if (!prpl_info || !prpl_info->offline_message)
2213 return FALSE; 2231 return FALSE;
2214 return prpl_info->offline_message(buddy); 2232 return prpl_info->offline_message(buddy);
2215 } 2233 }
2216 2234
2235 static void
2236 clear_current_error(PurpleAccount *account)
2237 {
2238 PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
2239 if (priv->current_error)
2240 {
2241 g_free (priv->current_error);
2242 priv->current_error = NULL;
2243 }
2244
2245 purple_signal_emit(purple_accounts_get_handle(), "account-error-changed",
2246 account, priv->current_error);
2247 }
2248
2249 static void
2250 signed_on_cb(PurpleConnection *gc,
2251 gpointer unused)
2252 {
2253 PurpleAccount *account = purple_connection_get_account(gc);
2254 clear_current_error(account);
2255 }
2256
2257 static void
2258 connection_error_cb(PurpleConnection *gc,
2259 PurpleConnectionError err,
2260 const gchar *desc,
2261 gpointer unused)
2262 {
2263 PurpleAccount *account = purple_connection_get_account(gc);
2264 PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
2265
2266 if (!priv->current_error)
2267 priv->current_error = g_new0(PurpleAccountCurrentError, 1);
2268 priv->current_error->reason = err;
2269 priv->current_error->description = desc;
2270
2271 purple_signal_emit(purple_accounts_get_handle(), "account-error-changed",
2272 account, priv->current_error);
2273 }
2274
2275 const PurpleAccountCurrentError *
2276 purple_account_get_current_error(PurpleAccount *account)
2277 {
2278 PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
2279 return priv->current_error;
2280 }
2281
2217 void 2282 void
2218 purple_accounts_add(PurpleAccount *account) 2283 purple_accounts_add(PurpleAccount *account)
2219 { 2284 {
2220 g_return_if_fail(account != NULL); 2285 g_return_if_fail(account != NULL);
2221 2286
2236 2301
2237 accounts = g_list_remove(accounts, account); 2302 accounts = g_list_remove(accounts, account);
2238 2303
2239 schedule_accounts_save(); 2304 schedule_accounts_save();
2240 2305
2306 clear_current_error(account);
2241 purple_signal_emit(purple_accounts_get_handle(), "account-removed", account); 2307 purple_signal_emit(purple_accounts_get_handle(), "account-removed", account);
2242 } 2308 }
2243 2309
2244 void 2310 void
2245 purple_accounts_delete(PurpleAccount *account) 2311 purple_accounts_delete(PurpleAccount *account)
2441 2507
2442 void 2508 void
2443 purple_accounts_init(void) 2509 purple_accounts_init(void)
2444 { 2510 {
2445 void *handle = purple_accounts_get_handle(); 2511 void *handle = purple_accounts_get_handle();
2512 void *conn_handle = purple_connections_get_handle();
2446 2513
2447 purple_signal_register(handle, "account-connecting", 2514 purple_signal_register(handle, "account-connecting",
2448 purple_marshal_VOID__POINTER, NULL, 1, 2515 purple_marshal_VOID__POINTER, NULL, 1,
2449 purple_value_new(PURPLE_TYPE_SUBTYPE, 2516 purple_value_new(PURPLE_TYPE_SUBTYPE,
2450 PURPLE_SUBTYPE_ACCOUNT)); 2517 PURPLE_SUBTYPE_ACCOUNT));
2511 purple_marshal_VOID__POINTER_POINTER, NULL, 2, 2578 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
2512 purple_value_new(PURPLE_TYPE_SUBTYPE, 2579 purple_value_new(PURPLE_TYPE_SUBTYPE,
2513 PURPLE_SUBTYPE_ACCOUNT), 2580 PURPLE_SUBTYPE_ACCOUNT),
2514 purple_value_new(PURPLE_TYPE_STRING)); 2581 purple_value_new(PURPLE_TYPE_STRING));
2515 2582
2583 purple_signal_register(handle, "account-error-changed",
2584 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
2585 purple_value_new(PURPLE_TYPE_SUBTYPE,
2586 PURPLE_SUBTYPE_ACCOUNT),
2587 purple_value_new(PURPLE_TYPE_POINTER));
2588
2589 purple_signal_connect(conn_handle, "signed-on", handle,
2590 PURPLE_CALLBACK(signed_on_cb), NULL);
2591
2516 load_accounts(); 2592 load_accounts();
2517 2593
2518 } 2594 }
2519 2595
2520 void 2596 void
2521 purple_accounts_uninit(void) 2597 purple_accounts_uninit(void)
2522 { 2598 {
2599 gpointer handle = purple_accounts_get_handle();
2523 if (save_timer != 0) 2600 if (save_timer != 0)
2524 { 2601 {
2525 purple_timeout_remove(save_timer); 2602 purple_timeout_remove(save_timer);
2526 save_timer = 0; 2603 save_timer = 0;
2527 sync_accounts(); 2604 sync_accounts();
2528 } 2605 }
2529 2606
2530 purple_signals_unregister_by_instance(purple_accounts_get_handle()); 2607 purple_signals_disconnect_by_handle(handle);
2531 } 2608 purple_signals_unregister_by_instance(handle);
2609 }