Mercurial > ~mikael > mcabber > hg
comparison mcabber/mcabber/roster.c @ 2337:ffd0e57e9563
Defined types shall end with "_t"
author | franky |
---|---|
date | Sun, 12 May 2019 11:32:30 +0200 |
parents | 4ddd6f5c3ffc |
children | 7921c8d671c8 |
comparison
equal
deleted
inserted
replaced
2336:0dc317b5599d | 2337:ffd0e57e9563 |
---|---|
77 struct xep0085 xep85; | 77 struct xep0085 xep85; |
78 #endif | 78 #endif |
79 #ifdef HAVE_GPGME | 79 #ifdef HAVE_GPGME |
80 struct pgp_data pgpdata; | 80 struct pgp_data pgpdata; |
81 #endif | 81 #endif |
82 } res; | 82 } res_t; |
83 | 83 |
84 /* This is a private structure type for the roster */ | 84 /* This is a private structure type for the roster_t */ |
85 | 85 |
86 typedef struct { | 86 typedef struct { |
87 gchar *name; | 87 gchar *name; |
88 gchar *jid; | 88 gchar *jid; |
89 guint type; | 89 guint type; |
90 enum subscr subscription; | 90 enum subscr subscription; |
91 GSList *resource; | 91 GSList *resource; |
92 res *active_resource; | 92 res_t *active_resource; |
93 | 93 |
94 /* For groupchats */ | 94 /* For groupchats */ |
95 gchar *nickname; | 95 gchar *nickname; |
96 gchar *topic; | 96 gchar *topic; |
97 guint inside_room; | 97 guint inside_room; |
110 guint ui_prio; // Boolean, positive if "attention" is requested | 110 guint ui_prio; // Boolean, positive if "attention" is requested |
111 guint unread; | 111 guint unread; |
112 | 112 |
113 // list: user -> points to his group; group -> points to its users list | 113 // list: user -> points to his group; group -> points to its users list |
114 GSList *list; | 114 GSList *list; |
115 } roster; | 115 } roster_t; |
116 | 116 |
117 | 117 |
118 /* ### Variables ### */ | 118 /* ### Variables ### */ |
119 | 119 |
120 static guchar display_filter; | 120 static guchar display_filter; |
125 static gboolean _rebuild_buddylist = FALSE; | 125 static gboolean _rebuild_buddylist = FALSE; |
126 GList *current_buddy; | 126 GList *current_buddy; |
127 GList *alternate_buddy; | 127 GList *alternate_buddy; |
128 GList *last_activity_buddy; | 128 GList *last_activity_buddy; |
129 | 129 |
130 static roster roster_special; | 130 static roster_t roster_special; |
131 | 131 |
132 static int unread_jid_del(const char *jid); | 132 static int unread_jid_del(const char *jid); |
133 | 133 |
134 #define DFILTER_ALL 63 | 134 #define DFILTER_ALL 63 |
135 #define DFILTER_ONLINE 62 | 135 #define DFILTER_ONLINE 62 |
143 roster_special.type = ROSTER_TYPE_SPECIAL; | 143 roster_special.type = ROSTER_TYPE_SPECIAL; |
144 } | 144 } |
145 | 145 |
146 /* ### Resources functions ### */ | 146 /* ### Resources functions ### */ |
147 | 147 |
148 static inline void free_resource_data(res *p_res) | 148 static inline void free_resource_data(res_t *p_res) |
149 { | 149 { |
150 if (!p_res) | 150 if (!p_res) |
151 return; | 151 return; |
152 g_free((gchar*)p_res->status_msg); | 152 g_free((gchar*)p_res->status_msg); |
153 g_free((gchar*)p_res->name); | 153 g_free((gchar*)p_res->name); |
162 static void free_all_resources(GSList **reslist) | 162 static void free_all_resources(GSList **reslist) |
163 { | 163 { |
164 GSList *lip; | 164 GSList *lip; |
165 | 165 |
166 for (lip = *reslist; lip ; lip = g_slist_next(lip)) | 166 for (lip = *reslist; lip ; lip = g_slist_next(lip)) |
167 free_resource_data((res*)lip->data); | 167 free_resource_data((res_t *)lip->data); |
168 // Free all nodes but the first (which is static) | 168 // Free all nodes but the first (which is static) |
169 g_slist_free(*reslist); | 169 g_slist_free(*reslist); |
170 *reslist = NULL; | 170 *reslist = NULL; |
171 } | 171 } |
172 | 172 |
173 // Resources are sorted in ascending order | 173 // Resources are sorted in ascending order |
174 static gint resource_compare_prio(res *a, res *b) { | 174 static gint resource_compare_prio(res_t *a, res_t *b) { |
175 if (a->prio < b->prio) return -1; | 175 if (a->prio < b->prio) return -1; |
176 else return 1; | 176 else return 1; |
177 } | 177 } |
178 | 178 |
179 // get_resource(rost, resname) | 179 // get_resource(rost, resname) |
182 // - if resname is defined, return the match or NULL | 182 // - if resname is defined, return the match or NULL |
183 // - if resname is NULL, the last resource is returned, currently | 183 // - if resname is NULL, the last resource is returned, currently |
184 // This could change in the future, because we should return the best one | 184 // This could change in the future, because we should return the best one |
185 // (priority? last used? and fall back to the first resource) | 185 // (priority? last used? and fall back to the first resource) |
186 // | 186 // |
187 static res *get_resource(roster *rost, const char *resname) | 187 static res_t *get_resource(roster_t *rost, const char *resname) |
188 { | 188 { |
189 GSList *p; | 189 GSList *p; |
190 res *r = NULL; | 190 res_t *r = NULL; |
191 | 191 |
192 for (p = rost->resource; p; p = g_slist_next(p)) { | 192 for (p = rost->resource; p; p = g_slist_next(p)) { |
193 r = p->data; | 193 r = p->data; |
194 if (resname && !strcmp(r->name, resname)) | 194 if (resname && !strcmp(r->name, resname)) |
195 return r; | 195 return r; |
204 // get_or_add_resource(rost, resname, priority) | 204 // get_or_add_resource(rost, resname, priority) |
205 // - if there is a "resname" resource in rost's resources, return a pointer | 205 // - if there is a "resname" resource in rost's resources, return a pointer |
206 // on this resource | 206 // on this resource |
207 // - if not, add the resource, set the name, and return a pointer on this | 207 // - if not, add the resource, set the name, and return a pointer on this |
208 // new resource | 208 // new resource |
209 static res *get_or_add_resource(roster *rost, const char *resname, gchar prio) | 209 static res_t *get_or_add_resource(roster_t *rost, const char *resname, gchar prio) |
210 { | 210 { |
211 GSList *p; | 211 GSList *p; |
212 res *nres; | 212 res_t *nres; |
213 | 213 |
214 if (!resname) return NULL; | 214 if (!resname) return NULL; |
215 | 215 |
216 for (p = rost->resource; p; p = g_slist_next(p)) { | 216 for (p = rost->resource; p; p = g_slist_next(p)) { |
217 res *r = p->data; | 217 res_t *r = p->data; |
218 if (!strcmp(r->name, resname)) { | 218 if (!strcmp(r->name, resname)) { |
219 if (prio != r->prio) { | 219 if (prio != r->prio) { |
220 r->prio = prio; | 220 r->prio = prio; |
221 rost->resource = g_slist_sort(rost->resource, | 221 rost->resource = g_slist_sort(rost->resource, |
222 (GCompareFunc)&resource_compare_prio); | 222 (GCompareFunc)&resource_compare_prio); |
224 return r; | 224 return r; |
225 } | 225 } |
226 } | 226 } |
227 | 227 |
228 // Resource not found | 228 // Resource not found |
229 nres = g_new0(res, 1); | 229 nres = g_new0(res_t, 1); |
230 nres->name = g_strdup(resname); | 230 nres->name = g_strdup(resname); |
231 nres->prio = prio; | 231 nres->prio = prio; |
232 rost->resource = g_slist_insert_sorted(rost->resource, nres, | 232 rost->resource = g_slist_insert_sorted(rost->resource, nres, |
233 (GCompareFunc)&resource_compare_prio); | 233 (GCompareFunc)&resource_compare_prio); |
234 return nres; | 234 return nres; |
235 } | 235 } |
236 | 236 |
237 static void del_resource(roster *rost, const char *resname) | 237 static void del_resource(roster_t *rost, const char *resname) |
238 { | 238 { |
239 GSList *p; | 239 GSList *p; |
240 GSList *p_res_elt = NULL; | 240 GSList *p_res_elt = NULL; |
241 res *p_res; | 241 res_t *p_res; |
242 | 242 |
243 if (!resname) return; | 243 if (!resname) return; |
244 | 244 |
245 for (p = rost->resource; p; p = g_slist_next(p)) { | 245 for (p = rost->resource; p; p = g_slist_next(p)) { |
246 res *r = p->data; | 246 res_t *r = p->data; |
247 if (!strcmp(r->name, resname)) | 247 if (!strcmp(r->name, resname)) |
248 p_res_elt = p; | 248 p_res_elt = p; |
249 } | 249 } |
250 | 250 |
251 if (!p_res_elt) return; // Resource not found | 251 if (!p_res_elt) return; // Resource not found |
269 } | 269 } |
270 | 270 |
271 | 271 |
272 /* ### Roster functions ### */ | 272 /* ### Roster functions ### */ |
273 | 273 |
274 static inline void free_roster_user_data(roster *roster_usr) | 274 static inline void free_roster_user_data(roster_t *roster_usr) |
275 { | 275 { |
276 if (!roster_usr) | 276 if (!roster_usr) |
277 return; | 277 return; |
278 g_free((gchar*)roster_usr->jid); | 278 g_free((gchar*)roster_usr->jid); |
279 //g_free((gchar*)roster_usr->active_resource); | 279 //g_free((gchar*)roster_usr->active_resource); |
284 free_all_resources(&roster_usr->resource); | 284 free_all_resources(&roster_usr->resource); |
285 g_free(roster_usr); | 285 g_free(roster_usr); |
286 } | 286 } |
287 | 287 |
288 // Comparison function used to search in the roster (compares jids and types) | 288 // Comparison function used to search in the roster (compares jids and types) |
289 static gint roster_compare_jid_type(roster *a, roster *b) { | 289 static gint roster_compare_jid_type(roster_t *a, roster_t *b) { |
290 if (! (a->type & b->type)) | 290 if (! (a->type & b->type)) |
291 return -1; // arbitrary (but should be != 0, of course) | 291 return -1; // arbitrary (but should be != 0, of course) |
292 return strcasecmp(a->jid, b->jid); | 292 return strcasecmp(a->jid, b->jid); |
293 } | 293 } |
294 | 294 |
295 // Comparison function used to search in the roster (compares names and types) | 295 // Comparison function used to search in the roster (compares names and types) |
296 static gint roster_compare_name_type(roster *a, roster *b) { | 296 static gint roster_compare_name_type(roster_t *a, roster_t *b) { |
297 if (! (a->type & b->type)) | 297 if (! (a->type & b->type)) |
298 return -1; // arbitrary (but should be != 0, of course) | 298 return -1; // arbitrary (but should be != 0, of course) |
299 return strcmp(a->name, b->name); | 299 return strcmp(a->name, b->name); |
300 } | 300 } |
301 | 301 |
302 // Comparison function used to sort the roster (by name) | 302 // Comparison function used to sort the roster (by name) |
303 static gint roster_compare_name(roster *a, roster *b) { | 303 static gint roster_compare_name(roster_t *a, roster_t *b) { |
304 return strcmp(a->name, b->name); | 304 return strcmp(a->name, b->name); |
305 } | 305 } |
306 | 306 |
307 // Finds a roster element (user, group, agent...), by jid or name | 307 // Finds a roster element (user, group, agent...), by jid or name |
308 // If roster_type is 0, returns match of any type. | 308 // If roster_type is 0, returns match of any type. |
309 // Returns the roster GSList element, or NULL if jid/name not found | 309 // Returns the roster GSList element, or NULL if jid/name not found |
310 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type) | 310 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type) |
311 { | 311 { |
312 GSList *sl_roster_elt = groups; | 312 GSList *sl_roster_elt = groups; |
313 GSList *resource; | 313 GSList *resource; |
314 roster sample; | 314 roster_t sample; |
315 GCompareFunc comp; | 315 GCompareFunc comp; |
316 | 316 |
317 if (!jidname) return NULL; | 317 if (!jidname) return NULL; |
318 | 318 |
319 if (!roster_type) | 319 if (!roster_type) |
329 comp = (GCompareFunc)&roster_compare_name_type; | 329 comp = (GCompareFunc)&roster_compare_name_type; |
330 } else | 330 } else |
331 return NULL; // Should not happen... | 331 return NULL; // Should not happen... |
332 | 332 |
333 while (sl_roster_elt) { | 333 while (sl_roster_elt) { |
334 roster *roster_elt = (roster*)sl_roster_elt->data; | 334 roster_t *roster_elt = (roster_t *)sl_roster_elt->data; |
335 if (roster_type & ROSTER_TYPE_GROUP) { | 335 if (roster_type & ROSTER_TYPE_GROUP) { |
336 if ((type == namesearch) && !strcmp(jidname, roster_elt->name)) | 336 if ((type == namesearch) && !strcmp(jidname, roster_elt->name)) |
337 return sl_roster_elt; | 337 return sl_roster_elt; |
338 } | 338 } |
339 resource = g_slist_find_custom(roster_elt->list, &sample, comp); | 339 resource = g_slist_find_custom(roster_elt->list, &sample, comp); |
344 } | 344 } |
345 | 345 |
346 // Returns pointer to new group, or existing group with that name | 346 // Returns pointer to new group, or existing group with that name |
347 GSList *roster_add_group(const char *name) | 347 GSList *roster_add_group(const char *name) |
348 { | 348 { |
349 roster *roster_grp; | 349 roster_t *roster_grp; |
350 GSList *p_group; | 350 GSList *p_group; |
351 | 351 |
352 // #1 Check name doesn't already exist | 352 // #1 Check name doesn't already exist |
353 p_group = roster_find(name, namesearch, ROSTER_TYPE_GROUP); | 353 p_group = roster_find(name, namesearch, ROSTER_TYPE_GROUP); |
354 if (!p_group) { | 354 if (!p_group) { |
355 // #2 Create the group node | 355 // #2 Create the group node |
356 roster_grp = g_new0(roster, 1); | 356 roster_grp = g_new0(roster_t, 1); |
357 roster_grp->name = g_strdup(name); | 357 roster_grp->name = g_strdup(name); |
358 roster_grp->type = ROSTER_TYPE_GROUP; | 358 roster_grp->type = ROSTER_TYPE_GROUP; |
359 // #3 Insert (sorted) | 359 // #3 Insert (sorted) |
360 groups = g_slist_insert_sorted(groups, roster_grp, | 360 groups = g_slist_insert_sorted(groups, roster_grp, |
361 (GCompareFunc)&roster_compare_name); | 361 (GCompareFunc)&roster_compare_name); |
363 } | 363 } |
364 return p_group; | 364 return p_group; |
365 } | 365 } |
366 | 366 |
367 // Comparison function used to sort the unread list by ui (attn) priority | 367 // Comparison function used to sort the unread list by ui (attn) priority |
368 static gint _roster_compare_uiprio(roster *a, roster *b) { | 368 static gint _roster_compare_uiprio(roster_t *a, roster_t *b) { |
369 return (b->ui_prio - a->ui_prio); | 369 return (b->ui_prio - a->ui_prio); |
370 } | 370 } |
371 | 371 |
372 // Returns a pointer to the new user, or existing user with that name | 372 // Returns a pointer to the new user, or existing user with that name |
373 // Note: if onserver is -1, the flag won't be changed. | 373 // Note: if onserver is -1, the flag won't be changed. |
374 GSList *roster_add_user(const char *jid, const char *name, const char *group, | 374 GSList *roster_add_user(const char *jid, const char *name, const char *group, |
375 guint type, enum subscr esub, gint onserver) | 375 guint type, enum subscr esub, gint onserver) |
376 { | 376 { |
377 roster *roster_usr; | 377 roster_t *roster_usr; |
378 roster *my_group; | 378 roster_t *my_group; |
379 GSList *slist; | 379 GSList *slist; |
380 | 380 |
381 if ((type != ROSTER_TYPE_USER) && | 381 if ((type != ROSTER_TYPE_USER) && |
382 (type != ROSTER_TYPE_ROOM) && | 382 (type != ROSTER_TYPE_ROOM) && |
383 (type != ROSTER_TYPE_AGENT)) { | 383 (type != ROSTER_TYPE_AGENT)) { |
398 if (onserver >= 0) | 398 if (onserver >= 0) |
399 buddy_setonserverflag(slist->data, onserver); | 399 buddy_setonserverflag(slist->data, onserver); |
400 if (name) | 400 if (name) |
401 buddy_setname(slist->data, (char*)name); | 401 buddy_setname(slist->data, (char*)name); |
402 // Let's check if the group name has changed | 402 // Let's check if the group name has changed |
403 oldgroupname = ((roster*)((GSList*)roster_usr->list)->data)->name; | 403 oldgroupname = ((roster_t *)((GSList*)roster_usr->list)->data)->name; |
404 if (group && strcmp(oldgroupname, group)) { | 404 if (group && strcmp(oldgroupname, group)) { |
405 buddy_setgroup(slist->data, (char*)group); | 405 buddy_setgroup(slist->data, (char*)group); |
406 // Note: buddy_setgroup() updates the user lists so we cannot | 406 // Note: buddy_setgroup() updates the user lists so we cannot |
407 // use slist anymore. | 407 // use slist anymore. |
408 return roster_find(jid, jidsearch, 0); | 408 return roster_find(jid, jidsearch, 0); |
410 return slist; | 410 return slist; |
411 } | 411 } |
412 // #2 add group if necessary | 412 // #2 add group if necessary |
413 slist = roster_add_group(group); | 413 slist = roster_add_group(group); |
414 if (!slist) return NULL; | 414 if (!slist) return NULL; |
415 my_group = (roster*)slist->data; | 415 my_group = (roster_t *)slist->data; |
416 // #3 Create user node | 416 // #3 Create user node |
417 roster_usr = g_new0(roster, 1); | 417 roster_usr = g_new0(roster_t, 1); |
418 roster_usr->jid = g_strdup(jid); | 418 roster_usr->jid = g_strdup(jid); |
419 if (name) { | 419 if (name) { |
420 roster_usr->name = g_strdup(name); | 420 roster_usr->name = g_strdup(name); |
421 } else { | 421 } else { |
422 gchar *p, *str = g_strdup(jid); | 422 gchar *p, *str = g_strdup(jid); |
446 // Removes user (jid) from roster, frees allocated memory | 446 // Removes user (jid) from roster, frees allocated memory |
447 void roster_del_user(const char *jid) | 447 void roster_del_user(const char *jid) |
448 { | 448 { |
449 GSList *sl_user, *sl_group; | 449 GSList *sl_user, *sl_group; |
450 GSList **sl_group_listptr; | 450 GSList **sl_group_listptr; |
451 roster *roster_usr; | 451 roster_t *roster_usr; |
452 GSList *node; | 452 GSList *node; |
453 | 453 |
454 sl_user = roster_find(jid, jidsearch, | 454 sl_user = roster_find(jid, jidsearch, |
455 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM); | 455 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM); |
456 if (sl_user == NULL) | 456 if (sl_user == NULL) |
457 return; | 457 return; |
458 roster_usr = (roster*)sl_user->data; | 458 roster_usr = (roster_t *)sl_user->data; |
459 | 459 |
460 // Remove (if present) from unread messages list | 460 // Remove (if present) from unread messages list |
461 node = g_slist_find(unread_list, roster_usr); | 461 node = g_slist_find(unread_list, roster_usr); |
462 if (node) unread_list = g_slist_delete_link(unread_list, node); | 462 if (node) unread_list = g_slist_delete_link(unread_list, node); |
463 // If there is a pending unread message, keep track of it | 463 // If there is a pending unread message, keep track of it |
468 | 468 |
469 // Let's free roster_usr memory (jid, name, status message...) | 469 // Let's free roster_usr memory (jid, name, status message...) |
470 free_roster_user_data(roster_usr); | 470 free_roster_user_data(roster_usr); |
471 | 471 |
472 // That's a little complex, we need to dereference twice | 472 // That's a little complex, we need to dereference twice |
473 sl_group_listptr = &((roster*)(sl_group->data))->list; | 473 sl_group_listptr = &((roster_t *)(sl_group->data))->list; |
474 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user); | 474 *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user); |
475 | 475 |
476 // We need to rebuild the list | 476 // We need to rebuild the list |
477 if (current_buddy) | 477 if (current_buddy) |
478 buddylist_defer_build(); | 478 buddylist_defer_build(); |
492 unread_list = NULL; | 492 unread_list = NULL; |
493 } | 493 } |
494 | 494 |
495 // Walk through groups | 495 // Walk through groups |
496 while (sl_grp) { | 496 while (sl_grp) { |
497 roster *roster_grp = (roster*)sl_grp->data; | 497 roster_t *roster_grp = (roster_t *)sl_grp->data; |
498 GSList *sl_usr = roster_grp->list; | 498 GSList *sl_usr = roster_grp->list; |
499 // Walk through this group users | 499 // Walk through this group users |
500 while (sl_usr) { | 500 while (sl_usr) { |
501 roster *roster_usr = (roster*)sl_usr->data; | 501 roster_t *roster_usr = (roster_t *)sl_usr->data; |
502 // If there is a pending unread message, keep track of it | 502 // If there is a pending unread message, keep track of it |
503 if (roster_usr->flags & ROSTER_FLAG_MSG) | 503 if (roster_usr->flags & ROSTER_FLAG_MSG) |
504 unread_jid_add(roster_usr->jid); | 504 unread_jid_add(roster_usr->jid); |
505 // Free roster_usr data (jid, name, status message...) | 505 // Free roster_usr data (jid, name, status message...) |
506 free_roster_user_data(roster_usr); | 506 free_roster_user_data(roster_usr); |
532 time_t status_time, | 532 time_t status_time, |
533 enum imrole role, enum imaffiliation affil, | 533 enum imrole role, enum imaffiliation affil, |
534 const char *realjid) | 534 const char *realjid) |
535 { | 535 { |
536 GSList *sl_user; | 536 GSList *sl_user; |
537 roster *roster_usr; | 537 roster_t *roster_usr; |
538 res *p_res; | 538 res_t *p_res; |
539 | 539 |
540 sl_user = roster_find(jid, jidsearch, | 540 sl_user = roster_find(jid, jidsearch, |
541 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); | 541 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
542 // If we can't find it, we add it | 542 // If we can't find it, we add it |
543 if (sl_user == NULL) | 543 if (sl_user == NULL) |
545 sub_none, -1); | 545 sub_none, -1); |
546 | 546 |
547 // If there is no resource name, we can leave now | 547 // If there is no resource name, we can leave now |
548 if (!resname) return; | 548 if (!resname) return; |
549 | 549 |
550 roster_usr = (roster*)sl_user->data; | 550 roster_usr = (roster_t *)sl_user->data; |
551 | 551 |
552 // New or updated resource | 552 // New or updated resource |
553 p_res = get_or_add_resource(roster_usr, resname, prio); | 553 p_res = get_or_add_resource(roster_usr, resname, prio); |
554 p_res->status = bstat; | 554 p_res->status = bstat; |
555 if (p_res->status_msg) { | 555 if (p_res->status_msg) { |
582 // roster_setflags() | 582 // roster_setflags() |
583 // Set one or several flags to value (TRUE/FALSE) | 583 // Set one or several flags to value (TRUE/FALSE) |
584 void roster_setflags(const char *jid, guint flags, guint value) | 584 void roster_setflags(const char *jid, guint flags, guint value) |
585 { | 585 { |
586 GSList *sl_user; | 586 GSList *sl_user; |
587 roster *roster_usr; | 587 roster_t *roster_usr; |
588 | 588 |
589 sl_user = roster_find(jid, jidsearch, | 589 sl_user = roster_find(jid, jidsearch, |
590 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); | 590 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
591 if (sl_user == NULL) | 591 if (sl_user == NULL) |
592 return; | 592 return; |
593 | 593 |
594 roster_usr = (roster*)sl_user->data; | 594 roster_usr = (roster_t *)sl_user->data; |
595 if (value) | 595 if (value) |
596 roster_usr->flags |= flags; | 596 roster_usr->flags |= flags; |
597 else | 597 else |
598 roster_usr->flags &= ~flags; | 598 roster_usr->flags &= ~flags; |
599 } | 599 } |
633 // It will update the buddy's group message flag. | 633 // It will update the buddy's group message flag. |
634 // Update the unread messages list too. | 634 // Update the unread messages list too. |
635 void roster_msg_setflag(const char *jid, guint special, guint value) | 635 void roster_msg_setflag(const char *jid, guint special, guint value) |
636 { | 636 { |
637 GSList *sl_user; | 637 GSList *sl_user; |
638 roster *roster_usr, *roster_grp; | 638 roster_t *roster_usr, *roster_grp; |
639 int new_roster_item = FALSE; | 639 int new_roster_item = FALSE; |
640 guint unread_list_modified = FALSE; | 640 guint unread_list_modified = FALSE; |
641 | 641 |
642 if (special) { | 642 if (special) { |
643 //sl_user = roster_find(jid, namesearch, ROSTER_TYPE_SPECIAL); | 643 //sl_user = roster_find(jid, namesearch, ROSTER_TYPE_SPECIAL); |
644 //if (!sl_user) return; | 644 //if (!sl_user) return; |
645 //roster_usr = (roster*)sl_user->data; | 645 //roster_usr = (roster_t *)sl_user->data; |
646 roster_usr = &roster_special; | 646 roster_usr = &roster_special; |
647 if (value) { | 647 if (value) { |
648 if (!(roster_usr->flags & ROSTER_FLAG_MSG)) | 648 if (!(roster_usr->flags & ROSTER_FLAG_MSG)) |
649 unread_list_modified = TRUE; | 649 unread_list_modified = TRUE; |
650 roster_usr->flags |= ROSTER_FLAG_MSG; | 650 roster_usr->flags |= ROSTER_FLAG_MSG; |
672 if (sl_user == NULL) { | 672 if (sl_user == NULL) { |
673 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none, -1); | 673 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none, -1); |
674 new_roster_item = TRUE; | 674 new_roster_item = TRUE; |
675 } | 675 } |
676 | 676 |
677 roster_usr = (roster*)sl_user->data; | 677 roster_usr = (roster_t *)sl_user->data; |
678 roster_grp = (roster*)roster_usr->list->data; | 678 roster_grp = (roster_t *)roster_usr->list->data; |
679 if (value) { | 679 if (value) { |
680 if (!(roster_usr->flags & ROSTER_FLAG_MSG)) | 680 if (!(roster_usr->flags & ROSTER_FLAG_MSG)) |
681 unread_list_modified = TRUE; | 681 unread_list_modified = TRUE; |
682 // Message flag is TRUE. This is easy, we just have to set both flags | 682 // Message flag is TRUE. This is easy, we just have to set both flags |
683 // to TRUE... | 683 // to TRUE... |
703 // if one is flagged, then the group will be flagged. | 703 // if one is flagged, then the group will be flagged. |
704 // I will re-use sl_user and roster_usr here, as they aren't used | 704 // I will re-use sl_user and roster_usr here, as they aren't used |
705 // anymore. | 705 // anymore. |
706 sl_user = roster_grp->list; | 706 sl_user = roster_grp->list; |
707 while (sl_user) { | 707 while (sl_user) { |
708 roster_usr = (roster*)sl_user->data; | 708 roster_usr = (roster_t *)sl_user->data; |
709 if (roster_usr->flags & ROSTER_FLAG_MSG) { | 709 if (roster_usr->flags & ROSTER_FLAG_MSG) { |
710 msg = TRUE; | 710 msg = TRUE; |
711 break; | 711 break; |
712 } | 712 } |
713 sl_user = g_slist_next(sl_user); | 713 sl_user = g_slist_next(sl_user); |
734 // If increment is true, increment the unread messages count for jid by 1. | 734 // If increment is true, increment the unread messages count for jid by 1. |
735 // If increment is false, reset the unread messages count for jid to 0. | 735 // If increment is false, reset the unread messages count for jid to 0. |
736 void roster_msg_update_unread(const char *jid, gboolean increment) | 736 void roster_msg_update_unread(const char *jid, gboolean increment) |
737 { | 737 { |
738 GSList *sl_user; | 738 GSList *sl_user; |
739 roster *roster_usr; | 739 roster_t *roster_usr; |
740 | 740 |
741 sl_user = roster_find(jid, jidsearch, | 741 sl_user = roster_find(jid, jidsearch, |
742 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); | 742 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
743 if (!sl_user) | 743 if (!sl_user) |
744 return; | 744 return; |
745 | 745 |
746 roster_usr = (roster*)sl_user->data; | 746 roster_usr = (roster_t *)sl_user->data; |
747 | 747 |
748 if (increment) | 748 if (increment) |
749 roster_usr->unread++; | 749 roster_usr->unread++; |
750 else | 750 else |
751 roster_usr->unread = 0; | 751 roster_usr->unread = 0; |
756 // Note that this function doesn't create the roster item if it doesn't exist. | 756 // Note that this function doesn't create the roster item if it doesn't exist. |
757 void roster_setuiprio(const char *jid, guint special, guint value, | 757 void roster_setuiprio(const char *jid, guint special, guint value, |
758 enum setuiprio_ops action) | 758 enum setuiprio_ops action) |
759 { | 759 { |
760 guint oldval, newval; | 760 guint oldval, newval; |
761 roster *roster_usr; | 761 roster_t *roster_usr; |
762 | 762 |
763 if (special) { | 763 if (special) { |
764 roster_usr = &roster_special; | 764 roster_usr = &roster_special; |
765 } else { | 765 } else { |
766 GSList *sl_user = roster_find(jid, jidsearch, | 766 GSList *sl_user = roster_find(jid, jidsearch, |
767 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); | 767 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
768 if (!sl_user) | 768 if (!sl_user) |
769 return; | 769 return; |
770 | 770 |
771 roster_usr = (roster*)sl_user->data; | 771 roster_usr = (roster_t *)sl_user->data; |
772 } | 772 } |
773 oldval = roster_usr->ui_prio; | 773 oldval = roster_usr->ui_prio; |
774 | 774 |
775 if (action == prio_max) | 775 if (action == prio_max) |
776 newval = MAX(oldval, value); | 776 newval = MAX(oldval, value); |
785 roster_unread_check(); | 785 roster_unread_check(); |
786 } | 786 } |
787 | 787 |
788 guint roster_getuiprio(const char *jid, guint special) | 788 guint roster_getuiprio(const char *jid, guint special) |
789 { | 789 { |
790 roster *roster_usr; | 790 roster_t *roster_usr; |
791 GSList *sl_user; | 791 GSList *sl_user; |
792 | 792 |
793 if (special) { | 793 if (special) { |
794 roster_usr = &roster_special; | 794 roster_usr = &roster_special; |
795 return roster_usr->ui_prio; | 795 return roster_usr->ui_prio; |
797 | 797 |
798 sl_user = roster_find(jid, jidsearch, | 798 sl_user = roster_find(jid, jidsearch, |
799 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); | 799 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
800 if (!sl_user) | 800 if (!sl_user) |
801 return 0; | 801 return 0; |
802 roster_usr = (roster*)sl_user->data; | 802 roster_usr = (roster_t *)sl_user->data; |
803 return roster_usr->ui_prio; | 803 return roster_usr->ui_prio; |
804 } | 804 } |
805 | 805 |
806 const char *roster_getname(const char *jid) | 806 const char *roster_getname(const char *jid) |
807 { | 807 { |
808 GSList *sl_user; | 808 GSList *sl_user; |
809 roster *roster_usr; | 809 roster_t *roster_usr; |
810 | 810 |
811 sl_user = roster_find(jid, jidsearch, | 811 sl_user = roster_find(jid, jidsearch, |
812 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); | 812 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
813 if (sl_user == NULL) | 813 if (sl_user == NULL) |
814 return NULL; // Not in the roster... | 814 return NULL; // Not in the roster... |
815 | 815 |
816 roster_usr = (roster*)sl_user->data; | 816 roster_usr = (roster_t *)sl_user->data; |
817 return roster_usr->name; | 817 return roster_usr->name; |
818 } | 818 } |
819 | 819 |
820 const char *roster_getnickname(const char *jid) | 820 const char *roster_getnickname(const char *jid) |
821 { | 821 { |
822 GSList *sl_user; | 822 GSList *sl_user; |
823 roster *roster_usr; | 823 roster_t *roster_usr; |
824 | 824 |
825 sl_user = roster_find(jid, jidsearch, | 825 sl_user = roster_find(jid, jidsearch, |
826 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); | 826 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); |
827 if (sl_user == NULL) | 827 if (sl_user == NULL) |
828 return NULL; // Not in the roster... | 828 return NULL; // Not in the roster... |
829 | 829 |
830 roster_usr = (roster*)sl_user->data; | 830 roster_usr = (roster_t *)sl_user->data; |
831 return roster_usr->nickname; | 831 return roster_usr->nickname; |
832 } | 832 } |
833 | 833 |
834 void roster_settype(const char *jid, guint type) | 834 void roster_settype(const char *jid, guint type) |
835 { | 835 { |
836 GSList *sl_user; | 836 GSList *sl_user; |
837 roster *roster_usr; | 837 roster_t *roster_usr; |
838 | 838 |
839 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) | 839 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
840 return; | 840 return; |
841 | 841 |
842 roster_usr = (roster*)sl_user->data; | 842 roster_usr = (roster_t *)sl_user->data; |
843 roster_usr->type = type; | 843 roster_usr->type = type; |
844 } | 844 } |
845 | 845 |
846 enum imstatus roster_getstatus(const char *jid, const char *resname) | 846 enum imstatus roster_getstatus(const char *jid, const char *resname) |
847 { | 847 { |
848 GSList *sl_user; | 848 GSList *sl_user; |
849 roster *roster_usr; | 849 roster_t *roster_usr; |
850 res *p_res; | 850 res_t *p_res; |
851 | 851 |
852 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); | 852 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
853 if (sl_user == NULL) | 853 if (sl_user == NULL) |
854 return offline; // Not in the roster, anyway... | 854 return offline; // Not in the roster, anyway... |
855 | 855 |
856 roster_usr = (roster*)sl_user->data; | 856 roster_usr = (roster_t *)sl_user->data; |
857 p_res = get_resource(roster_usr, resname); | 857 p_res = get_resource(roster_usr, resname); |
858 if (p_res) | 858 if (p_res) |
859 return p_res->status; | 859 return p_res->status; |
860 return offline; | 860 return offline; |
861 } | 861 } |
862 | 862 |
863 const char *roster_getstatusmsg(const char *jid, const char *resname) | 863 const char *roster_getstatusmsg(const char *jid, const char *resname) |
864 { | 864 { |
865 GSList *sl_user; | 865 GSList *sl_user; |
866 roster *roster_usr; | 866 roster_t *roster_usr; |
867 res *p_res; | 867 res_t *p_res; |
868 | 868 |
869 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); | 869 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
870 if (sl_user == NULL) | 870 if (sl_user == NULL) |
871 return NULL; // Not in the roster, anyway... | 871 return NULL; // Not in the roster, anyway... |
872 | 872 |
873 roster_usr = (roster*)sl_user->data; | 873 roster_usr = (roster_t *)sl_user->data; |
874 p_res = get_resource(roster_usr, resname); | 874 p_res = get_resource(roster_usr, resname); |
875 if (p_res) | 875 if (p_res) |
876 return p_res->status_msg; | 876 return p_res->status_msg; |
877 return roster_usr->offline_status_message; | 877 return roster_usr->offline_status_message; |
878 } | 878 } |
879 | 879 |
880 char roster_getprio(const char *jid, const char *resname) | 880 char roster_getprio(const char *jid, const char *resname) |
881 { | 881 { |
882 GSList *sl_user; | 882 GSList *sl_user; |
883 roster *roster_usr; | 883 roster_t *roster_usr; |
884 res *p_res; | 884 res_t *p_res; |
885 | 885 |
886 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); | 886 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
887 if (sl_user == NULL) | 887 if (sl_user == NULL) |
888 return offline; // Not in the roster, anyway... | 888 return offline; // Not in the roster, anyway... |
889 | 889 |
890 roster_usr = (roster*)sl_user->data; | 890 roster_usr = (roster_t *)sl_user->data; |
891 p_res = get_resource(roster_usr, resname); | 891 p_res = get_resource(roster_usr, resname); |
892 if (p_res) | 892 if (p_res) |
893 return p_res->prio; | 893 return p_res->prio; |
894 return 0; | 894 return 0; |
895 } | 895 } |
896 | 896 |
897 guint roster_gettype(const char *jid) | 897 guint roster_gettype(const char *jid) |
898 { | 898 { |
899 GSList *sl_user; | 899 GSList *sl_user; |
900 roster *roster_usr; | 900 roster_t *roster_usr; |
901 | 901 |
902 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) | 902 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
903 return 0; | 903 return 0; |
904 | 904 |
905 roster_usr = (roster*)sl_user->data; | 905 roster_usr = (roster_t *)sl_user->data; |
906 return roster_usr->type; | 906 return roster_usr->type; |
907 } | 907 } |
908 | 908 |
909 guint roster_getsubscription(const char *jid) | 909 guint roster_getsubscription(const char *jid) |
910 { | 910 { |
911 GSList *sl_user; | 911 GSList *sl_user; |
912 roster *roster_usr; | 912 roster_t *roster_usr; |
913 | 913 |
914 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) | 914 if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL) |
915 return 0; | 915 return 0; |
916 | 916 |
917 roster_usr = (roster*)sl_user->data; | 917 roster_usr = (roster_t *)sl_user->data; |
918 return roster_usr->subscription; | 918 return roster_usr->subscription; |
919 } | 919 } |
920 | 920 |
921 // roster_unsubscribed() | 921 // roster_unsubscribed() |
922 // We have lost buddy's presence updates; this function clears the status | 922 // We have lost buddy's presence updates; this function clears the status |
923 // message, sets the buddy offline and frees the resources | 923 // message, sets the buddy offline and frees the resources |
924 void roster_unsubscribed(const char *jid) | 924 void roster_unsubscribed(const char *jid) |
925 { | 925 { |
926 GSList *sl_user; | 926 GSList *sl_user; |
927 roster *roster_usr; | 927 roster_t *roster_usr; |
928 | 928 |
929 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); | 929 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
930 if (sl_user == NULL) | 930 if (sl_user == NULL) |
931 return; | 931 return; |
932 | 932 |
933 roster_usr = (roster*)sl_user->data; | 933 roster_usr = (roster_t *)sl_user->data; |
934 free_all_resources(&roster_usr->resource); | 934 free_all_resources(&roster_usr->resource); |
935 } | 935 } |
936 | 936 |
937 | 937 |
938 /* ### BuddyList functions ### */ | 938 /* ### BuddyList functions ### */ |
982 // buddylist_build() | 982 // buddylist_build() |
983 // Creates the buddylist from the roster entries. | 983 // Creates the buddylist from the roster entries. |
984 void buddylist_build(void) | 984 void buddylist_build(void) |
985 { | 985 { |
986 GSList *sl_roster_elt = groups; | 986 GSList *sl_roster_elt = groups; |
987 roster *roster_elt; | 987 roster_t *roster_elt; |
988 roster *roster_current_buddy = NULL; | 988 roster_t *roster_current_buddy = NULL; |
989 roster *roster_alternate_buddy = NULL; | 989 roster_t *roster_alternate_buddy = NULL; |
990 roster *roster_last_activity_buddy = NULL; | 990 roster_t *roster_last_activity_buddy = NULL; |
991 int shrunk_group; | 991 int shrunk_group; |
992 | 992 |
993 if (_rebuild_buddylist == FALSE) | 993 if (_rebuild_buddylist == FALSE) |
994 return; | 994 return; |
995 _rebuild_buddylist = FALSE; | 995 _rebuild_buddylist = FALSE; |
1014 buddylist = g_list_append(buddylist, &roster_special); | 1014 buddylist = g_list_append(buddylist, &roster_special); |
1015 | 1015 |
1016 // Create the new list | 1016 // Create the new list |
1017 while (sl_roster_elt) { | 1017 while (sl_roster_elt) { |
1018 GSList *sl_roster_usrelt; | 1018 GSList *sl_roster_usrelt; |
1019 roster *roster_usrelt; | 1019 roster_t *roster_usrelt; |
1020 guint pending_group = TRUE; | 1020 guint pending_group = TRUE; |
1021 roster_elt = (roster*) sl_roster_elt->data; | 1021 roster_elt = (roster_t *) sl_roster_elt->data; |
1022 | 1022 |
1023 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE; | 1023 shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE; |
1024 | 1024 |
1025 sl_roster_usrelt = roster_elt->list; | 1025 sl_roster_usrelt = roster_elt->list; |
1026 while (sl_roster_usrelt) { | 1026 while (sl_roster_usrelt) { |
1027 roster_usrelt = (roster*) sl_roster_usrelt->data; | 1027 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1028 | 1028 |
1029 // Buddy will be added if either: | 1029 // Buddy will be added if either: |
1030 // - buddy's status matches the display_filter | 1030 // - buddy's status matches the display_filter |
1031 // - buddy has a lock (for example the buddy window is currently open) | 1031 // - buddy has a lock (for example the buddy window is currently open) |
1032 // - buddy has a pending (non-read) message | 1032 // - buddy has a pending (non-read) message |
1070 | 1070 |
1071 // buddy_hide_group(roster, hide) | 1071 // buddy_hide_group(roster, hide) |
1072 // "hide" values: 1=hide 0=show_all -1=invert | 1072 // "hide" values: 1=hide 0=show_all -1=invert |
1073 void buddy_hide_group(gpointer rosterdata, int hide) | 1073 void buddy_hide_group(gpointer rosterdata, int hide) |
1074 { | 1074 { |
1075 roster *roster_usr = rosterdata; | 1075 roster_t *roster_usr = rosterdata; |
1076 if (hide > 0) // TRUE (hide) | 1076 if (hide > 0) // TRUE (hide) |
1077 roster_usr->flags |= ROSTER_FLAG_HIDE; | 1077 roster_usr->flags |= ROSTER_FLAG_HIDE; |
1078 else if (hide < 0) // NEG (invert) | 1078 else if (hide < 0) // NEG (invert) |
1079 roster_usr->flags ^= ROSTER_FLAG_HIDE; | 1079 roster_usr->flags ^= ROSTER_FLAG_HIDE; |
1080 else // FALSE (don't hide) | 1080 else // FALSE (don't hide) |
1081 roster_usr->flags &= ~ROSTER_FLAG_HIDE; | 1081 roster_usr->flags &= ~ROSTER_FLAG_HIDE; |
1082 } | 1082 } |
1083 | 1083 |
1084 const char *buddy_getjid(gpointer rosterdata) | 1084 const char *buddy_getjid(gpointer rosterdata) |
1085 { | 1085 { |
1086 roster *roster_usr = rosterdata; | 1086 roster_t *roster_usr = rosterdata; |
1087 if (!rosterdata) | 1087 if (!rosterdata) |
1088 return NULL; | 1088 return NULL; |
1089 return roster_usr->jid; | 1089 return roster_usr->jid; |
1090 } | 1090 } |
1091 | 1091 |
1094 // | 1094 // |
1095 // Note: buddy_setgroup() updates the user lists. | 1095 // Note: buddy_setgroup() updates the user lists. |
1096 // | 1096 // |
1097 void buddy_setgroup(gpointer rosterdata, char *newgroupname) | 1097 void buddy_setgroup(gpointer rosterdata, char *newgroupname) |
1098 { | 1098 { |
1099 roster *roster_usr = rosterdata; | 1099 roster_t *roster_usr = rosterdata; |
1100 GSList **sl_group; | 1100 GSList **sl_group; |
1101 GSList *sl_newgroup; | 1101 GSList *sl_newgroup; |
1102 roster *my_newgroup; | 1102 roster_t *my_newgroup; |
1103 | 1103 |
1104 // A group has no group :) | 1104 // A group has no group :) |
1105 if (roster_usr->type & ROSTER_TYPE_GROUP) return; | 1105 if (roster_usr->type & ROSTER_TYPE_GROUP) return; |
1106 | 1106 |
1107 // Add newgroup if necessary | 1107 // Add newgroup if necessary |
1108 if (!newgroupname) newgroupname = ""; | 1108 if (!newgroupname) newgroupname = ""; |
1109 sl_newgroup = roster_add_group(newgroupname); | 1109 sl_newgroup = roster_add_group(newgroupname); |
1110 if (!sl_newgroup) return; | 1110 if (!sl_newgroup) return; |
1111 my_newgroup = (roster*)sl_newgroup->data; | 1111 my_newgroup = (roster_t *)sl_newgroup->data; |
1112 | 1112 |
1113 // Remove the buddy from current group | 1113 // Remove the buddy from current group |
1114 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list; | 1114 sl_group = &((roster_t *)((GSList*)roster_usr->list)->data)->list; |
1115 *sl_group = g_slist_remove(*sl_group, rosterdata); | 1115 *sl_group = g_slist_remove(*sl_group, rosterdata); |
1116 | 1116 |
1117 // Remove old group if it is empty | 1117 // Remove old group if it is empty |
1118 if (!*sl_group) { | 1118 if (!*sl_group) { |
1119 roster *roster_grp = (roster*)((GSList*)roster_usr->list)->data; | 1119 roster_t *roster_grp = (roster_t *)((GSList*)roster_usr->list)->data; |
1120 g_free((gchar*)roster_grp->jid); | 1120 g_free((gchar*)roster_grp->jid); |
1121 g_free((gchar*)roster_grp->name); | 1121 g_free((gchar*)roster_grp->name); |
1122 g_free(roster_grp); | 1122 g_free(roster_grp); |
1123 groups = g_slist_remove(groups, roster_grp); | 1123 groups = g_slist_remove(groups, roster_grp); |
1124 } | 1124 } |
1131 buddylist_defer_build(); | 1131 buddylist_defer_build(); |
1132 } | 1132 } |
1133 | 1133 |
1134 void buddy_setname(gpointer rosterdata, char *newname) | 1134 void buddy_setname(gpointer rosterdata, char *newname) |
1135 { | 1135 { |
1136 roster *roster_usr = rosterdata; | 1136 roster_t *roster_usr = rosterdata; |
1137 GSList **sl_group; | 1137 GSList **sl_group; |
1138 | 1138 |
1139 // TODO For groups, we need to check for unicity | 1139 // TODO For groups, we need to check for unicity |
1140 // However, renaming a group boils down to moving all its buddies to | 1140 // However, renaming a group boils down to moving all its buddies to |
1141 // another group, so calling this function is not really necessary... | 1141 // another group, so calling this function is not really necessary... |
1147 } | 1147 } |
1148 if (newname) | 1148 if (newname) |
1149 roster_usr->name = g_strdup(newname); | 1149 roster_usr->name = g_strdup(newname); |
1150 | 1150 |
1151 // We need to resort the group list | 1151 // We need to resort the group list |
1152 sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list; | 1152 sl_group = &((roster_t *)((GSList*)roster_usr->list)->data)->list; |
1153 *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name); | 1153 *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name); |
1154 | 1154 |
1155 buddylist_defer_build(); | 1155 buddylist_defer_build(); |
1156 } | 1156 } |
1157 | 1157 |
1158 const char *buddy_getname(gpointer rosterdata) | 1158 const char *buddy_getname(gpointer rosterdata) |
1159 { | 1159 { |
1160 roster *roster_usr = rosterdata; | 1160 roster_t *roster_usr = rosterdata; |
1161 return roster_usr->name; | 1161 return roster_usr->name; |
1162 } | 1162 } |
1163 | 1163 |
1164 // buddy_setnickname(buddy, newnickname) | 1164 // buddy_setnickname(buddy, newnickname) |
1165 // Only for chatrooms | 1165 // Only for chatrooms |
1166 void buddy_setnickname(gpointer rosterdata, const char *newname) | 1166 void buddy_setnickname(gpointer rosterdata, const char *newname) |
1167 { | 1167 { |
1168 roster *roster_usr = rosterdata; | 1168 roster_t *roster_usr = rosterdata; |
1169 | 1169 |
1170 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; // XXX Error message? | 1170 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; // XXX Error message? |
1171 | 1171 |
1172 if (roster_usr->nickname) { | 1172 if (roster_usr->nickname) { |
1173 g_free((gchar*)roster_usr->nickname); | 1173 g_free((gchar*)roster_usr->nickname); |
1177 roster_usr->nickname = g_strdup(newname); | 1177 roster_usr->nickname = g_strdup(newname); |
1178 } | 1178 } |
1179 | 1179 |
1180 const char *buddy_getnickname(gpointer rosterdata) | 1180 const char *buddy_getnickname(gpointer rosterdata) |
1181 { | 1181 { |
1182 roster *roster_usr = rosterdata; | 1182 roster_t *roster_usr = rosterdata; |
1183 return roster_usr->nickname; | 1183 return roster_usr->nickname; |
1184 } | 1184 } |
1185 | 1185 |
1186 // buddy_setinsideroom(buddy, inside) | 1186 // buddy_setinsideroom(buddy, inside) |
1187 // Only for chatrooms | 1187 // Only for chatrooms |
1188 void buddy_setinsideroom(gpointer rosterdata, guint inside) | 1188 void buddy_setinsideroom(gpointer rosterdata, guint inside) |
1189 { | 1189 { |
1190 roster *roster_usr = rosterdata; | 1190 roster_t *roster_usr = rosterdata; |
1191 | 1191 |
1192 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; | 1192 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; |
1193 | 1193 |
1194 roster_usr->inside_room = inside; | 1194 roster_usr->inside_room = inside; |
1195 } | 1195 } |
1196 | 1196 |
1197 guint buddy_getinsideroom(gpointer rosterdata) | 1197 guint buddy_getinsideroom(gpointer rosterdata) |
1198 { | 1198 { |
1199 roster *roster_usr = rosterdata; | 1199 roster_t *roster_usr = rosterdata; |
1200 return roster_usr->inside_room; | 1200 return roster_usr->inside_room; |
1201 } | 1201 } |
1202 | 1202 |
1203 // buddy_settopic(buddy, newtopic) | 1203 // buddy_settopic(buddy, newtopic) |
1204 // Only for chatrooms | 1204 // Only for chatrooms |
1205 void buddy_settopic(gpointer rosterdata, const char *newtopic) | 1205 void buddy_settopic(gpointer rosterdata, const char *newtopic) |
1206 { | 1206 { |
1207 roster *roster_usr = rosterdata; | 1207 roster_t *roster_usr = rosterdata; |
1208 | 1208 |
1209 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; | 1209 if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; |
1210 | 1210 |
1211 if (roster_usr->topic) { | 1211 if (roster_usr->topic) { |
1212 g_free((gchar*)roster_usr->topic); | 1212 g_free((gchar*)roster_usr->topic); |
1216 roster_usr->topic = g_strdup(newtopic); | 1216 roster_usr->topic = g_strdup(newtopic); |
1217 } | 1217 } |
1218 | 1218 |
1219 const char *buddy_gettopic(gpointer rosterdata) | 1219 const char *buddy_gettopic(gpointer rosterdata) |
1220 { | 1220 { |
1221 roster *roster_usr = rosterdata; | 1221 roster_t *roster_usr = rosterdata; |
1222 return roster_usr->topic; | 1222 return roster_usr->topic; |
1223 } | 1223 } |
1224 | 1224 |
1225 void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus pstatus) | 1225 void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus pstatus) |
1226 { | 1226 { |
1227 roster *roster_usr = rosterdata; | 1227 roster_t *roster_usr = rosterdata; |
1228 roster_usr->print_status = pstatus; | 1228 roster_usr->print_status = pstatus; |
1229 } | 1229 } |
1230 | 1230 |
1231 enum room_printstatus buddy_getprintstatus(gpointer rosterdata) | 1231 enum room_printstatus buddy_getprintstatus(gpointer rosterdata) |
1232 { | 1232 { |
1233 roster *roster_usr = rosterdata; | 1233 roster_t *roster_usr = rosterdata; |
1234 return roster_usr->print_status; | 1234 return roster_usr->print_status; |
1235 } | 1235 } |
1236 | 1236 |
1237 void buddy_setautowhois(gpointer rosterdata, enum room_autowhois awhois) | 1237 void buddy_setautowhois(gpointer rosterdata, enum room_autowhois awhois) |
1238 { | 1238 { |
1239 roster *roster_usr = rosterdata; | 1239 roster_t *roster_usr = rosterdata; |
1240 roster_usr->auto_whois = awhois; | 1240 roster_usr->auto_whois = awhois; |
1241 } | 1241 } |
1242 | 1242 |
1243 enum room_autowhois buddy_getautowhois(gpointer rosterdata) | 1243 enum room_autowhois buddy_getautowhois(gpointer rosterdata) |
1244 { | 1244 { |
1245 roster *roster_usr = rosterdata; | 1245 roster_t *roster_usr = rosterdata; |
1246 return roster_usr->auto_whois; | 1246 return roster_usr->auto_whois; |
1247 } | 1247 } |
1248 | 1248 |
1249 void buddy_setflagjoins(gpointer rosterdata, enum room_flagjoins fjoins) | 1249 void buddy_setflagjoins(gpointer rosterdata, enum room_flagjoins fjoins) |
1250 { | 1250 { |
1251 roster *roster_usr = rosterdata; | 1251 roster_t *roster_usr = rosterdata; |
1252 roster_usr->flag_joins = fjoins; | 1252 roster_usr->flag_joins = fjoins; |
1253 } | 1253 } |
1254 | 1254 |
1255 enum room_flagjoins buddy_getflagjoins(gpointer rosterdata) | 1255 enum room_flagjoins buddy_getflagjoins(gpointer rosterdata) |
1256 { | 1256 { |
1257 roster *roster_usr = rosterdata; | 1257 roster_t *roster_usr = rosterdata; |
1258 return roster_usr->flag_joins; | 1258 return roster_usr->flag_joins; |
1259 } | 1259 } |
1260 | 1260 |
1261 // buddy_getgroupname() | 1261 // buddy_getgroupname() |
1262 // Returns a pointer on buddy's group name. | 1262 // Returns a pointer on buddy's group name. |
1263 const char *buddy_getgroupname(gpointer rosterdata) | 1263 const char *buddy_getgroupname(gpointer rosterdata) |
1264 { | 1264 { |
1265 roster *roster_usr = rosterdata; | 1265 roster_t *roster_usr = rosterdata; |
1266 | 1266 |
1267 if (roster_usr->type & ROSTER_TYPE_GROUP) | 1267 if (roster_usr->type & ROSTER_TYPE_GROUP) |
1268 return roster_usr->name; | 1268 return roster_usr->name; |
1269 | 1269 |
1270 if (roster_usr->type & ROSTER_TYPE_SPECIAL) | 1270 if (roster_usr->type & ROSTER_TYPE_SPECIAL) |
1271 return NULL; | 1271 return NULL; |
1272 | 1272 |
1273 // This is a user | 1273 // This is a user |
1274 return ((roster*)((GSList*)roster_usr->list)->data)->name; | 1274 return ((roster_t *)((GSList*)roster_usr->list)->data)->name; |
1275 } | 1275 } |
1276 | 1276 |
1277 // buddy_getgroup() | 1277 // buddy_getgroup() |
1278 // Returns a pointer on buddy's group. | 1278 // Returns a pointer on buddy's group. |
1279 gpointer buddy_getgroup(gpointer rosterdata) | 1279 gpointer buddy_getgroup(gpointer rosterdata) |
1280 { | 1280 { |
1281 roster *roster_usr = rosterdata; | 1281 roster_t *roster_usr = rosterdata; |
1282 | 1282 |
1283 if (roster_usr->type & ROSTER_TYPE_GROUP) | 1283 if (roster_usr->type & ROSTER_TYPE_GROUP) |
1284 return rosterdata; | 1284 return rosterdata; |
1285 | 1285 |
1286 if (roster_usr->type & ROSTER_TYPE_SPECIAL) | 1286 if (roster_usr->type & ROSTER_TYPE_SPECIAL) |
1290 return (gpointer)((GSList*)roster_usr->list)->data; | 1290 return (gpointer)((GSList*)roster_usr->list)->data; |
1291 } | 1291 } |
1292 | 1292 |
1293 void buddy_settype(gpointer rosterdata, guint type) | 1293 void buddy_settype(gpointer rosterdata, guint type) |
1294 { | 1294 { |
1295 roster *roster_usr = rosterdata; | 1295 roster_t *roster_usr = rosterdata; |
1296 roster_usr->type = type; | 1296 roster_usr->type = type; |
1297 } | 1297 } |
1298 | 1298 |
1299 guint buddy_gettype(gpointer rosterdata) | 1299 guint buddy_gettype(gpointer rosterdata) |
1300 { | 1300 { |
1301 roster *roster_usr = rosterdata; | 1301 roster_t *roster_usr = rosterdata; |
1302 return roster_usr->type; | 1302 return roster_usr->type; |
1303 } | 1303 } |
1304 | 1304 |
1305 guint buddy_getsubscription(gpointer rosterdata) | 1305 guint buddy_getsubscription(gpointer rosterdata) |
1306 { | 1306 { |
1307 roster *roster_usr = rosterdata; | 1307 roster_t *roster_usr = rosterdata; |
1308 return roster_usr->subscription; | 1308 return roster_usr->subscription; |
1309 } | 1309 } |
1310 | 1310 |
1311 enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname) | 1311 enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname) |
1312 { | 1312 { |
1313 roster *roster_usr = rosterdata; | 1313 roster_t *roster_usr = rosterdata; |
1314 res *p_res = get_resource(roster_usr, resname); | 1314 res_t *p_res = get_resource(roster_usr, resname); |
1315 if (p_res) | 1315 if (p_res) |
1316 return p_res->status; | 1316 return p_res->status; |
1317 return offline; | 1317 return offline; |
1318 } | 1318 } |
1319 | 1319 |
1320 const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname) | 1320 const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname) |
1321 { | 1321 { |
1322 roster *roster_usr = rosterdata; | 1322 roster_t *roster_usr = rosterdata; |
1323 res *p_res = get_resource(roster_usr, resname); | 1323 res_t *p_res = get_resource(roster_usr, resname); |
1324 if (p_res) | 1324 if (p_res) |
1325 return p_res->status_msg; | 1325 return p_res->status_msg; |
1326 return roster_usr->offline_status_message; | 1326 return roster_usr->offline_status_message; |
1327 } | 1327 } |
1328 | 1328 |
1329 time_t buddy_getstatustime(gpointer rosterdata, const char *resname) | 1329 time_t buddy_getstatustime(gpointer rosterdata, const char *resname) |
1330 { | 1330 { |
1331 roster *roster_usr = rosterdata; | 1331 roster_t *roster_usr = rosterdata; |
1332 res *p_res = get_resource(roster_usr, resname); | 1332 res_t *p_res = get_resource(roster_usr, resname); |
1333 if (p_res) | 1333 if (p_res) |
1334 return p_res->status_timestamp; | 1334 return p_res->status_timestamp; |
1335 return 0; | 1335 return 0; |
1336 } | 1336 } |
1337 | 1337 |
1338 gchar buddy_getresourceprio(gpointer rosterdata, const char *resname) | 1338 gchar buddy_getresourceprio(gpointer rosterdata, const char *resname) |
1339 { | 1339 { |
1340 roster *roster_usr = rosterdata; | 1340 roster_t *roster_usr = rosterdata; |
1341 res *p_res = get_resource(roster_usr, resname); | 1341 res_t *p_res = get_resource(roster_usr, resname); |
1342 if (p_res) | 1342 if (p_res) |
1343 return p_res->prio; | 1343 return p_res->prio; |
1344 return 0; | 1344 return 0; |
1345 } | 1345 } |
1346 | 1346 |
1347 guint buddy_resource_getevents(gpointer rosterdata, const char *resname) | 1347 guint buddy_resource_getevents(gpointer rosterdata, const char *resname) |
1348 { | 1348 { |
1349 roster *roster_usr = rosterdata; | 1349 roster_t *roster_usr = rosterdata; |
1350 res *p_res = get_resource(roster_usr, resname); | 1350 res_t *p_res = get_resource(roster_usr, resname); |
1351 if (p_res) | 1351 if (p_res) |
1352 return p_res->events; | 1352 return p_res->events; |
1353 return ROSTER_EVENT_NONE; | 1353 return ROSTER_EVENT_NONE; |
1354 } | 1354 } |
1355 | 1355 |
1356 void buddy_resource_setevents(gpointer rosterdata, const char *resname, | 1356 void buddy_resource_setevents(gpointer rosterdata, const char *resname, |
1357 guint events) | 1357 guint events) |
1358 { | 1358 { |
1359 roster *roster_usr = rosterdata; | 1359 roster_t *roster_usr = rosterdata; |
1360 res *p_res = get_resource(roster_usr, resname); | 1360 res_t *p_res = get_resource(roster_usr, resname); |
1361 if (p_res) | 1361 if (p_res) |
1362 p_res->events = events; | 1362 p_res->events = events; |
1363 } | 1363 } |
1364 | 1364 |
1365 char *buddy_resource_getcaps(gpointer rosterdata, const char *resname) | 1365 char *buddy_resource_getcaps(gpointer rosterdata, const char *resname) |
1366 { | 1366 { |
1367 roster *roster_usr = rosterdata; | 1367 roster_t *roster_usr = rosterdata; |
1368 res *p_res = get_resource(roster_usr, resname); | 1368 res_t *p_res = get_resource(roster_usr, resname); |
1369 if (p_res) | 1369 if (p_res) |
1370 return p_res->caps; | 1370 return p_res->caps; |
1371 return NULL; | 1371 return NULL; |
1372 } | 1372 } |
1373 | 1373 |
1374 void buddy_resource_setcaps(gpointer rosterdata, const char *resname, | 1374 void buddy_resource_setcaps(gpointer rosterdata, const char *resname, |
1375 const char *caps) | 1375 const char *caps) |
1376 { | 1376 { |
1377 roster *roster_usr = rosterdata; | 1377 roster_t *roster_usr = rosterdata; |
1378 res *p_res = get_resource(roster_usr, resname); | 1378 res_t *p_res = get_resource(roster_usr, resname); |
1379 if (p_res) { | 1379 if (p_res) { |
1380 g_free(p_res->caps); | 1380 g_free(p_res->caps); |
1381 p_res->caps = g_strdup(caps); | 1381 p_res->caps = g_strdup(caps); |
1382 } | 1382 } |
1383 } | 1383 } |
1384 | 1384 |
1385 struct xep0085 *buddy_resource_xep85(gpointer rosterdata, const char *resname) | 1385 struct xep0085 *buddy_resource_xep85(gpointer rosterdata, const char *resname) |
1386 { | 1386 { |
1387 #ifdef XEP0085 | 1387 #ifdef XEP0085 |
1388 roster *roster_usr = rosterdata; | 1388 roster_t *roster_usr = rosterdata; |
1389 res *p_res = get_resource(roster_usr, resname); | 1389 res_t *p_res = get_resource(roster_usr, resname); |
1390 if (p_res) | 1390 if (p_res) |
1391 return &p_res->xep85; | 1391 return &p_res->xep85; |
1392 #endif | 1392 #endif |
1393 return NULL; | 1393 return NULL; |
1394 } | 1394 } |
1395 | 1395 |
1396 struct pgp_data *buddy_resource_pgp(gpointer rosterdata, const char *resname) | 1396 struct pgp_data *buddy_resource_pgp(gpointer rosterdata, const char *resname) |
1397 { | 1397 { |
1398 #ifdef HAVE_GPGME | 1398 #ifdef HAVE_GPGME |
1399 roster *roster_usr = rosterdata; | 1399 roster_t *roster_usr = rosterdata; |
1400 res *p_res = get_resource(roster_usr, resname); | 1400 res_t *p_res = get_resource(roster_usr, resname); |
1401 if (p_res) | 1401 if (p_res) |
1402 return &p_res->pgpdata; | 1402 return &p_res->pgpdata; |
1403 #endif | 1403 #endif |
1404 return NULL; | 1404 return NULL; |
1405 } | 1405 } |
1406 | 1406 |
1407 enum imrole buddy_getrole(gpointer rosterdata, const char *resname) | 1407 enum imrole buddy_getrole(gpointer rosterdata, const char *resname) |
1408 { | 1408 { |
1409 roster *roster_usr = rosterdata; | 1409 roster_t *roster_usr = rosterdata; |
1410 res *p_res = get_resource(roster_usr, resname); | 1410 res_t *p_res = get_resource(roster_usr, resname); |
1411 if (p_res) | 1411 if (p_res) |
1412 return p_res->role; | 1412 return p_res->role; |
1413 return role_none; | 1413 return role_none; |
1414 } | 1414 } |
1415 | 1415 |
1416 enum imaffiliation buddy_getaffil(gpointer rosterdata, const char *resname) | 1416 enum imaffiliation buddy_getaffil(gpointer rosterdata, const char *resname) |
1417 { | 1417 { |
1418 roster *roster_usr = rosterdata; | 1418 roster_t *roster_usr = rosterdata; |
1419 res *p_res = get_resource(roster_usr, resname); | 1419 res_t *p_res = get_resource(roster_usr, resname); |
1420 if (p_res) | 1420 if (p_res) |
1421 return p_res->affil; | 1421 return p_res->affil; |
1422 return affil_none; | 1422 return affil_none; |
1423 } | 1423 } |
1424 | 1424 |
1425 const char *buddy_getrjid(gpointer rosterdata, const char *resname) | 1425 const char *buddy_getrjid(gpointer rosterdata, const char *resname) |
1426 { | 1426 { |
1427 roster *roster_usr = rosterdata; | 1427 roster_t *roster_usr = rosterdata; |
1428 res *p_res = get_resource(roster_usr, resname); | 1428 res_t *p_res = get_resource(roster_usr, resname); |
1429 if (p_res) | 1429 if (p_res) |
1430 return p_res->realjid; | 1430 return p_res->realjid; |
1431 return NULL; | 1431 return NULL; |
1432 } | 1432 } |
1433 | 1433 |
1435 // Return a singly-linked-list of resource names | 1435 // Return a singly-linked-list of resource names |
1436 // Note: the caller should free the list (and data) after use | 1436 // Note: the caller should free the list (and data) after use |
1437 // If roster_data is null, the current buddy is selected | 1437 // If roster_data is null, the current buddy is selected |
1438 GSList *buddy_getresources(gpointer rosterdata) | 1438 GSList *buddy_getresources(gpointer rosterdata) |
1439 { | 1439 { |
1440 roster *roster_usr = rosterdata; | 1440 roster_t *roster_usr = rosterdata; |
1441 GSList *reslist = NULL, *lp; | 1441 GSList *reslist = NULL, *lp; |
1442 | 1442 |
1443 if (!roster_usr) { | 1443 if (!roster_usr) { |
1444 if (!current_buddy) return NULL; | 1444 if (!current_buddy) return NULL; |
1445 roster_usr = BUDDATA(current_buddy); | 1445 roster_usr = BUDDATA(current_buddy); |
1446 } | 1446 } |
1447 for (lp = roster_usr->resource; lp; lp = g_slist_next(lp)) | 1447 for (lp = roster_usr->resource; lp; lp = g_slist_next(lp)) |
1448 reslist = g_slist_append(reslist, g_strdup(((res*)lp->data)->name)); | 1448 reslist = g_slist_append(reslist, g_strdup(((res_t *)lp->data)->name)); |
1449 | 1449 |
1450 return reslist; | 1450 return reslist; |
1451 } | 1451 } |
1452 | 1452 |
1453 // buddy_getresources_locale(roster_data) | 1453 // buddy_getresources_locale(roster_data) |
1472 | 1472 |
1473 // buddy_getactiveresource(roster_data) | 1473 // buddy_getactiveresource(roster_data) |
1474 // Returns name of active (selected for chat) resource | 1474 // Returns name of active (selected for chat) resource |
1475 const char *buddy_getactiveresource(gpointer rosterdata) | 1475 const char *buddy_getactiveresource(gpointer rosterdata) |
1476 { | 1476 { |
1477 roster *roster_usr = rosterdata; | 1477 roster_t *roster_usr = rosterdata; |
1478 res *resource; | 1478 res_t *resource; |
1479 | 1479 |
1480 if (!roster_usr) { | 1480 if (!roster_usr) { |
1481 if (!current_buddy) return NULL; | 1481 if (!current_buddy) return NULL; |
1482 roster_usr = BUDDATA(current_buddy); | 1482 roster_usr = BUDDATA(current_buddy); |
1483 } | 1483 } |
1487 return resource->name; | 1487 return resource->name; |
1488 } | 1488 } |
1489 | 1489 |
1490 void buddy_setactiveresource(gpointer rosterdata, const char *resname) | 1490 void buddy_setactiveresource(gpointer rosterdata, const char *resname) |
1491 { | 1491 { |
1492 roster *roster_usr = rosterdata; | 1492 roster_t *roster_usr = rosterdata; |
1493 res *p_res = NULL; | 1493 res_t *p_res = NULL; |
1494 if (resname) | 1494 if (resname) |
1495 p_res = get_resource(roster_usr, resname); | 1495 p_res = get_resource(roster_usr, resname); |
1496 roster_usr->active_resource = p_res; | 1496 roster_usr->active_resource = p_res; |
1497 } | 1497 } |
1498 | 1498 |
1500 // buddy_isresource(roster_data) | 1500 // buddy_isresource(roster_data) |
1501 // Return true if there is at least one resource | 1501 // Return true if there is at least one resource |
1502 // (which means, for a room, that it isn't empty) | 1502 // (which means, for a room, that it isn't empty) |
1503 int buddy_isresource(gpointer rosterdata) | 1503 int buddy_isresource(gpointer rosterdata) |
1504 { | 1504 { |
1505 roster *roster_usr = rosterdata; | 1505 roster_t *roster_usr = rosterdata; |
1506 if (!roster_usr) | 1506 if (!roster_usr) |
1507 return FALSE; | 1507 return FALSE; |
1508 if (roster_usr->resource) | 1508 if (roster_usr->resource) |
1509 return TRUE; | 1509 return TRUE; |
1510 return FALSE; | 1510 return FALSE; |
1514 // buddy_resource_setname(roster_data, oldname, newname) | 1514 // buddy_resource_setname(roster_data, oldname, newname) |
1515 // Useful for nickname change in a MUC room | 1515 // Useful for nickname change in a MUC room |
1516 void buddy_resource_setname(gpointer rosterdata, const char *resname, | 1516 void buddy_resource_setname(gpointer rosterdata, const char *resname, |
1517 const char *newname) | 1517 const char *newname) |
1518 { | 1518 { |
1519 roster *roster_usr = rosterdata; | 1519 roster_t *roster_usr = rosterdata; |
1520 res *p_res = get_resource(roster_usr, resname); | 1520 res_t *p_res = get_resource(roster_usr, resname); |
1521 if (p_res) { | 1521 if (p_res) { |
1522 if (p_res->name) { | 1522 if (p_res->name) { |
1523 g_free((gchar*)p_res->name); | 1523 g_free((gchar*)p_res->name); |
1524 p_res->name = NULL; | 1524 p_res->name = NULL; |
1525 } | 1525 } |
1530 | 1530 |
1531 // buddy_del_all_resources() | 1531 // buddy_del_all_resources() |
1532 // Remove all resources from the specified buddy | 1532 // Remove all resources from the specified buddy |
1533 void buddy_del_all_resources(gpointer rosterdata) | 1533 void buddy_del_all_resources(gpointer rosterdata) |
1534 { | 1534 { |
1535 roster *roster_usr = rosterdata; | 1535 roster_t *roster_usr = rosterdata; |
1536 | 1536 |
1537 while (roster_usr->resource) { | 1537 while (roster_usr->resource) { |
1538 res *r = roster_usr->resource->data; | 1538 res_t *r = roster_usr->resource->data; |
1539 del_resource(roster_usr, r->name); | 1539 del_resource(roster_usr, r->name); |
1540 } | 1540 } |
1541 } | 1541 } |
1542 | 1542 |
1543 // buddy_setflags() | 1543 // buddy_setflags() |
1544 // Set one or several flags to value (TRUE/FALSE) | 1544 // Set one or several flags to value (TRUE/FALSE) |
1545 void buddy_setflags(gpointer rosterdata, guint flags, guint value) | 1545 void buddy_setflags(gpointer rosterdata, guint flags, guint value) |
1546 { | 1546 { |
1547 roster *roster_usr = rosterdata; | 1547 roster_t *roster_usr = rosterdata; |
1548 if (value) | 1548 if (value) |
1549 roster_usr->flags |= flags; | 1549 roster_usr->flags |= flags; |
1550 else | 1550 else |
1551 roster_usr->flags &= ~flags; | 1551 roster_usr->flags &= ~flags; |
1552 } | 1552 } |
1553 | 1553 |
1554 guint buddy_getflags(gpointer rosterdata) | 1554 guint buddy_getflags(gpointer rosterdata) |
1555 { | 1555 { |
1556 roster *roster_usr = rosterdata; | 1556 roster_t *roster_usr = rosterdata; |
1557 return roster_usr->flags; | 1557 return roster_usr->flags; |
1558 } | 1558 } |
1559 | 1559 |
1560 guint buddy_getuiprio(gpointer rosterdata) | 1560 guint buddy_getuiprio(gpointer rosterdata) |
1561 { | 1561 { |
1562 roster *roster_usr = rosterdata; | 1562 roster_t *roster_usr = rosterdata; |
1563 return roster_usr->ui_prio; | 1563 return roster_usr->ui_prio; |
1564 } | 1564 } |
1565 | 1565 |
1566 guint buddy_getunread(gpointer rosterdata) | 1566 guint buddy_getunread(gpointer rosterdata) |
1567 { | 1567 { |
1568 roster *roster_usr = rosterdata; | 1568 roster_t *roster_usr = rosterdata; |
1569 return roster_usr->unread; | 1569 return roster_usr->unread; |
1570 } | 1570 } |
1571 | 1571 |
1572 // buddy_setonserverflag() | 1572 // buddy_setonserverflag() |
1573 // Set the on_server flag | 1573 // Set the on_server flag |
1574 void buddy_setonserverflag(gpointer rosterdata, guint onserver) | 1574 void buddy_setonserverflag(gpointer rosterdata, guint onserver) |
1575 { | 1575 { |
1576 roster *roster_usr = rosterdata; | 1576 roster_t *roster_usr = rosterdata; |
1577 roster_usr->on_server = onserver; | 1577 roster_usr->on_server = onserver; |
1578 } | 1578 } |
1579 | 1579 |
1580 guint buddy_getonserverflag(gpointer rosterdata) | 1580 guint buddy_getonserverflag(gpointer rosterdata) |
1581 { | 1581 { |
1582 roster *roster_usr = rosterdata; | 1582 roster_t *roster_usr = rosterdata; |
1583 return roster_usr->on_server; | 1583 return roster_usr->on_server; |
1584 } | 1584 } |
1585 | 1585 |
1586 // buddy_search_jid(jid) | 1586 // buddy_search_jid(jid) |
1587 // Look for a buddy with specified jid. | 1587 // Look for a buddy with specified jid. |
1588 // Search begins at buddylist; if no match is found in the the buddylist, | 1588 // Search begins at buddylist; if no match is found in the the buddylist, |
1589 // return NULL; | 1589 // return NULL; |
1590 GList *buddy_search_jid(const char *jid) | 1590 GList *buddy_search_jid(const char *jid) |
1591 { | 1591 { |
1592 GList *buddy; | 1592 GList *buddy; |
1593 roster *roster_usr; | 1593 roster_t *roster_usr; |
1594 | 1594 |
1595 buddylist_build(); | 1595 buddylist_build(); |
1596 if (!buddylist) return NULL; | 1596 if (!buddylist) return NULL; |
1597 | 1597 |
1598 for (buddy = buddylist; buddy; buddy = g_list_next(buddy)) { | 1598 for (buddy = buddylist; buddy; buddy = g_list_next(buddy)) { |
1599 roster_usr = (roster*)buddy->data; | 1599 roster_usr = (roster_t *)buddy->data; |
1600 if (roster_usr->jid && !strcasecmp(roster_usr->jid, jid)) | 1600 if (roster_usr->jid && !strcasecmp(roster_usr->jid, jid)) |
1601 return buddy; | 1601 return buddy; |
1602 } | 1602 } |
1603 return NULL; | 1603 return NULL; |
1604 } | 1604 } |
1608 // Search begins at current_buddy; if no match is found in the the buddylist, | 1608 // Search begins at current_buddy; if no match is found in the the buddylist, |
1609 // return NULL; | 1609 // return NULL; |
1610 GList *buddy_search(char *string) | 1610 GList *buddy_search(char *string) |
1611 { | 1611 { |
1612 GList *buddy = current_buddy; | 1612 GList *buddy = current_buddy; |
1613 roster *roster_usr; | 1613 roster_t *roster_usr; |
1614 buddylist_build(); | 1614 buddylist_build(); |
1615 if (!buddylist || !current_buddy) return NULL; | 1615 if (!buddylist || !current_buddy) return NULL; |
1616 for (;;) { | 1616 for (;;) { |
1617 gchar *jid_locale, *name_locale; | 1617 gchar *jid_locale, *name_locale; |
1618 char *found = NULL; | 1618 char *found = NULL; |
1619 | 1619 |
1620 buddy = g_list_next(buddy); | 1620 buddy = g_list_next(buddy); |
1621 if (!buddy) | 1621 if (!buddy) |
1622 buddy = buddylist; | 1622 buddy = buddylist; |
1623 | 1623 |
1624 roster_usr = (roster*)buddy->data; | 1624 roster_usr = (roster_t *)buddy->data; |
1625 | 1625 |
1626 jid_locale = from_utf8(roster_usr->jid); | 1626 jid_locale = from_utf8(roster_usr->jid); |
1627 if (jid_locale) { | 1627 if (jid_locale) { |
1628 found = strcasestr(jid_locale, string); | 1628 found = strcasestr(jid_locale, string); |
1629 g_free(jid_locale); | 1629 g_free(jid_locale); |
1649 void foreach_buddy(guint roster_type, | 1649 void foreach_buddy(guint roster_type, |
1650 void (*pfunc)(gpointer rosterdata, void *param), | 1650 void (*pfunc)(gpointer rosterdata, void *param), |
1651 void *param) | 1651 void *param) |
1652 { | 1652 { |
1653 GSList *sl_roster_elt = groups; | 1653 GSList *sl_roster_elt = groups; |
1654 roster *roster_elt; | 1654 roster_t *roster_elt; |
1655 GSList *sl_roster_usrelt; | 1655 GSList *sl_roster_usrelt; |
1656 roster *roster_usrelt; | 1656 roster_t *roster_usrelt; |
1657 | 1657 |
1658 while (sl_roster_elt) { // group list loop | 1658 while (sl_roster_elt) { // group list loop |
1659 roster_elt = (roster*) sl_roster_elt->data; | 1659 roster_elt = (roster_t *) sl_roster_elt->data; |
1660 if (roster_elt->type & ROSTER_TYPE_SPECIAL) | 1660 if (roster_elt->type & ROSTER_TYPE_SPECIAL) |
1661 continue; // Skip special items | 1661 continue; // Skip special items |
1662 sl_roster_usrelt = roster_elt->list; | 1662 sl_roster_usrelt = roster_elt->list; |
1663 while (sl_roster_usrelt) { // user list loop | 1663 while (sl_roster_usrelt) { // user list loop |
1664 roster_usrelt = (roster*) sl_roster_usrelt->data; | 1664 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1665 | 1665 |
1666 if (roster_usrelt->type & roster_type) | 1666 if (roster_usrelt->type & roster_type) |
1667 pfunc(roster_usrelt, param); | 1667 pfunc(roster_usrelt, param); |
1668 | 1668 |
1669 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); | 1669 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); |
1676 // Call pfunction(buddy, param) for each buddy in the specified group. | 1676 // Call pfunction(buddy, param) for each buddy in the specified group. |
1677 void foreach_group_member(gpointer groupdata, | 1677 void foreach_group_member(gpointer groupdata, |
1678 void (*pfunc)(gpointer rosterdata, void *param), | 1678 void (*pfunc)(gpointer rosterdata, void *param), |
1679 void *param) | 1679 void *param) |
1680 { | 1680 { |
1681 roster *roster_elt; | 1681 roster_t *roster_elt; |
1682 GSList *sl_roster_usrelt; | 1682 GSList *sl_roster_usrelt; |
1683 roster *roster_usrelt; | 1683 roster_t *roster_usrelt; |
1684 | 1684 |
1685 roster_elt = groupdata; | 1685 roster_elt = groupdata; |
1686 | 1686 |
1687 if (!(roster_elt->type & ROSTER_TYPE_GROUP)) | 1687 if (!(roster_elt->type & ROSTER_TYPE_GROUP)) |
1688 return; | 1688 return; |
1689 | 1689 |
1690 sl_roster_usrelt = roster_elt->list; | 1690 sl_roster_usrelt = roster_elt->list; |
1691 while (sl_roster_usrelt) { // user list loop | 1691 while (sl_roster_usrelt) { // user list loop |
1692 GSList *next_sl_usrelt; | 1692 GSList *next_sl_usrelt; |
1693 roster_usrelt = (roster*) sl_roster_usrelt->data; | 1693 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1694 | 1694 |
1695 next_sl_usrelt = g_slist_next(sl_roster_usrelt); | 1695 next_sl_usrelt = g_slist_next(sl_roster_usrelt); |
1696 pfunc(roster_usrelt, param); | 1696 pfunc(roster_usrelt, param); |
1697 sl_roster_usrelt = next_sl_usrelt; | 1697 sl_roster_usrelt = next_sl_usrelt; |
1698 } | 1698 } |
1704 // The list should be freed by the caller after use. | 1704 // The list should be freed by the caller after use. |
1705 GSList *compl_list(guint type) | 1705 GSList *compl_list(guint type) |
1706 { | 1706 { |
1707 GSList *list = NULL; | 1707 GSList *list = NULL; |
1708 GSList *sl_roster_elt = groups; | 1708 GSList *sl_roster_elt = groups; |
1709 roster *roster_elt; | 1709 roster_t *roster_elt; |
1710 GSList *sl_roster_usrelt; | 1710 GSList *sl_roster_usrelt; |
1711 roster *roster_usrelt; | 1711 roster_t *roster_usrelt; |
1712 | 1712 |
1713 while (sl_roster_elt) { // group list loop | 1713 while (sl_roster_elt) { // group list loop |
1714 roster_elt = (roster*) sl_roster_elt->data; | 1714 roster_elt = (roster_t *) sl_roster_elt->data; |
1715 | 1715 |
1716 if (roster_elt->type & ROSTER_TYPE_SPECIAL) | 1716 if (roster_elt->type & ROSTER_TYPE_SPECIAL) |
1717 continue; // Skip special items | 1717 continue; // Skip special items |
1718 | 1718 |
1719 if (type == ROSTER_TYPE_GROUP) { // (group names) | 1719 if (type == ROSTER_TYPE_GROUP) { // (group names) |
1720 if (roster_elt->name && *(roster_elt->name)) | 1720 if (roster_elt->name && *(roster_elt->name)) |
1721 list = g_slist_append(list, from_utf8(roster_elt->name)); | 1721 list = g_slist_append(list, from_utf8(roster_elt->name)); |
1722 } else { // ROSTER_TYPE_USER (jid) (or agent, or chatroom...) | 1722 } else { // ROSTER_TYPE_USER (jid) (or agent, or chatroom...) |
1723 sl_roster_usrelt = roster_elt->list; | 1723 sl_roster_usrelt = roster_elt->list; |
1724 while (sl_roster_usrelt) { // user list loop | 1724 while (sl_roster_usrelt) { // user list loop |
1725 roster_usrelt = (roster*) sl_roster_usrelt->data; | 1725 roster_usrelt = (roster_t *) sl_roster_usrelt->data; |
1726 | 1726 |
1727 if (roster_usrelt->jid) | 1727 if (roster_usrelt->jid) |
1728 list = g_slist_append(list, from_utf8(roster_usrelt->jid)); | 1728 list = g_slist_append(list, from_utf8(roster_usrelt->jid)); |
1729 | 1729 |
1730 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); | 1730 sl_roster_usrelt = g_slist_next(sl_roster_usrelt); |