Mercurial > pidgin.yaz
annotate src/prpl.c @ 11319:d9debf609b79
[gaim-migrate @ 13522]
I'm quite amazed this worked at all. Did no-one notice debug output like this:
Gtk: Invalid text buffer iterator: either the iterator is uninitialized, or the characters/pixbufs/widgets in the buffer have been modified since the iterator was created.
You must use marks, character numbers, or line numbers to preserve a position across buffer modifications.
You can apply tags and insert marks without invalidating your iterators,
but any mutation that affects 'indexable' buffer contents (contents that can be referred to by character offset)
will invalidate all outstanding iterators
Gtk: gtk_text_buffer_set_mark: assertion `gtk_text_iter_get_buffer (iter) == buffer' failed
committer: Tailor Script <tailor@pidgin.im>
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Sat, 20 Aug 2005 21:11:57 +0000 |
parents | 90be432e8385 |
children | e1e47878d0ed |
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 { | |
10554 | 191 GSList *l; |
9949 | 192 |
193 g_return_if_fail(account != NULL); | |
194 g_return_if_fail(name != NULL); | |
195 g_return_if_fail(gaim_account_is_connected(account)); | |
196 | |
10554 | 197 for (l = gaim_find_buddies(account, name); l != NULL; l = l->next) |
198 { | |
199 GaimBuddy *buddy; | |
200 GaimPresence *presence; | |
9949 | 201 |
10554 | 202 buddy = (GaimBuddy *)l->data; |
10007 | 203 |
10554 | 204 presence = gaim_buddy_get_presence(buddy); |
205 | |
206 gaim_presence_set_idle(presence, idle, idle_time); | |
207 } | |
9949 | 208 } |
209 | |
210 void | |
211 gaim_prpl_got_user_login_time(GaimAccount *account, const char *name, | |
212 time_t login_time) | |
213 { | |
10554 | 214 GSList *l; |
9949 | 215 |
216 g_return_if_fail(account != NULL); | |
217 g_return_if_fail(name != NULL); | |
218 | |
10554 | 219 for (l = gaim_find_buddies(account, name); l != NULL; l = l->next) |
220 { | |
221 GaimBuddy *buddy; | |
222 GaimPresence *presence; | |
223 | |
224 buddy = (GaimBuddy *)l->data; | |
9949 | 225 |
10554 | 226 if (login_time == 0) |
227 login_time = time(NULL); | |
9949 | 228 |
10554 | 229 presence = gaim_buddy_get_presence(buddy); |
9949 | 230 |
10554 | 231 gaim_presence_set_login_time(presence, login_time); |
232 } | |
9949 | 233 } |
234 | |
235 void | |
236 gaim_prpl_got_user_status(GaimAccount *account, const char *name, | |
237 const char *status_id, const char *attr_id, ...) | |
238 { | |
10554 | 239 GSList *l; |
9949 | 240 |
241 g_return_if_fail(account != NULL); | |
242 g_return_if_fail(name != NULL); | |
243 g_return_if_fail(status_id != NULL); | |
244 g_return_if_fail(gaim_account_is_connected(account)); | |
245 | |
10554 | 246 for (l = gaim_find_buddies(account, name); l != NULL; l = l->next) |
247 { | |
248 GaimBuddy *buddy; | |
249 GaimPresence *presence; | |
250 GaimStatus *status; | |
251 GaimStatus *old_status; | |
9949 | 252 |
10554 | 253 buddy = (GaimBuddy *)l->data; |
254 presence = gaim_buddy_get_presence(buddy); | |
255 status = gaim_presence_get_status(presence, status_id); | |
9949 | 256 |
10554 | 257 g_return_if_fail(status != NULL); |
9949 | 258 |
10554 | 259 if (attr_id != NULL) |
260 { | |
261 va_list args; | |
9949 | 262 |
10554 | 263 va_start(args, attr_id); |
9949 | 264 |
10554 | 265 while (attr_id != NULL) |
266 { | |
267 set_value_from_arg(status, attr_id, &args); | |
9949 | 268 |
10554 | 269 attr_id = va_arg(args, char *); |
270 } | |
271 | |
272 va_end(args); | |
9949 | 273 } |
274 | |
10554 | 275 old_status = gaim_presence_get_active_status(presence); |
276 gaim_presence_set_status_active(presence, status_id, TRUE); | |
277 gaim_blist_update_buddy_status(buddy, old_status); | |
9949 | 278 } |
279 } | |
280 | |
281 void | |
10447 | 282 gaim_prpl_change_account_status(GaimAccount *account, |
283 GaimStatus *old_status, GaimStatus *new_status) | |
9949 | 284 { |
285 GaimPlugin *prpl; | |
286 GaimPluginProtocolInfo *prpl_info; | |
287 | |
10447 | 288 g_return_if_fail(account != NULL); |
289 g_return_if_fail(old_status != NULL); | |
290 g_return_if_fail(new_status != NULL); | |
9949 | 291 |
292 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); | |
293 | |
294 if (prpl == NULL) | |
295 return; | |
296 | |
297 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
298 | |
299 if (prpl_info->set_status != NULL) | |
10447 | 300 prpl_info->set_status(account, new_status); |
9949 | 301 } |
302 | |
10006 | 303 GList * |
304 gaim_prpl_get_statuses(GaimAccount *account, GaimPresence *presence) | |
305 { | |
306 GaimPlugin *prpl; | |
307 GaimPluginProtocolInfo *prpl_info; | |
308 GList *statuses = NULL; | |
309 GList *l; | |
310 GaimStatus *status; | |
311 | |
10447 | 312 g_return_val_if_fail(account != NULL, NULL); |
10006 | 313 g_return_val_if_fail(presence != NULL, NULL); |
314 | |
315 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); | |
10046 | 316 |
10006 | 317 if (prpl == NULL) |
318 return NULL; | |
10046 | 319 |
10006 | 320 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
321 if (prpl_info == NULL || prpl_info->status_types == NULL) | |
322 return NULL; | |
323 | |
324 for (l = prpl_info->status_types(account); l != NULL; l = l->next) | |
325 { | |
326 status = gaim_status_new((GaimStatusType *)l->data, presence); | |
327 statuses = g_list_append(statuses, status); | |
328 } | |
329 | |
330 return statuses; | |
331 } | |
332 | |
9949 | 333 |
334 /************************************************************************** | |
335 * Protocol Plugin Subsystem API | |
336 **************************************************************************/ | |
337 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
338 GaimPlugin * |
7956 | 339 gaim_find_prpl(const char *id) |
981 | 340 { |
5573
5e7de337a053
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
341 GList *l; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
342 GaimPlugin *plugin; |
981 | 343 |
10036
0ddc38f8db4a
[gaim-migrate @ 10995]
Luke Schierer <lschiere@pidgin.im>
parents:
10023
diff
changeset
|
344 g_return_val_if_fail(id != NULL, NULL); |
0ddc38f8db4a
[gaim-migrate @ 10995]
Luke Schierer <lschiere@pidgin.im>
parents:
10023
diff
changeset
|
345 |
5573
5e7de337a053
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
346 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
|
347 plugin = (GaimPlugin *)l->data; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
348 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
349 /* Just In Case (TM) */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
350 if (GAIM_IS_PROTOCOL_PLUGIN(plugin)) { |
7956 | 351 if (!strcmp(plugin->info->id, id)) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
352 return plugin; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5161
diff
changeset
|
353 } |
981 | 354 } |
355 | |
356 return NULL; | |
357 } |