Mercurial > pidgin
annotate src/gtkconn.c @ 13014:5efbb0162f86
[gaim-migrate @ 15367]
I don't expect any of this to be controversial.
* Some comment and other small changes.
* Changed gtkconn.c to store the list of errored accounts in a hash
table instead of a glist
* Added init and uninit functions to gtkconn.c. They're used to create
and destroy the two hash tables used within that file.
* Also use the new init and uninit functions to connect to the account
deleted signal so that we clear out the old error message if we delete
an account that had an error while connecting.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 23 Jan 2006 06:54:29 +0000 |
parents | 8fe78402c010 |
children | 2d71d4081e06 |
rev | line source |
---|---|
5717 | 1 /* |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10211
diff
changeset
|
2 * @file gtkconn.c GTK+ Connection API |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10211
diff
changeset
|
3 * @ingroup gtkui |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10211
diff
changeset
|
4 * |
5717 | 5 * gaim |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
5717 | 10 * |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
9791 | 25 #include "internal.h" |
26 #include "gtkgaim.h" | |
5717 | 27 |
28 #include "account.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
29 #include "debug.h" |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
30 #include "notify.h" |
6216 | 31 #include "prefs.h" |
10643 | 32 #include "gtkblist.h" |
12404
7c7cb03e5475
[gaim-migrate @ 14711]
Richard Laager <rlaager@wiktel.com>
parents:
12296
diff
changeset
|
33 #include "gtkconn.h" |
7c7cb03e5475
[gaim-migrate @ 14711]
Richard Laager <rlaager@wiktel.com>
parents:
12296
diff
changeset
|
34 #include "gtkdialogs.h" |
10643 | 35 #include "gtkstatusbox.h" |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10211
diff
changeset
|
36 #include "gtkstock.h" |
12404
7c7cb03e5475
[gaim-migrate @ 14711]
Richard Laager <rlaager@wiktel.com>
parents:
12296
diff
changeset
|
37 #include "gtkutils.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
38 #include "util.h" |
5717 | 39 |
11523 | 40 #define INITIAL_RECON_DELAY 8000 |
11721 | 41 #define MAX_RECON_DELAY 600000 |
11523 | 42 |
43 typedef struct { | |
44 int delay; | |
45 guint timeout; | |
46 } GaimAutoRecon; | |
47 | |
13014 | 48 /** |
49 * Contains accounts that are auto-reconnecting. | |
50 * The key is a pointer to the GaimAccount and the | |
51 * value is a pointer to a GaimAutoRecon. | |
13013 | 52 */ |
13014 | 53 static GHashTable *hash = NULL; |
54 static GHashTable *errored_accounts = NULL; | |
11523 | 55 |
13014 | 56 static void |
57 gaim_gtk_connection_connect_progress(GaimConnection *gc, | |
5717 | 58 const char *text, size_t step, size_t step_count) |
59 { | |
10643 | 60 GaimGtkBuddyList *gtkblist = gaim_gtk_blist_get_default_gtk_blist(); |
61 if (!gtkblist) | |
62 return; | |
63 gtk_gaim_status_box_set_connecting(GTK_GAIM_STATUS_BOX(gtkblist->statusbox), | |
64 (gaim_connections_get_connecting() != NULL)); | |
65 gtk_gaim_status_box_pulse_connecting(GTK_GAIM_STATUS_BOX(gtkblist->statusbox)); | |
5717 | 66 } |
67 | |
13014 | 68 static void |
69 gaim_gtk_connection_connected(GaimConnection *gc) | |
5717 | 70 { |
13014 | 71 GaimAccount *account; |
72 GaimGtkBuddyList *gtkblist; | |
73 | |
74 account = gaim_connection_get_account(gc); | |
75 gtkblist = gaim_gtk_blist_get_default_gtk_blist(); | |
76 | |
77 if (gtkblist != NULL) | |
78 gtk_gaim_status_box_set_connecting(GTK_GAIM_STATUS_BOX(gtkblist->statusbox), | |
10643 | 79 (gaim_connections_get_connecting() != NULL)); |
12607 | 80 |
11536 | 81 if (hash != NULL) |
82 g_hash_table_remove(hash, account); | |
13014 | 83 |
84 if (g_hash_table_size(errored_accounts) > 0) | |
85 { | |
86 g_hash_table_remove(errored_accounts, account); | |
87 if (g_hash_table_size(errored_accounts) == 0) | |
88 gtk_gaim_status_box_set_error(GTK_GAIM_STATUS_BOX(gtkblist->statusbox), NULL); | |
89 } | |
5717 | 90 } |
91 | |
13014 | 92 static void |
93 gaim_gtk_connection_disconnected(GaimConnection *gc) | |
5717 | 94 { |
10643 | 95 GaimGtkBuddyList *gtkblist = gaim_gtk_blist_get_default_gtk_blist(); |
96 if (!gtkblist) | |
97 return; | |
98 gtk_gaim_status_box_set_connecting(GTK_GAIM_STATUS_BOX(gtkblist->statusbox), | |
99 (gaim_connections_get_connecting() != NULL)); | |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
100 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
101 if (gaim_connections_get_all() != NULL) |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
102 return; |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
103 |
9730 | 104 gaim_gtkdialogs_destroy_all(); |
5717 | 105 } |
106 | |
13014 | 107 static void |
108 gaim_gtk_connection_notice(GaimConnection *gc, | |
5717 | 109 const char *text) |
110 { | |
111 } | |
112 | |
7912 | 113 |
11523 | 114 static void |
115 free_auto_recon(gpointer data) | |
7493 | 116 { |
11523 | 117 GaimAutoRecon *info = data; |
7912 | 118 |
11523 | 119 if (info->timeout != 0) |
120 g_source_remove(info->timeout); | |
7912 | 121 |
11523 | 122 g_free(info); |
7493 | 123 } |
124 | |
11523 | 125 static gboolean |
126 do_signon(gpointer data) | |
7912 | 127 { |
11523 | 128 GaimAccount *account = data; |
129 GaimAutoRecon *info; | |
10916 | 130 |
13014 | 131 gaim_debug_info("autorecon", "do_signon called\n"); |
11523 | 132 g_return_val_if_fail(account != NULL, FALSE); |
133 info = g_hash_table_lookup(hash, account); | |
7912 | 134 |
11523 | 135 if (info) |
136 info->timeout = 0; | |
7912 | 137 |
13014 | 138 gaim_debug_info("autorecon", "calling gaim_account_connect\n"); |
11523 | 139 gaim_account_connect(account); |
13014 | 140 gaim_debug_info("autorecon", "done calling gaim_account_connect\n"); |
7912 | 141 |
11523 | 142 return FALSE; |
7912 | 143 } |
144 | |
13014 | 145 static void |
146 gaim_gtk_connection_report_disconnect(GaimConnection *gc, const char *text) | |
7399 | 147 { |
12009 | 148 GaimGtkBuddyList *gtkblist = gaim_gtk_blist_get_default_gtk_blist(); |
7431 | 149 GaimAccount *account = NULL; |
11523 | 150 GaimAutoRecon *info; |
13013 | 151 GSList* errored_account; |
7808 | 152 |
11523 | 153 account = gaim_connection_get_account(gc); |
154 info = g_hash_table_lookup(hash, account); | |
13014 | 155 errored_account = g_hash_table_lookup(errored_accounts, account); |
7912 | 156 |
11523 | 157 if (!gc->wants_to_die) { |
12009 | 158 if (gtkblist != NULL) |
159 gtk_gaim_status_box_set_error(GTK_GAIM_STATUS_BOX(gtkblist->statusbox), text); | |
13013 | 160 |
12009 | 161 if (info == NULL) { |
11523 | 162 info = g_new0(GaimAutoRecon, 1); |
163 g_hash_table_insert(hash, account, info); | |
164 info->delay = INITIAL_RECON_DELAY; | |
7483 | 165 } else { |
11523 | 166 info->delay = MIN(2 * info->delay, MAX_RECON_DELAY); |
167 if (info->timeout != 0) | |
168 g_source_remove(info->timeout); | |
7483 | 169 } |
11523 | 170 info->timeout = g_timeout_add(info->delay, do_signon, account); |
7912 | 171 |
13014 | 172 g_hash_table_insert(errored_accounts, account, NULL); |
11559 | 173 } else { |
13014 | 174 char *p, *s, *n=NULL ; |
175 if (info != NULL) | |
176 g_hash_table_remove(hash, account); | |
11721 | 177 |
13014 | 178 if (errored_account != NULL) |
179 g_hash_table_remove(errored_accounts, errored_account); | |
11721 | 180 |
13014 | 181 if (gaim_account_get_alias(account)) |
182 { | |
183 n = g_strdup_printf("%s (%s) (%s)", | |
184 gaim_account_get_username(account), | |
185 gaim_account_get_alias(account), | |
186 gaim_account_get_protocol_name(account)); | |
187 } | |
188 else | |
189 { | |
190 n = g_strdup_printf("%s (%s)", | |
191 gaim_account_get_username(account), | |
192 gaim_account_get_protocol_name(account)); | |
193 } | |
11721 | 194 |
13014 | 195 p = g_strdup_printf(_("%s disconnected"), n); |
196 s = g_strdup_printf(_("%s was disconnected due to an error. %s The account has been disabled. " | |
197 "Correct the error and reenable the account to connect."), n, text); | |
198 gaim_notify_error(NULL, NULL, p, s); | |
199 g_free(p); | |
200 g_free(s); | |
201 g_free(n); | |
202 | |
203 /* | |
204 * TODO: Do we really want to disable the account when it's | |
205 * disconnected by wants_to_die? This happens when you sign | |
206 * on from somewhere else, or when you enter an invalid password. | |
207 */ | |
208 gaim_account_set_enabled(account, GAIM_GTK_UI, FALSE); | |
7399 | 209 } |
210 } | |
211 | |
5717 | 212 static GaimConnectionUiOps conn_ui_ops = |
213 { | |
214 gaim_gtk_connection_connect_progress, | |
215 gaim_gtk_connection_connected, | |
216 gaim_gtk_connection_disconnected, | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
217 gaim_gtk_connection_notice, |
11523 | 218 gaim_gtk_connection_report_disconnect, |
5717 | 219 }; |
220 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
221 GaimConnectionUiOps * |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
222 gaim_gtk_connections_get_ui_ops(void) |
5717 | 223 { |
224 return &conn_ui_ops; | |
225 } | |
13014 | 226 |
227 static void | |
228 account_removed_cb(GaimAccount *account, gpointer user_data) | |
229 { | |
230 g_hash_table_remove(hash, account); | |
231 | |
232 if (g_hash_table_size(errored_accounts) > 0) | |
233 { | |
234 g_hash_table_remove(errored_accounts, account); | |
235 if (g_hash_table_size(errored_accounts) == 0) | |
236 { | |
237 GaimGtkBuddyList *gtkblist; | |
238 | |
239 gtkblist = gaim_gtk_blist_get_default_gtk_blist(); | |
240 if (gtkblist != NULL) | |
241 gtk_gaim_status_box_set_error(GTK_GAIM_STATUS_BOX(gtkblist->statusbox), NULL); | |
242 } | |
243 } | |
244 } | |
245 | |
246 | |
247 /************************************************************************** | |
248 * GTK+ connection glue | |
249 **************************************************************************/ | |
250 | |
251 void * | |
252 gaim_gtk_connection_get_handle(void) | |
253 { | |
254 static int handle; | |
255 | |
256 return &handle; | |
257 } | |
258 | |
259 void | |
260 gaim_gtk_connection_init(void) | |
261 { | |
262 hash = g_hash_table_new_full( | |
263 g_direct_hash, g_direct_equal, | |
264 NULL, free_auto_recon); | |
265 errored_accounts = g_hash_table_new_full( | |
266 g_direct_hash, g_direct_equal, | |
267 NULL, NULL); | |
268 | |
269 gaim_signal_connect(gaim_accounts_get_handle(), "account-removed", | |
270 gaim_gtk_connection_get_handle(), | |
271 GAIM_CALLBACK(account_removed_cb), NULL); | |
272 } | |
273 | |
274 void | |
275 gaim_gtk_connection_uninit(void) | |
276 { | |
277 gaim_signals_disconnect_by_handle(gaim_gtk_connection_get_handle()); | |
278 | |
279 g_hash_table_destroy(hash); | |
280 g_hash_table_destroy(errored_accounts); | |
281 } |