Mercurial > pidgin
annotate src/gtkconn.c @ 13708:76d8b0032f50
[gaim-migrate @ 16112]
CID 150:
The value returned from strstr was never used. I've used it as the starting point in the search for the equals sign. That is probably was what intended and makes more sense.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Mon, 01 May 2006 19:48:57 +0000 |
parents | 6818e4fc3616 |
children | 2eea3265dbe6 |
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); | |
13015 | 87 gaim_gtk_blist_update_account_error_state(account, NULL); |
13014 | 88 } |
5717 | 89 } |
90 | |
13014 | 91 static void |
92 gaim_gtk_connection_disconnected(GaimConnection *gc) | |
5717 | 93 { |
10643 | 94 GaimGtkBuddyList *gtkblist = gaim_gtk_blist_get_default_gtk_blist(); |
95 if (!gtkblist) | |
96 return; | |
97 gtk_gaim_status_box_set_connecting(GTK_GAIM_STATUS_BOX(gtkblist->statusbox), | |
98 (gaim_connections_get_connecting() != NULL)); | |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
99 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
100 if (gaim_connections_get_all() != NULL) |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
101 return; |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
102 |
9730 | 103 gaim_gtkdialogs_destroy_all(); |
5717 | 104 } |
105 | |
13014 | 106 static void |
107 gaim_gtk_connection_notice(GaimConnection *gc, | |
5717 | 108 const char *text) |
109 { | |
110 } | |
111 | |
7912 | 112 |
11523 | 113 static void |
114 free_auto_recon(gpointer data) | |
7493 | 115 { |
11523 | 116 GaimAutoRecon *info = data; |
7912 | 117 |
11523 | 118 if (info->timeout != 0) |
119 g_source_remove(info->timeout); | |
7912 | 120 |
11523 | 121 g_free(info); |
7493 | 122 } |
123 | |
11523 | 124 static gboolean |
125 do_signon(gpointer data) | |
7912 | 126 { |
11523 | 127 GaimAccount *account = data; |
128 GaimAutoRecon *info; | |
13374 | 129 GaimStatus *status; |
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 |
13374 | 138 status = gaim_account_get_active_status(account); |
139 if (gaim_status_is_online(status)) | |
140 { | |
141 gaim_debug_info("autorecon", "calling gaim_account_connect\n"); | |
142 gaim_account_connect(account); | |
143 gaim_debug_info("autorecon", "done calling gaim_account_connect\n"); | |
144 } | |
7912 | 145 |
11523 | 146 return FALSE; |
7912 | 147 } |
148 | |
13014 | 149 static void |
150 gaim_gtk_connection_report_disconnect(GaimConnection *gc, const char *text) | |
7399 | 151 { |
7431 | 152 GaimAccount *account = NULL; |
11523 | 153 GaimAutoRecon *info; |
13013 | 154 GSList* errored_account; |
7808 | 155 |
11523 | 156 account = gaim_connection_get_account(gc); |
157 info = g_hash_table_lookup(hash, account); | |
13014 | 158 errored_account = g_hash_table_lookup(errored_accounts, account); |
7912 | 159 |
13031 | 160 gaim_gtk_blist_update_account_error_state(account, text); |
11523 | 161 if (!gc->wants_to_die) { |
12009 | 162 if (info == NULL) { |
11523 | 163 info = g_new0(GaimAutoRecon, 1); |
164 g_hash_table_insert(hash, account, info); | |
165 info->delay = INITIAL_RECON_DELAY; | |
7483 | 166 } else { |
11523 | 167 info->delay = MIN(2 * info->delay, MAX_RECON_DELAY); |
168 if (info->timeout != 0) | |
169 g_source_remove(info->timeout); | |
7483 | 170 } |
11523 | 171 info->timeout = g_timeout_add(info->delay, do_signon, account); |
7912 | 172 |
13014 | 173 g_hash_table_insert(errored_accounts, account, NULL); |
11559 | 174 } else { |
13014 | 175 char *p, *s, *n=NULL ; |
176 if (info != NULL) | |
177 g_hash_table_remove(hash, account); | |
11721 | 178 |
13014 | 179 if (errored_account != NULL) |
180 g_hash_table_remove(errored_accounts, errored_account); | |
11721 | 181 |
13014 | 182 if (gaim_account_get_alias(account)) |
183 { | |
184 n = g_strdup_printf("%s (%s) (%s)", | |
185 gaim_account_get_username(account), | |
186 gaim_account_get_alias(account), | |
187 gaim_account_get_protocol_name(account)); | |
188 } | |
189 else | |
190 { | |
191 n = g_strdup_printf("%s (%s)", | |
192 gaim_account_get_username(account), | |
193 gaim_account_get_protocol_name(account)); | |
194 } | |
11721 | 195 |
13014 | 196 p = g_strdup_printf(_("%s disconnected"), n); |
13128 | 197 s = g_strdup_printf(_("%s was disconnected due to an error: %s\n" |
198 "Gaim will not attempt to reconnect the account until you " | |
13541
6818e4fc3616
[gaim-migrate @ 15918]
Richard Laager <rlaager@wiktel.com>
parents:
13374
diff
changeset
|
199 "correct the error and re-enable the account."), n, text); |
13014 | 200 gaim_notify_error(NULL, NULL, p, s); |
201 g_free(p); | |
202 g_free(s); | |
203 g_free(n); | |
204 | |
205 /* | |
206 * TODO: Do we really want to disable the account when it's | |
207 * disconnected by wants_to_die? This happens when you sign | |
208 * on from somewhere else, or when you enter an invalid password. | |
209 */ | |
210 gaim_account_set_enabled(account, GAIM_GTK_UI, FALSE); | |
7399 | 211 } |
212 } | |
213 | |
5717 | 214 static GaimConnectionUiOps conn_ui_ops = |
215 { | |
216 gaim_gtk_connection_connect_progress, | |
217 gaim_gtk_connection_connected, | |
218 gaim_gtk_connection_disconnected, | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
219 gaim_gtk_connection_notice, |
11523 | 220 gaim_gtk_connection_report_disconnect, |
5717 | 221 }; |
222 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
223 GaimConnectionUiOps * |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
224 gaim_gtk_connections_get_ui_ops(void) |
5717 | 225 { |
226 return &conn_ui_ops; | |
227 } | |
13014 | 228 |
229 static void | |
230 account_removed_cb(GaimAccount *account, gpointer user_data) | |
231 { | |
232 g_hash_table_remove(hash, account); | |
233 | |
234 if (g_hash_table_size(errored_accounts) > 0) | |
235 { | |
236 g_hash_table_remove(errored_accounts, account); | |
13015 | 237 gaim_gtk_blist_update_account_error_state(account, NULL); |
13014 | 238 } |
239 } | |
240 | |
241 | |
242 /************************************************************************** | |
243 * GTK+ connection glue | |
244 **************************************************************************/ | |
245 | |
246 void * | |
247 gaim_gtk_connection_get_handle(void) | |
248 { | |
249 static int handle; | |
250 | |
251 return &handle; | |
252 } | |
253 | |
254 void | |
255 gaim_gtk_connection_init(void) | |
256 { | |
257 hash = g_hash_table_new_full( | |
258 g_direct_hash, g_direct_equal, | |
259 NULL, free_auto_recon); | |
260 errored_accounts = g_hash_table_new_full( | |
261 g_direct_hash, g_direct_equal, | |
262 NULL, NULL); | |
263 | |
264 gaim_signal_connect(gaim_accounts_get_handle(), "account-removed", | |
265 gaim_gtk_connection_get_handle(), | |
266 GAIM_CALLBACK(account_removed_cb), NULL); | |
267 } | |
268 | |
269 void | |
270 gaim_gtk_connection_uninit(void) | |
271 { | |
272 gaim_signals_disconnect_by_handle(gaim_gtk_connection_get_handle()); | |
273 | |
274 g_hash_table_destroy(hash); | |
275 g_hash_table_destroy(errored_accounts); | |
276 } |