# HG changeset patch # User Mikael Berthe # Date 1194732916 -3600 # Node ID 9716cf8a07269ded9274adcb4055d7006d37295f # Parent c373ff3fe7e177da6ccbfd24cb1dcb986ba3d715 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. diff -r c373ff3fe7e1 -r 9716cf8a0726 mcabber/src/commands.c --- a/mcabber/src/commands.c Sat Nov 10 23:15:05 2007 +0100 +++ b/mcabber/src/commands.c Sat Nov 10 23:15:16 2007 +0100 @@ -1486,7 +1486,7 @@ { gpointer bud; const char *bjid, *name; - guint type; + guint type, on_srv; char *buffer; enum subscr esub; @@ -1498,6 +1498,7 @@ name = buddy_getname(bud); type = buddy_gettype(bud); esub = buddy_getsubscription(bud); + on_srv = buddy_getonserverflag(bud); buffer = g_new(char, 4096); @@ -1522,6 +1523,11 @@ snprintf(buffer, 127, "Type: %s", bstr); scr_WriteIncomingMessage(bjid, buffer, 0, HBB_PREFIX_INFO, 0); + if (!on_srv) { + scr_WriteIncomingMessage(bjid, "(Local item, not on the server)", + 0, HBB_PREFIX_INFO, 0); + } + if (esub == sub_both) bstr = "both"; else if (esub & sub_from) bstr = "from"; else if (esub & sub_to) bstr = "to"; @@ -1587,7 +1593,7 @@ g_free(p_res->data); } g_slist_free(resources); - } else { + } else { /* Item has no jid */ if (name) scr_LogPrint(LPRINT_NORMAL, "Name: %s", name); scr_LogPrint(LPRINT_NORMAL, "Type: %s", type == ROSTER_TYPE_GROUP ? "group" : diff -r c373ff3fe7e1 -r 9716cf8a0726 mcabber/src/hooks.c --- a/mcabber/src/hooks.c Sat Nov 10 23:15:05 2007 +0100 +++ b/mcabber/src/hooks.c Sat Nov 10 23:15:16 2007 +0100 @@ -88,7 +88,7 @@ roster_usr = roster_find(bjid, jidsearch, 0); if (!roster_usr) { new_guy = TRUE; - roster_usr = roster_add_user(bjid, NULL, NULL, rtype, sub_none); + roster_usr = roster_add_user(bjid, NULL, NULL, rtype, sub_none, -1); if (!roster_usr) { // Shouldn't happen... scr_LogPrint(LPRINT_LOGNORM, "ERROR: unable to add buddy!"); g_free(bmsg); diff -r c373ff3fe7e1 -r 9716cf8a0726 mcabber/src/jab_iq.c --- a/mcabber/src/jab_iq.c Sat Nov 10 23:15:05 2007 +0100 +++ b/mcabber/src/jab_iq.c Sat Nov 10 23:15:16 2007 +0100 @@ -309,7 +309,7 @@ else roster_type = ROSTER_TYPE_AGENT; - roster_add_user(cleanalias, name, group, roster_type, esub); + roster_add_user(cleanalias, name, group, roster_type, esub, 1); g_free(name_tmp); g_free(cleanalias); @@ -755,7 +755,8 @@ // Make sure this is a room (it can be a conversion user->room) room_elt = roster_find(bjid, jidsearch, 0); if (!room_elt) { - room_elt = roster_add_user(bjid, name, NULL, ROSTER_TYPE_ROOM, sub_none); + room_elt = roster_add_user(bjid, name, NULL, ROSTER_TYPE_ROOM, + sub_none, -1); } else { buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); /* diff -r c373ff3fe7e1 -r 9716cf8a0726 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Sat Nov 10 23:15:05 2007 +0100 +++ b/mcabber/src/jabglue.c Sat Nov 10 23:15:16 2007 +0100 @@ -1031,7 +1031,7 @@ jb_subscr_request_auth(cleanjid); - roster_add_user(cleanjid, name, group, ROSTER_TYPE_USER, sub_pending); + roster_add_user(cleanjid, name, group, ROSTER_TYPE_USER, sub_pending, -1); g_free(cleanjid); buddylist_build(); @@ -1190,7 +1190,8 @@ room_elt = roster_find(room, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM); // Add room if it doesn't already exist if (!room_elt) { - room_elt = roster_add_user(room, NULL, NULL, ROSTER_TYPE_ROOM, sub_none); + room_elt = roster_add_user(room, NULL, NULL, ROSTER_TYPE_ROOM, + sub_none, -1); } else { // Make sure this is a room (it can be a conversion user->room) buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); @@ -1749,7 +1750,8 @@ // Make sure this is a room (it can be a conversion user->room) room_elt = roster_find(bjid, jidsearch, 0); if (!room_elt) { - room_elt = roster_add_user(bjid, NULL, NULL, ROSTER_TYPE_ROOM, sub_none); + room_elt = roster_add_user(bjid, NULL, NULL, ROSTER_TYPE_ROOM, + sub_none, -1); } else { buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); } @@ -1988,7 +1990,8 @@ // Add room if it doesn't already exist // It shouldn't happen, there is probably something wrong (server or // network issue?) - room_elt = roster_add_user(roomjid, NULL, NULL, ROSTER_TYPE_ROOM, sub_none); + room_elt = roster_add_user(roomjid, NULL, NULL, ROSTER_TYPE_ROOM, + sub_none, -1); scr_LogPrint(LPRINT_LOGNORM, "Strange MUC presence message"); } else { // Make sure this is a room (it can be a conversion user->room) diff -r c373ff3fe7e1 -r 9716cf8a0726 mcabber/src/roster.c --- a/mcabber/src/roster.c Sat Nov 10 23:15:05 2007 +0100 +++ b/mcabber/src/roster.c Sat Nov 10 23:15:16 2007 +0100 @@ -77,6 +77,9 @@ gchar *topic; guint inside_room; + /* on_server is TRUE if the item is present on the server roster */ + guint on_server; + /* To keep track of last status message */ gchar *offline_status_message; @@ -337,8 +340,9 @@ } // Returns a pointer to the new user, or existing user with that name +// Note: if onserver is -1, the flag won't be changed. GSList *roster_add_user(const char *jid, const char *name, const char *group, - guint type, enum subscr esub) + guint type, enum subscr esub, gint onserver) { roster *roster_usr; roster *my_group; @@ -367,6 +371,8 @@ oldgroupname = ((roster*)((GSList*)roster_usr->list)->data)->name; if (group && strcmp(oldgroupname, group)) buddy_setgroup(slist->data, (char*)group); + if (onserver != -1) + buddy_setonserverflag(slist->data, onserver); return slist; } // #2 add group if necessary @@ -393,6 +399,8 @@ roster_usr->type = type; roster_usr->subscription = esub; roster_usr->list = slist; // (my_group SList element) + if (onserver == 1) + roster_usr->on_server = TRUE; // #4 Insert node (sorted) my_group->list = g_slist_insert_sorted(my_group->list, roster_usr, (GCompareFunc)&roster_compare_name); @@ -496,7 +504,8 @@ ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); // If we can't find it, we add it if (sl_user == NULL) - sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none); + sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, + sub_none, -1); // If there is no resource name, we can leave now if (!resname) return; @@ -586,7 +595,7 @@ ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); // If we can't find it, we add it if (sl_user == NULL) { - sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none); + sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER, sub_none, -1); new_roster_item = TRUE; } @@ -1275,6 +1284,20 @@ return roster_usr->flags; } +// buddy_setonserverflag() +// Set the on_server flag +void buddy_setonserverflag(gpointer rosterdata, guint onserver) +{ + roster *roster_usr = rosterdata; + roster_usr->on_server = onserver; +} + +guint buddy_getonserverflag(gpointer rosterdata) +{ + roster *roster_usr = rosterdata; + return roster_usr->on_server; +} + // buddy_search_jid(jid) // Look for a buddy with specified jid. // Search begins at buddylist; if no match is found in the the buddylist, diff -r c373ff3fe7e1 -r 9716cf8a0726 mcabber/src/roster.h --- a/mcabber/src/roster.h Sat Nov 10 23:15:05 2007 +0100 +++ b/mcabber/src/roster.h Sat Nov 10 23:15:16 2007 +0100 @@ -135,7 +135,7 @@ void roster_init(void); GSList *roster_add_group(const char *name); GSList *roster_add_user(const char *jid, const char *name, const char *group, - guint type, enum subscr esub); + guint type, enum subscr esub, gint on_server); GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type); void roster_del_user(const char *jid); void roster_free(void); @@ -197,6 +197,8 @@ void buddy_del_all_resources(gpointer rosterdata); void buddy_setflags(gpointer rosterdata, guint flags, guint value); guint buddy_getflags(gpointer rosterdata); +void buddy_setonserverflag(gpointer rosterdata, guint onserver); +guint buddy_getonserverflag(gpointer rosterdata); GList *buddy_search_jid(const char *jid); GList *buddy_search(char *string); void foreach_buddy(guint roster_type, diff -r c373ff3fe7e1 -r 9716cf8a0726 mcabber/src/screen.c --- a/mcabber/src/screen.c Sat Nov 10 23:15:05 2007 +0100 +++ b/mcabber/src/screen.c Sat Nov 10 23:15:16 2007 +0100 @@ -2198,7 +2198,7 @@ // Create it if necessary if (!roster_elt) roster_elt = roster_add_user(barejid, NULL, NULL, ROSTER_TYPE_USER, - sub_none); + sub_none, -1); // Set a lock to see it in the buddylist buddy_setflags(BUDDATA(roster_elt), ROSTER_FLAG_LOCK, TRUE); buddylist_build();