comparison mcabber/src/roster.c @ 1355:9716cf8a0726

Add on_server flag Add a flag to the roster data, TRUE if the roster item is known by the server. The command /info displays a message if the item is local.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 10 Nov 2007 23:15:16 +0100
parents a97701d8d735
children 01e558748379
comparison
equal deleted inserted replaced
1354:c373ff3fe7e1 1355:9716cf8a0726
75 /* For groupchats */ 75 /* For groupchats */
76 gchar *nickname; 76 gchar *nickname;
77 gchar *topic; 77 gchar *topic;
78 guint inside_room; 78 guint inside_room;
79 79
80 /* on_server is TRUE if the item is present on the server roster */
81 guint on_server;
82
80 /* To keep track of last status message */ 83 /* To keep track of last status message */
81 gchar *offline_status_message; 84 gchar *offline_status_message;
82 85
83 /* Flag used for the UI */ 86 /* Flag used for the UI */
84 guint flags; 87 guint flags;
335 } 338 }
336 return p_group; 339 return p_group;
337 } 340 }
338 341
339 // Returns a pointer to the new user, or existing user with that name 342 // Returns a pointer to the new user, or existing user with that name
343 // Note: if onserver is -1, the flag won't be changed.
340 GSList *roster_add_user(const char *jid, const char *name, const char *group, 344 GSList *roster_add_user(const char *jid, const char *name, const char *group,
341 guint type, enum subscr esub) 345 guint type, enum subscr esub, gint onserver)
342 { 346 {
343 roster *roster_usr; 347 roster *roster_usr;
344 roster *my_group; 348 roster *my_group;
345 GSList *slist; 349 GSList *slist;
346 350
365 buddy_setname(slist->data, (char*)name); 369 buddy_setname(slist->data, (char*)name);
366 // Let's check if the group name has changed 370 // Let's check if the group name has changed
367 oldgroupname = ((roster*)((GSList*)roster_usr->list)->data)->name; 371 oldgroupname = ((roster*)((GSList*)roster_usr->list)->data)->name;
368 if (group && strcmp(oldgroupname, group)) 372 if (group && strcmp(oldgroupname, group))
369 buddy_setgroup(slist->data, (char*)group); 373 buddy_setgroup(slist->data, (char*)group);
374 if (onserver != -1)
375 buddy_setonserverflag(slist->data, onserver);
370 return slist; 376 return slist;
371 } 377 }
372 // #2 add group if necessary 378 // #2 add group if necessary
373 slist = roster_add_group(group); 379 slist = roster_add_group(group);
374 if (!slist) return NULL; 380 if (!slist) return NULL;
391 unread_list = g_slist_append(unread_list, roster_usr); 397 unread_list = g_slist_append(unread_list, roster_usr);
392 } 398 }
393 roster_usr->type = type; 399 roster_usr->type = type;
394 roster_usr->subscription = esub; 400 roster_usr->subscription = esub;
395 roster_usr->list = slist; // (my_group SList element) 401 roster_usr->list = slist; // (my_group SList element)
402 if (onserver == 1)
403 roster_usr->on_server = TRUE;
396 // #4 Insert node (sorted) 404 // #4 Insert node (sorted)
397 my_group->list = g_slist_insert_sorted(my_group->list, roster_usr, 405 my_group->list = g_slist_insert_sorted(my_group->list, roster_usr,
398 (GCompareFunc)&roster_compare_name); 406 (GCompareFunc)&roster_compare_name);
399 return roster_find(jid, jidsearch, type); 407 return roster_find(jid, jidsearch, type);
400 } 408 }
494 502
495 sl_user = roster_find(jid, jidsearch, 503 sl_user = roster_find(jid, jidsearch,
496 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); 504 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
497 // If we can't find it, we add it 505 // If we can't find it, we add it
498 if (sl_user == NULL) 506 if (sl_user == NULL)
499 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none); 507 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER,
508 sub_none, -1);
500 509
501 // If there is no resource name, we can leave now 510 // If there is no resource name, we can leave now
502 if (!resname) return; 511 if (!resname) return;
503 512
504 roster_usr = (roster*)sl_user->data; 513 roster_usr = (roster*)sl_user->data;
584 593
585 sl_user = roster_find(jid, jidsearch, 594 sl_user = roster_find(jid, jidsearch,
586 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); 595 ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
587 // If we can't find it, we add it 596 // If we can't find it, we add it
588 if (sl_user == NULL) { 597 if (sl_user == NULL) {
589 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none); 598 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none, -1);
590 new_roster_item = TRUE; 599 new_roster_item = TRUE;
591 } 600 }
592 601
593 roster_usr = (roster*)sl_user->data; 602 roster_usr = (roster*)sl_user->data;
594 roster_grp = (roster*)roster_usr->list->data; 603 roster_grp = (roster*)roster_usr->list->data;
1273 { 1282 {
1274 roster *roster_usr = rosterdata; 1283 roster *roster_usr = rosterdata;
1275 return roster_usr->flags; 1284 return roster_usr->flags;
1276 } 1285 }
1277 1286
1287 // buddy_setonserverflag()
1288 // Set the on_server flag
1289 void buddy_setonserverflag(gpointer rosterdata, guint onserver)
1290 {
1291 roster *roster_usr = rosterdata;
1292 roster_usr->on_server = onserver;
1293 }
1294
1295 guint buddy_getonserverflag(gpointer rosterdata)
1296 {
1297 roster *roster_usr = rosterdata;
1298 return roster_usr->on_server;
1299 }
1300
1278 // buddy_search_jid(jid) 1301 // buddy_search_jid(jid)
1279 // Look for a buddy with specified jid. 1302 // Look for a buddy with specified jid.
1280 // Search begins at buddylist; if no match is found in the the buddylist, 1303 // Search begins at buddylist; if no match is found in the the buddylist,
1281 // return NULL; 1304 // return NULL;
1282 GList *buddy_search_jid(const char *jid) 1305 GList *buddy_search_jid(const char *jid)