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.
--- 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" :
--- 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);
--- 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);
/*
--- 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)
--- 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,
--- 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,
--- 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();