Mercurial > pidgin
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 } |