Mercurial > pidgin
annotate src/prpl.c @ 13069:42c62476b61b
[gaim-migrate @ 15431]
SF User pomp pointed out that if you open a conversation window with an AIM
buddy who is offline and hit Ctrl-O, you'll end up with an empty log. An
error message shows in the conversation window, but such messages are not
logged. This change logs error messages as well as logging any messages
with a type we don't recognize (and files a debug message, since that
shouldn't happen).
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Mon, 30 Jan 2006 04:51:12 +0000 |
parents | ccd0fa854471 |
children | e9cf00a30b49 |
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 static gboolean | |
62 set_value_from_arg(GaimStatus *status, const char *id, va_list *args) | |
63 { | |
64 GaimValue *value; | |
65 | |
66 value = gaim_status_get_attr_value(status, id); | |
67 | |
68 if (value == NULL) | |
69 { | |
70 gaim_debug_error("prpl", | |
71 "Attempted to set an unknown attribute %s on " | |
72 "status %s\n", | |
73 id, gaim_status_get_id(status)); | |
74 return FALSE; | |
75 } | |
76 | |
77 switch (gaim_value_get_type(value)) | |
78 { | |
79 case GAIM_TYPE_CHAR: | |
80 gaim_value_set_char(value, (char)va_arg(*args, int)); | |
81 break; | |
82 | |
83 case GAIM_TYPE_UCHAR: | |
84 gaim_value_set_uchar(value, | |
85 (unsigned char)va_arg(*args, unsigned int)); | |
86 break; | |
87 | |
88 case GAIM_TYPE_BOOLEAN: | |
89 gaim_value_set_boolean(value, va_arg(*args, gboolean)); | |
90 break; | |
91 | |
92 case GAIM_TYPE_SHORT: | |
93 gaim_value_set_short(value, (short)va_arg(*args, int)); | |
94 break; | |
95 | |
96 case GAIM_TYPE_USHORT: | |
97 gaim_value_set_ushort(value, | |
98 (unsigned short)va_arg(*args, unsigned int)); | |
99 break; | |
100 | |
101 case GAIM_TYPE_INT: | |
102 gaim_value_set_int(value, va_arg(*args, int)); | |
103 break; | |
104 | |
105 case GAIM_TYPE_UINT: | |
106 gaim_value_set_uint(value, va_arg(*args, unsigned int)); | |
107 break; | |
108 | |
109 case GAIM_TYPE_LONG: | |
110 gaim_value_set_long(value, va_arg(*args, long)); | |
111 break; | |
112 | |
113 case GAIM_TYPE_ULONG: | |
114 gaim_value_set_ulong(value, va_arg(*args, unsigned long)); | |
115 break; | |
116 | |
117 case GAIM_TYPE_INT64: | |
118 gaim_value_set_int64(value, va_arg(*args, gint64)); | |
119 break; | |
120 | |
121 case GAIM_TYPE_UINT64: | |
122 gaim_value_set_uint64(value, va_arg(*args, guint64)); | |
123 break; | |
124 | |
125 case GAIM_TYPE_STRING: | |
126 gaim_value_set_string(value, va_arg(*args, char *)); | |
127 break; | |
128 | |
129 case GAIM_TYPE_OBJECT: | |
130 gaim_value_set_object(value, va_arg(*args, void *)); | |
131 break; | |
132 | |
133 case GAIM_TYPE_POINTER: | |
134 gaim_value_set_pointer(value, va_arg(*args, void *)); | |
135 break; | |
136 | |
137 case GAIM_TYPE_ENUM: | |
138 gaim_value_set_enum(value, va_arg(*args, int)); | |
139 break; | |
140 | |
141 case GAIM_TYPE_BOXED: | |
142 gaim_value_set_boxed(value, va_arg(*args, void *)); | |
143 break; | |
144 | |
145 default: | |
146 return FALSE; | |
147 } | |
148 | |
149 return TRUE; | |
150 } | |
151 | |
152 void | |
153 gaim_prpl_got_account_status(GaimAccount *account, const char *status_id, | |
154 const char *attr_id, ...) | |
155 { | |
156 GaimPresence *presence; | |
157 GaimStatus *status; | |
158 | |
159 g_return_if_fail(account != NULL); | |
160 g_return_if_fail(status_id != NULL); | |
161 g_return_if_fail(gaim_account_is_connected(account)); | |
162 | |
163 presence = gaim_account_get_presence(account); | |
164 status = gaim_presence_get_status(presence, status_id); | |
165 | |
166 g_return_if_fail(status != NULL); | |
167 | |
168 if (attr_id != NULL) | |
169 { | |
170 va_list args; | |
171 | |
172 va_start(args, attr_id); | |
173 | |
174 while (attr_id != NULL) | |
175 { | |
176 set_value_from_arg(status, attr_id, &args); | |
177 | |
178 attr_id = va_arg(args, char *); | |
179 } | |
180 | |
181 va_end(args); | |
182 } | |
183 | |
184 gaim_presence_set_status_active(presence, status_id, TRUE); | |
185 } | |
186 | |
187 void | |
188 gaim_prpl_got_user_idle(GaimAccount *account, const char *name, | |
189 gboolean idle, time_t idle_time) | |
190 { | |
12176 | 191 GaimBuddy *buddy; |
192 GaimPresence *presence; | |
9949 | 193 |
194 g_return_if_fail(account != NULL); | |
195 g_return_if_fail(name != NULL); | |
196 g_return_if_fail(gaim_account_is_connected(account)); | |
197 | |
12176 | 198 if ((buddy = gaim_find_buddy(account, name)) == NULL) |
199 return; | |
9949 | 200 |
12176 | 201 presence = gaim_buddy_get_presence(buddy); |
10554 | 202 |
12176 | 203 gaim_presence_set_idle(presence, idle, idle_time); |
9949 | 204 } |
205 | |
206 void | |
207 gaim_prpl_got_user_login_time(GaimAccount *account, const char *name, | |
208 time_t login_time) | |
209 { | |
12176 | 210 GaimBuddy *buddy; |
211 GaimPresence *presence; | |
9949 | 212 |
213 g_return_if_fail(account != NULL); | |
214 g_return_if_fail(name != NULL); | |
215 | |
12176 | 216 if ((buddy = gaim_find_buddy(account, name)) == NULL) |
217 return; | |
9949 | 218 |
12176 | 219 if (login_time == 0) |
220 login_time = time(NULL); | |
9949 | 221 |
12176 | 222 presence = gaim_buddy_get_presence(buddy); |
9949 | 223 |
12176 | 224 gaim_presence_set_login_time(presence, login_time); |
9949 | 225 } |
226 | |
227 void | |
228 gaim_prpl_got_user_status(GaimAccount *account, const char *name, | |
229 const char *status_id, const char *attr_id, ...) | |
230 { | |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
231 GSList *list, *iter; |
12176 | 232 GaimBuddy *buddy; |
233 GaimPresence *presence; | |
234 GaimStatus *status; | |
235 GaimStatus *old_status; | |
9949 | 236 |
237 g_return_if_fail(account != NULL); | |
238 g_return_if_fail(name != NULL); | |
239 g_return_if_fail(status_id != NULL); | |
12377 | 240 g_return_if_fail(gaim_account_is_connected(account) || gaim_account_is_connecting(account)); |
9949 | 241 |
12176 | 242 if ((buddy = gaim_find_buddy(account, name)) == NULL) |
243 return; | |
244 | |
245 presence = gaim_buddy_get_presence(buddy); | |
246 status = gaim_presence_get_status(presence, status_id); | |
247 | |
248 g_return_if_fail(status != NULL); | |
249 | |
250 if (attr_id != NULL) | |
251 { | |
252 va_list args; | |
253 | |
254 va_start(args, attr_id); | |
255 | |
256 while (attr_id != NULL) | |
257 { | |
258 set_value_from_arg(status, attr_id, &args); | |
259 | |
260 attr_id = va_arg(args, char *); | |
261 } | |
262 | |
263 va_end(args); | |
264 } | |
265 | |
266 old_status = gaim_presence_get_active_status(presence); | |
267 gaim_presence_set_status_active(presence, status_id, TRUE); | |
268 | |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
269 list = gaim_find_buddies(account, name); |
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
270 for (iter = list; iter != NULL; iter = iter->next) |
10554 | 271 { |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
272 buddy = (GaimBuddy *)iter->data; |
10554 | 273 gaim_blist_update_buddy_status(buddy, old_status); |
9949 | 274 } |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12108
diff
changeset
|
275 g_slist_free(list); |
12654 | 276 |
277 if (!gaim_status_is_online(status)) | |
278 serv_got_typing_stopped(gaim_account_get_connection(account), name); | |
9949 | 279 } |
280 | |
12304 | 281 static void |
282 do_prpl_change_account_status(GaimAccount *account, | |
10447 | 283 GaimStatus *old_status, GaimStatus *new_status) |
9949 | 284 { |
285 GaimPlugin *prpl; | |
286 GaimPluginProtocolInfo *prpl_info; | |
287 | |
11718 | 288 if (gaim_status_is_online(new_status) && |
289 gaim_account_is_disconnected(account)) | |
290 { | |
291 gaim_account_connect(account); | |
292 return; | |
293 } | |
294 | |
11927 | 295 if (!gaim_status_is_online(new_status)) |
11718 | 296 { |
11927 | 297 if (!gaim_account_is_disconnected(account)) |
298 gaim_account_disconnect(account); | |
11718 | 299 return; |
300 } | |
301 | |
12108 | 302 if (gaim_account_is_connecting(account)) |
303 /* | |
304 * We don't need to call the set_status PRPL function because | |
305 * the PRPL will take care of setting its status during the | |
306 * connection process. | |
307 */ | |
308 return; | |
309 | |
9949 | 310 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
311 | |
312 if (prpl == NULL) | |
313 return; | |
314 | |
315 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
316 | |
317 if (prpl_info->set_status != NULL) | |
11628 | 318 { |
10447 | 319 prpl_info->set_status(account, new_status); |
11628 | 320 } |
9949 | 321 } |
322 | |
12304 | 323 void |
324 gaim_prpl_change_account_status(GaimAccount *account, | |
325 GaimStatus *old_status, GaimStatus *new_status) | |
326 { | |
327 g_return_if_fail(account != NULL); | |
328 g_return_if_fail(old_status != NULL); | |
329 g_return_if_fail(new_status != NULL); | |
330 | |
331 do_prpl_change_account_status(account, old_status, new_status); | |
332 | |
333 gaim_signal_emit(gaim_accounts_get_handle(), "account-status-changed", | |
334 account, old_status, new_status); | |
335 } | |
336 | |
10006 | 337 GList * |
338 gaim_prpl_get_statuses(GaimAccount *account, GaimPresence *presence) | |
339 { | |
340 GaimPlugin *prpl; | |
341 GaimPluginProtocolInfo *prpl_info; | |
342 GList *statuses = NULL; | |
11730
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
343 GList *l, *list; |
10006 | 344 GaimStatus *status; |
345 | |
10447 | 346 g_return_val_if_fail(account != NULL, NULL); |
10006 | 347 g_return_val_if_fail(presence != NULL, NULL); |
348 | |
349 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); | |
10046 | 350 |
10006 | 351 if (prpl == NULL) |
352 return NULL; | |
10046 | 353 |
10006 | 354 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
355 if (prpl_info == NULL || prpl_info->status_types == NULL) | |
356 return NULL; | |
357 | |
11730
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
358 for (l = list = prpl_info->status_types(account); l != NULL; l = l->next) |
10006 | 359 { |
360 status = gaim_status_new((GaimStatusType *)l->data, presence); | |
361 statuses = g_list_append(statuses, status); | |
362 } | |
363 | |
11730
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
364 g_list_free(list); |
ef57eccb9a3b
[gaim-migrate @ 14021]
Richard Laager <rlaager@wiktel.com>
parents:
11718
diff
changeset
|
365 |
10006 | 366 return statuses; |
367 } | |
368 | |
9949 | 369 |
370 /************************************************************************** | |
371 * Protocol Plugin Subsystem API | |
372 **************************************************************************/ | |
373 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
374 GaimPlugin * |
7956 | 375 gaim_find_prpl(const char *id) |
981 | 376 { |
5573
5e7de337a053
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
377 GList *l; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
378 GaimPlugin *plugin; |
981 | 379 |
10036
0ddc38f8db4a
[gaim-migrate @ 10995]
Luke Schierer <lschiere@pidgin.im>
parents:
10023
diff
changeset
|
380 g_return_val_if_fail(id != NULL, NULL); |
0ddc38f8db4a
[gaim-migrate @ 10995]
Luke Schierer <lschiere@pidgin.im>
parents:
10023
diff
changeset
|
381 |
5573
5e7de337a053
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
382 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
|
383 plugin = (GaimPlugin *)l->data; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
384 |
11948 | 385 if (!strcmp(plugin->info->id, id)) |
386 return plugin; | |
981 | 387 } |
388 | |
389 return NULL; | |
390 } |