From: Jim S. <jse...@us...> - 2002-07-07 14:32:00
|
Update of /cvsroot/gaim/gaim/src/protocols/oscar In directory usw-pr-cvs1:/tmp/cvs-serv3678/src/protocols/oscar Modified Files: aim.h oscar.c ssi.c Log Message: Support for server-side synchronization on group rename. (Thanks, Mark Doliner) Index: aim.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/aim.h,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- aim.h 5 May 2002 19:07:05 -0000 1.42 +++ aim.h 7 Jul 2002 14:31:57 -0000 1.43 @@ -1049,6 +1049,7 @@ faim_export int aim_ssi_addgroups(aim_session_t *sess, aim_conn_t *conn, char **gn, unsigned int num); faim_export int aim_ssi_addpord(aim_session_t *sess, aim_conn_t *conn, char **sn, unsigned int num, fu16_t type); faim_export int aim_ssi_movebuddy(aim_session_t *sess, aim_conn_t *conn, char *oldgn, char *newgn, char *sn); +faim_export int aim_ssi_rename_group(aim_session_t *sess, aim_conn_t *conn, char *oldgn, char *newgn); faim_export int aim_ssi_delbuddies(aim_session_t *sess, aim_conn_t *conn, char *gn, char **sn, unsigned int num); faim_export int aim_ssi_delmastergroup(aim_session_t *sess, aim_conn_t *conn); faim_export int aim_ssi_delgroups(aim_session_t *sess, aim_conn_t *conn, char **gn, unsigned int num); Index: oscar.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/oscar.c,v retrieving revision 1.141 retrieving revision 1.142 diff -u -d -r1.141 -r1.142 --- oscar.c 16 Jun 2002 16:14:22 -0000 1.141 +++ oscar.c 7 Jul 2002 14:31:57 -0000 1.142 @@ -3007,6 +3007,21 @@ } } +static void oscar_rename_group(struct gaim_connection *g, char *old_group, char *new_group, GList *members) { + struct oscar_data *odata = (struct oscar_data *)g->proto_data; + if (!odata->icq) + if (odata->sess->ssi.received_data) { + if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, new_group, 0x0001)) { + oscar_remove_buddies(g, members, old_group); + oscar_add_buddies(g, members); + debug_printf("ssi: moved all buddies from group %s to %s\n", old_group, new_group); + } else { + aim_ssi_rename_group(odata->sess, odata->conn, old_group, new_group); + debug_printf("ssi: renamed group %s to %s\n", old_group, new_group); + } + } +} + static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { /* XXX - Fix parsing of the ssi rights packet and pass us the data fu16_t maxbuddies, maxgroups, maxpermits, maxdenies; @@ -3892,6 +3907,7 @@ ret->add_buddy = oscar_add_buddy; ret->add_buddies = oscar_add_buddies; ret->group_buddy = oscar_move_buddy; + ret->rename_group = oscar_rename_group; ret->remove_buddy = oscar_remove_buddy; ret->remove_buddies = oscar_remove_buddies; ret->add_permit = oscar_add_permit; Index: ssi.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/ssi.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- ssi.c 22 Jun 2002 11:57:57 -0000 1.11 +++ ssi.c 7 Jul 2002 14:31:57 -0000 1.12 @@ -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) |