Mercurial > pidgin
annotate plugins/autorecon.c @ 9379:c7eeab91fe21
[gaim-migrate @ 10187]
updated
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Thu, 24 Jun 2004 21:53:30 +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 |