diff src/protocols/oscar/ssi.c @ 3348:dd34e0b40fed

[gaim-migrate @ 3367] Support for server-side synchronization on group rename. (Thanks, Mark Doliner) committer: Tailor Script <tailor@pidgin.im>
author Jim Seymour <jseymour>
date Sun, 07 Jul 2002 14:31:57 +0000
parents f56d084d4046
children 7a3f16a375a5
line wrap: on
line diff
--- a/src/protocols/oscar/ssi.c	Fri Jul 05 22:27:40 2002 +0000
+++ b/src/protocols/oscar/ssi.c	Sun Jul 07 14:31:57 2002 +0000
@@ -94,7 +94,7 @@
  */
 static int aim_ssi_itemlist_rebuildgroup(struct aim_ssi_item **list, struct aim_ssi_item *parentgroup)
 {
-	int newlen, i;
+	int newlen;
 	struct aim_ssi_item *cur;
 
 	/* Free the old additional data */
@@ -517,7 +517,7 @@
 		}
 
 	/* Send the add item SNAC */
-	if (i = aim_ssi_addmoddel(sess, conn, newitems, num, AIM_CB_SSI_ADD)) {
+	if ((i = aim_ssi_addmoddel(sess, conn, newitems, num, AIM_CB_SSI_ADD))) {
 		free(newitems);
 		return -i;
 	}
@@ -526,11 +526,11 @@
 	free(newitems);
 
 	/* Rebuild the additional data in the parent group */
-	if (i = aim_ssi_itemlist_rebuildgroup(&sess->ssi.items, parentgroup))
+	if ((i = aim_ssi_itemlist_rebuildgroup(&sess->ssi.items, parentgroup)))
 		return i;
 
 	/* Send the mod item SNAC */
-	if (i = aim_ssi_addmoddel(sess, conn, &parentgroup, 1, AIM_CB_SSI_MOD))
+	if ((i = aim_ssi_addmoddel(sess, conn, &parentgroup, 1, AIM_CB_SSI_MOD)))
 		return i;
 
 	/* Begin sending SSI SNACs */
@@ -608,7 +608,7 @@
 		}
 
 	/* Send the add item SNAC */
-	if (i = aim_ssi_addmoddel(sess, conn, newitems, num, AIM_CB_SSI_ADD)) {
+	if ((i = aim_ssi_addmoddel(sess, conn, newitems, num, AIM_CB_SSI_ADD))) {
 		free(newitems);
 		return -i;
 	}
@@ -617,11 +617,11 @@
 	free(newitems);
 
 	/* Rebuild the additional data in the parent group */
-	if (i = aim_ssi_itemlist_rebuildgroup(&sess->ssi.items, parentgroup))
+	if ((i = aim_ssi_itemlist_rebuildgroup(&sess->ssi.items, parentgroup)))
 		return i;
 
 	/* Send the mod item SNAC */
-	if (i = aim_ssi_addmoddel(sess, conn, &parentgroup, 1, AIM_CB_SSI_MOD))
+	if ((i = aim_ssi_addmoddel(sess, conn, &parentgroup, 1, AIM_CB_SSI_MOD)))
 		return i;
 
 	/* Begin sending SSI SNACs */
@@ -664,7 +664,7 @@
 		}
 
 	/* Send the add item SNAC */
-	if (i = aim_ssi_addmoddel(sess, conn, newitems, num, AIM_CB_SSI_ADD)) {
+	if ((i = aim_ssi_addmoddel(sess, conn, newitems, num, AIM_CB_SSI_ADD))) {
 		free(newitems);
 		return -i;
 	}
@@ -714,8 +714,11 @@
 
 	/* Look up the new parent group */
 	if (!(groups[1] = aim_ssi_itemlist_finditem(sess->ssi.items, NULL, newgn, AIM_SSI_TYPE_GROUP))) {
-		free(groups);
-		return -ENOMEM;
+		aim_ssi_addgroups(sess, conn, &newgn, 1);
+		if (!(groups[1] = aim_ssi_itemlist_finditem(sess->ssi.items, NULL, newgn, AIM_SSI_TYPE_GROUP))) {
+			free(groups);
+			return -ENOMEM;
+		}
 	}
 
 	/* Send the delete item SNAC */
@@ -753,6 +756,46 @@
 }
 
 /**
+ * Rename a group.  I really like how this is done.  It turns me on.
+ *
+ * Did I say that out loud?...
+ *
+ * @param sess The oscar session.
+ * @param conn The bos connection for this session.
+ * @param oldgn The old group name.
+ * @param newgn The new group name.
+ * @return Return 0 if no errors, otherwise return the error number.
+ */
+faim_export int aim_ssi_rename_group(aim_session_t *sess, aim_conn_t *conn, char *oldgn, char *newgn)
+{
+	struct aim_ssi_item *group;
+
+	if (!sess || !conn || !oldgn || !newgn)
+		return -EINVAL;
+
+	/* Look up the group */
+	if (!(group = aim_ssi_itemlist_finditem(sess->ssi.items, NULL, oldgn, AIM_SSI_TYPE_GROUP)))
+		return -ENOMEM;
+
+	/* Free the old group name and copy the new one in its place. */
+	if (group->name)
+		free(group->name);
+	if (!(group->name = (char *)malloc((strlen(newgn)+1)*sizeof(char)))) {
+		group->name = NULL;
+		return -ENOMEM;
+	}
+	strcpy(group->name, newgn);
+
+	/* Send the mod item SNAC */
+	aim_ssi_addmoddel(sess, conn, &group, 1, AIM_CB_SSI_MOD);
+
+	/* Begin sending SSI SNACs */
+	aim_ssi_dispatch(sess, conn);
+
+	return 0;
+}
+
+/**
  * Delete an array of screen names from the given group.
  *
  * @param sess The oscar session.
@@ -1012,8 +1055,7 @@
  * @return Return 0 if no errors, otherwise return the error number.
  */
 faim_export int aim_ssi_setpermdeny(aim_session_t *sess, aim_conn_t *conn, fu8_t permdeny, fu32_t vismask) {
-	struct aim_ssi_item *cur, *tmp;
-	fu16_t j;
+	struct aim_ssi_item *cur;
 	aim_tlv_t *tlv;
 
 	if (!sess || !conn)
@@ -1077,8 +1119,7 @@
  * @return Return 0 if no errors, otherwise return the error number.
  */
 faim_export int aim_ssi_setpresence(aim_session_t *sess, aim_conn_t *conn, fu32_t presence) {
-	struct aim_ssi_item *cur, *tmp;
-	fu16_t j;
+	struct aim_ssi_item *cur;
 	aim_tlv_t *tlv;
 
 	if (!sess || !conn)