changeset 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 c373ff3fe7e1
children 7794d76ca90e
files mcabber/src/commands.c mcabber/src/hooks.c mcabber/src/jab_iq.c mcabber/src/jabglue.c mcabber/src/roster.c mcabber/src/roster.h mcabber/src/screen.c
diffstat 7 files changed, 49 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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();