Mercurial > pidgin
annotate src/prpl.c @ 13623:51d436a267ac
[gaim-migrate @ 16009]
Use the GSlice allocator (for logs and log sets) when compiling with glib 2.10 or greater and eliminate some unnecessary memory zeroing. This cuts the log loading time in half for one of Luke's contacts.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 11 Apr 2006 16:06:24 +0000 |
parents | 1ca4a579eb57 |
children | 8bda65b88e49 |
rev | line source |
---|---|
981 | 1 /* |
2 * gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
7 * |
981 | 8 * This program is free software; you can redistribute it and/or modify |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5717
diff
changeset
|
23 #include "internal.h" |
5945
2a18e7b5917e
[gaim-migrate @ 6386]
Christian Hammond <chipx86@chipx86.com>
parents:
5943
diff
changeset
|
24 #include "conversation.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5717
diff
changeset
|
25 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5717
diff
changeset
|
26 #include "notify.h" |
981 | 27 #include "prpl.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5717
diff
changeset
|
28 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5717
diff
changeset
|
29 #include "util.h" |
3738 | 30 |
9949 | 31 /**************************************************************************/ |
32 /** @name Protocol Plugin API */ | |
33 /**************************************************************************/ | |
34 void | |
35 gaim_prpl_got_account_idle(GaimAccount *account, gboolean idle, | |
36 time_t idle_time) | |
37 { | |
38 g_return_if_fail(account != NULL); | |
39 g_return_if_fail(gaim_account_is_connected(account)); | |
40 | |
41 gaim_presence_set_idle(gaim_account_get_presence(account), | |
42 idle, idle_time); | |
43 } | |
44 | |
45 void | |
10870 | 46 gaim_prpl_got_account_login_time(GaimAccount *account, time_t login_time) |
9949 | 47 { |
48 GaimPresence *presence; | |
49 | |
50 g_return_if_fail(account != NULL); | |
51 g_return_if_fail(gaim_account_is_connected(account)); | |
52 | |
53 if (login_time == 0) | |
54 login_time = time(NULL); | |
55 | |
56 presence = gaim_account_get_presence(account); | |
57 | |
10007 | 58 gaim_presence_set_login_time(presence, login_time); |
9949 | 59 } |
60 | |
61 void | |
13373 | 62 gaim_prpl_got_account_status(GaimAccount *account, const char *status_id, ...) |
9949 | 63 { |
64 GaimPresence *presence; | |
65 GaimStatus *status; | |
13373 | 66 va_list args; |
9949 | 67 |
68 g_return_if_fail(account != NULL); | |
69 g_return_if_fail(status_id != NULL); | |
70 g_return_if_fail(gaim_account_is_connected(account)); | |
71 | |
72 presence = gaim_account_get_presence(account); | |
73 status = gaim_presence_get_status(presence, status_id); | |
74 | |
75 g_return_if_fail(status != NULL); | |
76 | |
13373 | 77 va_start(args, status_id); |
78 gaim_status_set_active_with_attrs(status, TRUE, args); | |
79 va_end(args); | |
9949 | 80 } |
81 | |
82 void | |
83 gaim_prpl_got_user_idle(GaimAccount *account, const char *name, | |
84 gboolean idle, time_t idle_time) | |
85 { | |
12176 | 86 GaimBuddy *buddy; |
87 GaimPresence *presence; | |
9949 | 88 |
89 g_return_if_fail(account != NULL); | |
90 g_return_if_fail(name != NULL); | |
91 g_return_if_fail(gaim_account_is_connected(account)); | |
92 | |
12176 | 93 if ((buddy = gaim_find_buddy(account, name)) == NULL) |
94 return; | |
9949 | 95 |
12176 | 96 presence = gaim_buddy_get_presence(buddy); |
10554 | 97 |
12176 | 98 gaim_presence_set_idle(presence, idle, idle_time); |
9949 | 99 } |
100 | |
101 void | |
102 gaim_prpl_got_user_login_time(GaimAccount *account, const char *name, | |
103 time_t login_time) | |
104 { | |
12176 | 105 GaimBuddy *buddy; |
106 GaimPresence *presence; | |
9949 | 107 |
108 g_return_if_fail(account != NULL); | |
109 g_return_if_fail(name != NULL); | |
110 | |
12176 | 111 if ((buddy = gaim_find_buddy(account, name)) == NULL) |
112 return; | |
9949 | 113 |
12176 | 114 if (login_time == 0) |
115 login_time = time(NULL); | |
9949 | 116 |
12176 | 117 presence = gaim_buddy_get_presence(buddy); |
9949 | 118 |
12176 | 119 gaim_presence_set_login_time(presence, login_time); |
9949 | 120 } |
121 | |
122 void | |
123 gaim_prpl_got_user_status(GaimAccount *account, const char *name, | |
13373 | 124 const char *status_id, ...) |
9949 | 125 { |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
126 GSList *list, *iter; |
12176 | 127 GaimBuddy *buddy; |
128 GaimPresence *presence; | |
129 GaimStatus *status; | |
130 GaimStatus *old_status; | |
13373 | 131 va_list args; |
9949 | 132 |
133 g_return_if_fail(account != NULL); | |
134 g_return_if_fail(name != NULL); | |
135 g_return_if_fail(status_id != NULL); | |
12377 | 136 g_return_if_fail(gaim_account_is_connected(account) || gaim_account_is_connecting(account)); |
9949 | 137 |
12176 | 138 if ((buddy = gaim_find_buddy(account, name)) == NULL) |
139 return; | |
140 | |
141 presence = gaim_buddy_get_presence(buddy); | |
142 status = gaim_presence_get_status(presence, status_id); | |
143 | |
144 g_return_if_fail(status != NULL); | |
145 | |
13373 | 146 old_status = gaim_presence_get_active_status(presence); |
12176 | 147 |
13373 | 148 va_start(args, status_id); |
149 gaim_status_set_active_with_attrs(status, TRUE, args); | |
150 va_end(args); | |
12176 | 151 |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
152 list = gaim_find_buddies(account, name); |
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
153 for (iter = list; iter != NULL; iter = iter->next) |
10554 | 154 { |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
155 buddy = (GaimBuddy *)iter->data; |
10554 | 156 gaim_blist_update_buddy_status(buddy, old_status); |
9949 | 157 } |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
158 g_slist_free(list); |
12654 | 159 |
160 if (!gaim_status_is_online(status)) | |
161 serv_got_typing_stopped(gaim_account_get_connection(account), name); | |
9949 | 162 } |
163 | |
12304 | 164 static void |
165 do_prpl_change_account_status(GaimAccount *account, | |
10447 | 166 GaimStatus *old_status, GaimStatus *new_status) |
9949 | 167 { |
168 GaimPlugin *prpl; | |
169 GaimPluginProtocolInfo *prpl_info; | |
170 | |
11718 | 171 if (gaim_status_is_online(new_status) && |
172 gaim_account_is_disconnected(account)) | |
173 { | |
174 gaim_account_connect(account); | |
175 return; | |
176 } | |
177 | |
178 | |
12108 | 179 if (gaim_account_is_connecting(account)) |
180 /* | |
181 * We don't need to call the set_status PRPL function because | |
182 * the PRPL will take care of setting its status during the | |
183 * connection process. | |
184 */ | |
185 return; | |
186 | |
9949 | 187 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
188 | |
189 if (prpl == NULL) | |
190 return; | |
191 | |
192 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
193 | |
13334
99d081c638f6
[gaim-migrate @ 15704]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13330
diff
changeset
|
194 if (!gaim_account_is_disconnected(account) && prpl_info->set_status != NULL) |
11628 | 195 { |
10447 | 196 prpl_info->set_status(account, new_status); |
11628 | 197 } |
13330 | 198 |
199 if (!gaim_status_is_online(new_status)) | |
200 { | |
201 if (!gaim_account_is_disconnected(account)) | |
202 gaim_account_disconnect(account); | |
203 return; | |
204 } | |
9949 | 205 } |
206 | |
12304 | 207 void |
208 gaim_prpl_change_account_status(GaimAccount *account, | |
209 GaimStatus *old_status, GaimStatus *new_status) | |
210 { | |
211 g_return_if_fail(account != NULL); | |
212 g_return_if_fail(old_status != NULL); | |
213 g_return_if_fail(new_status != NULL); | |
214 | |
215 do_prpl_change_account_status(account, old_status, new_status); | |
216 | |
217 gaim_signal_emit(gaim_accounts_get_handle(), "account-status-changed", | |
218 account, old_status, new_status); | |
219 } | |
220 | |
10006 | 221 GList * |
222 gaim_prpl_get_statuses(GaimAccount *account, GaimPresence *presence) | |
223 { | |
224 GaimPlugin *prpl; | |
225 GaimPluginProtocolInfo *prpl_info; | |
226 GList *statuses = NULL; | |
11730
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
227 GList *l, *list; |
10006 | 228 GaimStatus *status; |
229 | |
10447 | 230 g_return_val_if_fail(account != NULL, NULL); |
10006 | 231 g_return_val_if_fail(presence != NULL, NULL); |
232 | |
233 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); | |
10046 | 234 |
10006 | 235 if (prpl == NULL) |
236 return NULL; | |
10046 | 237 |
10006 | 238 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
239 if (prpl_info == NULL || prpl_info->status_types == NULL) | |
240 return NULL; | |
241 | |
11730
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
242 for (l = list = prpl_info->status_types(account); l != NULL; l = l->next) |
10006 | 243 { |
244 status = gaim_status_new((GaimStatusType *)l->data, presence); | |
245 statuses = g_list_append(statuses, status); | |
246 } | |
247 | |
11730
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
248 g_list_free(list); |
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
249 |
10006 | 250 return statuses; |
251 } | |
252 | |
9949 | 253 |
254 /************************************************************************** | |
255 * Protocol Plugin Subsystem API | |
256 **************************************************************************/ | |
257 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
258 GaimPlugin * |
7956 | 259 gaim_find_prpl(const char *id) |
981 | 260 { |
5573
5e7de337a053
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
261 GList *l; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
262 GaimPlugin *plugin; |
981 | 263 |
10036
0ddc38f8db4a
[gaim-migrate @ 10995]
Luke Schierer <lschiere@pidgin.im>
parents:
10023
diff
changeset
|
264 g_return_val_if_fail(id != NULL, NULL); |
0ddc38f8db4a
[gaim-migrate @ 10995]
Luke Schierer <lschiere@pidgin.im>
parents:
10023
diff
changeset
|
265 |
5573
5e7de337a053
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
266 for (l = gaim_plugins_get_protocols(); l != NULL; l = l->next) { |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
267 plugin = (GaimPlugin *)l->data; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
268 |
11948 | 269 if (!strcmp(plugin->info->id, id)) |
270 return plugin; | |
981 | 271 } |
272 | |
273 return NULL; | |
274 } |