Mercurial > pidgin
annotate plugins/autorecon.c @ 9006:bffe8d1adb8b
[gaim-migrate @ 9782]
This tries to fix that click on about's imhtml and random selection bug.
It fails.
It's somewhat less noticable about now though, you have to scroll and then
click, and instead of just click.
committer: Tailor Script <tailor@pidgin.im>
author | Tim Ringenbach <marv@pidgin.im> |
---|---|
date | Sat, 22 May 2004 04:39:44 +0000 |
parents | 294ae6548d4e |
children | ebbe4390f75b |
rev | line source |
---|---|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
1 #include "internal.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
2 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
3 #include "connection.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
4 #include "debug.h" |
8774 | 5 #include "pluginpref.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
6 #include "prpl.h" |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
7 #include "signals.h" |
4202
59751fe608c5
[gaim-migrate @ 4438]
Christian Hammond <chipx86@chipx86.com>
parents:
4113
diff
changeset
|
8 |
8774 | 9 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
10 #define AUTORECON_PLUGIN_ID "core-autorecon" |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
11 |
2216
66783ad29e55
[gaim-migrate @ 2226]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1818
diff
changeset
|
12 #define INITIAL 8000 |
4590 | 13 #define MAXTIME 2048000 |
2216
66783ad29e55
[gaim-migrate @ 2226]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1818
diff
changeset
|
14 |
8774 | 15 |
6113 | 16 typedef struct { |
17 int delay; | |
18 guint timeout; | |
19 } GaimAutoRecon; | |
2216
66783ad29e55
[gaim-migrate @ 2226]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1818
diff
changeset
|
20 |
6113 | 21 static GHashTable *hash = NULL; |
99 | 22 |
8774 | 23 |
24 #define AUTORECON_OPT "/plugins/core/autorecon" | |
25 #define OPT_HIDE_CONNECTED AUTORECON_OPT "/hide_connected_error" | |
26 #define OPT_HIDE_CONNECTING AUTORECON_OPT "/hide_connecting_error" | |
27 | |
28 | |
29 /* storage of original (old_ops) and modified (new_ops) ui ops to allow us to | |
30 intercept calls to report_disconnect */ | |
31 static GaimConnectionUiOps *old_ops = NULL; | |
32 static GaimConnectionUiOps *new_ops = NULL; | |
33 | |
34 | |
35 static void report_disconnect(GaimConnection *gc, const char *text) { | |
36 | |
37 if(old_ops == NULL || old_ops->report_disconnect == NULL) { | |
38 /* there's nothing to call through to, so don't bother | |
39 checking prefs */ | |
40 return; | |
41 | |
42 } else if(gc->state == GAIM_CONNECTED | |
43 && gaim_prefs_get_bool(OPT_HIDE_CONNECTED)) { | |
44 /* this is a connected error, and we're hiding those */ | |
45 gaim_debug(GAIM_DEBUG_INFO, "autorecon", | |
46 "hid disconnect error message\n"); | |
47 return; | |
48 | |
49 } else if(gc->state == GAIM_CONNECTING | |
50 && gaim_prefs_get_bool(OPT_HIDE_CONNECTING)) { | |
51 /* this is a connecting error, and we're hiding those */ | |
52 gaim_debug(GAIM_DEBUG_INFO, "autorecon", | |
53 "hid error message while connecting\n"); | |
54 return; | |
55 } | |
56 | |
57 /* if we haven't returned by now, then let's pass to the real | |
58 function */ | |
59 old_ops->report_disconnect(gc, text); | |
60 } | |
61 | |
62 | |
2216
66783ad29e55
[gaim-migrate @ 2226]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1818
diff
changeset
|
63 static gboolean do_signon(gpointer data) { |
5587
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
64 GaimAccount *account = data; |
6113 | 65 GaimAutoRecon *info; |
66 | |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
67 gaim_debug(GAIM_DEBUG_INFO, "autorecon", "do_signon called\n"); |
6113 | 68 g_return_val_if_fail(account != NULL, FALSE); |
69 info = g_hash_table_lookup(hash, account); | |
4494
b5a50a6a13b0
[gaim-migrate @ 4769]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4491
diff
changeset
|
70 |
5607 | 71 if (g_list_index(gaim_accounts_get_all(), account) < 0) |
1817
b367beee6448
[gaim-migrate @ 1827]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1404
diff
changeset
|
72 return FALSE; |
6113 | 73 |
7372 | 74 if(info) |
75 info->timeout = 0; | |
76 | |
5587
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
77 gaim_debug(GAIM_DEBUG_INFO, "autorecon", "calling gaim_account_connect\n"); |
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
78 gaim_account_connect(account); |
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
79 gaim_debug(GAIM_DEBUG_INFO, "autorecon", "done calling gaim_account_connect\n"); |
6113 | 80 |
1817
b367beee6448
[gaim-migrate @ 1827]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1404
diff
changeset
|
81 return FALSE; |
1378
aedeb1218a0a
[gaim-migrate @ 1388]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1165
diff
changeset
|
82 } |
aedeb1218a0a
[gaim-migrate @ 1388]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1165
diff
changeset
|
83 |
8774 | 84 |
5587
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
85 static void reconnect(GaimConnection *gc, void *m) { |
6113 | 86 GaimAccount *account; |
87 GaimAutoRecon *info; | |
88 | |
89 g_return_if_fail(gc != NULL); | |
90 account = gaim_connection_get_account(gc); | |
91 info = g_hash_table_lookup(hash, account); | |
92 | |
2216
66783ad29e55
[gaim-migrate @ 2226]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1818
diff
changeset
|
93 if (!gc->wants_to_die) { |
6113 | 94 if (info == NULL) { |
95 info = g_new0(GaimAutoRecon, 1); | |
96 g_hash_table_insert(hash, account, info); | |
97 info->delay = INITIAL; | |
8249 | 98 } else { |
6113 | 99 info->delay = MIN(2 * info->delay, MAXTIME); |
8250 | 100 if (info->timeout != 0) |
101 g_source_remove(info->timeout); | |
8249 | 102 } |
6113 | 103 info->timeout = g_timeout_add(info->delay, do_signon, account); |
104 } else if (info != NULL) { | |
105 g_hash_table_remove(hash, account); | |
2216
66783ad29e55
[gaim-migrate @ 2226]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1818
diff
changeset
|
106 } |
99 | 107 } |
108 | |
8774 | 109 |
6113 | 110 static void |
111 free_auto_recon(gpointer data) | |
112 { | |
113 GaimAutoRecon *info = data; | |
114 | |
115 if (info->timeout != 0) | |
116 g_source_remove(info->timeout); | |
117 | |
118 g_free(info); | |
119 } | |
120 | |
8774 | 121 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
122 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
123 plugin_load(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
124 { |
8774 | 125 |
126 /* this was the suggested way to override a single function of the | |
127 real ui ops. However, there's a mild concern of having more than one | |
128 bit of code making a new ui op call-through copy. If plugins A and B | |
129 both override the ui ops (in that order), B thinks that the | |
130 overridden ui ops A created was the original. If A unloads first, | |
131 and swaps out and frees its overridden version, then B is calling | |
132 through to a free'd ui op. There needs to be a way to "stack up" | |
133 overridden ui ops or something... I have a good idea of how to write | |
134 such a creature if someone wants it done. - siege 2004-04-20 */ | |
135 | |
136 /* get old ops, make a copy with a minor change */ | |
137 old_ops = gaim_connections_get_ui_ops(); | |
138 new_ops = (GaimConnectionUiOps *) g_memdup(old_ops, | |
139 sizeof(GaimConnectionUiOps)); | |
140 new_ops->report_disconnect = report_disconnect; | |
141 gaim_connections_set_ui_ops(new_ops); | |
142 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
143 hash = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, |
8774 | 144 free_auto_recon); |
3630 | 145 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
146 gaim_signal_connect(gaim_connections_get_handle(), "signed-off", |
8774 | 147 plugin, GAIM_CALLBACK(reconnect), NULL); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
148 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
149 return TRUE; |
3802 | 150 } |
151 | |
8774 | 152 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
153 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
154 plugin_unload(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
155 { |
8243 | 156 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-off", |
157 plugin, GAIM_CALLBACK(reconnect)); | |
158 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
159 g_hash_table_destroy(hash); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
160 hash = NULL; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
161 |
8774 | 162 gaim_connections_set_ui_ops(old_ops); |
163 g_free(new_ops); | |
164 old_ops = new_ops = NULL; | |
165 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
166 return TRUE; |
3630 | 167 } |
168 | |
8774 | 169 |
170 static GaimPluginPrefFrame *get_plugin_pref_frame(GaimPlugin *plugin) { | |
171 GaimPluginPrefFrame *frame = gaim_plugin_pref_frame_new(); | |
172 GaimPluginPref *pref; | |
173 | |
174 pref = gaim_plugin_pref_new_with_label(_("Error Message Suppression")); | |
175 gaim_plugin_pref_frame_add(frame, pref); | |
176 | |
177 pref = gaim_plugin_pref_new_with_name_and_label(OPT_HIDE_CONNECTED, | |
178 _("Hide Disconnect Errors")); | |
179 gaim_plugin_pref_frame_add(frame, pref); | |
180 | |
181 pref = gaim_plugin_pref_new_with_name_and_label(OPT_HIDE_CONNECTING, | |
182 _("Hide Login Errors")); | |
183 gaim_plugin_pref_frame_add(frame, pref); | |
184 | |
185 return frame; | |
186 } | |
187 | |
188 | |
189 static GaimPluginUiInfo pref_info = { | |
190 get_plugin_pref_frame | |
191 }; | |
192 | |
193 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
194 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
195 { |
8749
d7b8eb1f0a18
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8250
diff
changeset
|
196 GAIM_PLUGIN_API_VERSION, /**< api_version */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
197 GAIM_PLUGIN_STANDARD, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
198 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
199 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
200 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
201 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
202 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
203 AUTORECON_PLUGIN_ID, /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
204 N_("Auto-Reconnect"), /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
205 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
206 /** summary */ |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
207 N_("When you are kicked offline, this reconnects you."), |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
208 /** description */ |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
209 N_("When you are kicked offline, this reconnects you."), |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
210 "Eric Warmenhoven <eric@warmenhoven.org>", /**< author */ |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
211 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
212 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
213 plugin_load, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
214 plugin_unload, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
215 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
216 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
217 NULL, /**< ui_info */ |
8774 | 218 NULL, /**< extra_info */ |
8993 | 219 &pref_info, /**< prefs_info */ |
220 NULL | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
221 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
222 |
8774 | 223 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
224 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5873
diff
changeset
|
225 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
4590
diff
changeset
|
226 { |
8774 | 227 gaim_prefs_add_none(AUTORECON_OPT); |
228 gaim_prefs_add_bool(OPT_HIDE_CONNECTED, FALSE); | |
229 gaim_prefs_add_bool(OPT_HIDE_CONNECTING, FALSE); | |
3630 | 230 } |
231 | |
6063 | 232 GAIM_INIT_PLUGIN(autorecon, init_plugin, info) |
8774 | 233 |