changeset 885:afdd81c2c44d

Allow /rename for groups
author Mikael Berthe <mikael@lilotux.net>
date Sun, 28 May 2006 10:42:22 +0200
parents 9e6d9f0cf9eb
children e58ae191a25c
files mcabber/src/commands.c mcabber/src/roster.c mcabber/src/roster.h
diffstat 3 files changed, 57 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/commands.c	Sat May 27 19:46:20 2006 +0200
+++ b/mcabber/src/commands.c	Sun May 28 10:42:22 2006 +0200
@@ -1185,6 +1185,18 @@
   g_free(buffer);
 }
 
+static void move_group_member(gpointer bud, void *groupnamedata)
+{
+  const char *jid, *name, *groupname;
+
+  groupname = (char *)groupnamedata;
+
+  jid  = buddy_getjid(bud);
+  name = buddy_getname(bud);
+
+  jb_updatebuddy(jid, name, *groupname ? groupname : NULL);
+}
+
 static void do_rename(char *arg)
 {
   gpointer bud;
@@ -1193,11 +1205,6 @@
   char *newname, *p;
   char *name_utf8;
 
-  if (!*arg) {
-    scr_LogPrint(LPRINT_NORMAL, "Please specify a new name.");
-    return;
-  }
-
   if (!current_buddy) return;
   bud = BUDDATA(current_buddy);
 
@@ -1205,12 +1212,13 @@
   group = buddy_getgroupname(bud);
   type  = buddy_gettype(bud);
 
-  if (type & ROSTER_TYPE_GROUP) {
-    scr_LogPrint(LPRINT_NORMAL, "You can't rename groups.");
+  if (type & ROSTER_TYPE_SPECIAL) {
+    scr_LogPrint(LPRINT_NORMAL, "You can't rename this item.");
     return;
   }
-  if (type & ROSTER_TYPE_SPECIAL) {
-    scr_LogPrint(LPRINT_NORMAL, "You can't rename this item.");
+
+  if (!*arg && !(type & ROSTER_TYPE_GROUP)) {
+    scr_LogPrint(LPRINT_NORMAL, "Please specify a new name.");
     return;
   }
 
@@ -1222,8 +1230,18 @@
   strip_arg_special_chars(newname);
 
   name_utf8 = to_utf8(newname);
-  buddy_setname(bud, name_utf8);
-  jb_updatebuddy(jid, name_utf8, group);
+
+  if (type & ROSTER_TYPE_GROUP) {
+    // Rename a whole group
+    foreach_group_member(bud, &move_group_member, name_utf8);
+    // Let's jump to the previous buddy, because this group name should
+    // disappear when we receive the server answer.
+    scr_RosterUp();
+  } else {
+    // Rename a single buddy
+    buddy_setname(bud, name_utf8);
+    jb_updatebuddy(jid, name_utf8, group);
+  }
 
   g_free(name_utf8);
   g_free(newname);
--- a/mcabber/src/roster.c	Sat May 27 19:46:20 2006 +0200
+++ b/mcabber/src/roster.c	Sun May 28 10:42:22 2006 +0200
@@ -259,7 +259,7 @@
     sample.name = (gchar*)jidname;
     comp = (GCompareFunc)&roster_compare_name_type;
   } else
-    return NULL;    // should not happen
+    return NULL;    // Should not happen...
 
   while (sl_roster_elt) {
     roster *roster_elt = (roster*)sl_roster_elt->data;
@@ -293,7 +293,6 @@
     p_group = roster_find(name, namesearch, ROSTER_TYPE_GROUP);
   }
   return p_group;
-
 }
 
 // Returns a pointer to the new user, or existing user with that name
@@ -1258,6 +1257,30 @@
   }
 }
 
+//  foreach_group_member(group, pfunction, param)
+// Call pfunction(buddy, param) for each buddy in the specified group.
+void foreach_group_member(gpointer groupdata,
+                   void (*pfunc)(gpointer rosterdata, void *param),
+                   void *param)
+{
+  roster *roster_elt;
+  GSList *sl_roster_usrelt;
+  roster *roster_usrelt;
+
+  roster_elt = groupdata;
+
+  if (!(roster_elt->type & ROSTER_TYPE_GROUP))
+    return;
+
+  sl_roster_usrelt = roster_elt->list;
+  while (sl_roster_usrelt) {  // user list loop
+    roster_usrelt = (roster*) sl_roster_usrelt->data;
+
+    pfunc(roster_usrelt, param);
+    sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
+  }
+}
+
 //  compl_list(type)
 // Returns a list of jid's or groups.  (For commands completion)
 // type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names)
--- a/mcabber/src/roster.h	Sat May 27 19:46:20 2006 +0200
+++ b/mcabber/src/roster.h	Sun May 28 10:42:22 2006 +0200
@@ -143,6 +143,9 @@
 void    foreach_buddy(guint roster_type,
                       void (*pfunc)(gpointer rosterdata, void *param),
                       void *param);
+void    foreach_group_member(gpointer groupdata,
+                             void (*pfunc)(gpointer rosterdata, void *param),
+                             void *param);
 gpointer unread_msg(gpointer rosterdata);
 
 GSList *compl_list(guint type);