Mercurial > pidgin.yaz
diff src/protocols/msn/notification.c @ 5518:bf2a7a7b739d
[gaim-migrate @ 5918]
Reworked the group support. You should now be able to delete groups by
dragging a user into them and then back out.
I stress _should_. This will likely have bugs. I cleaned up the ones I
found, I think, but I'm not 100% confident here :) Please test! Preferably
on test accounts, but it won't kill things, just reorder stuff.
committer: Tailor Script <tailor@pidgin.im>
| author | Christian Hammond <chipx86@chipx86.com> |
|---|---|
| date | Sun, 25 May 2003 22:51:19 +0000 |
| parents | f6ef1871cfcc |
| children | 11be8ae32937 |
line wrap: on
line diff
--- a/src/protocols/msn/notification.c Sun May 25 19:47:13 2003 +0000 +++ b/src/protocols/msn/notification.c Sun May 25 22:51:19 2003 +0000 @@ -45,40 +45,55 @@ MsnSession *session = servconn->session; struct gaim_connection *gc = session->account->gc; struct buddy *b; + MsnGroup *group = NULL; + struct group *g = NULL; + int group_id; + + group_id = msn_user_get_group_id(user); + + if (group_id > -1) + group = msn_groups_find_with_id(session->groups, group_id); + + if (group == NULL) { + GList *l; + gaim_debug(GAIM_DEBUG_WARNING, "msn", + "Group ID %d for user %s was not defined.\n", + group_id, msn_user_get_passport(user)); + + /* Find a group that we can stick this guy into. Lamer. */ + l = msn_groups_get_list(session->groups); + + if (l != NULL) { + group = l->data; + + msn_user_set_group_id(user, msn_group_get_id(group)); + } + } + + if (group == NULL || + (g = gaim_find_group(msn_group_get_name(group))) == NULL) { + + gaim_debug(GAIM_DEBUG_ERROR, "msn", + "Group '%s' appears in server-side " + "buddy list, but not here!", + msn_group_get_name(group)); + } + + if (group != NULL) + msn_group_add_user(group, user); + + if (g == NULL) { + /* Should never happen. */ + + if ((g = gaim_find_group(_("Buddies"))) == NULL) { + g = gaim_group_new(_("Buddies")); + gaim_blist_add_group(g, NULL); + } + } b = gaim_find_buddy(gc->account, msn_user_get_passport(user)); if (b == NULL) { - struct group *g = NULL; - const char *group_name = NULL; - int group_id; - - group_id = msn_user_get_group_id(user); - - if (group_id > -1) { - group_name = g_hash_table_lookup(session->group_names, - &group_id); - } - - if (group_name == NULL) { - gaim_debug(GAIM_DEBUG_WARNING, "msn", - "Group ID %d for user %s was not defined.\n", - group_id, msn_user_get_passport(user)); - } - else if ((g = gaim_find_group(group_name)) == NULL) { - gaim_debug(GAIM_DEBUG_ERROR, "msn", - "Group '%s' appears in server-side " - "buddy list, but not here!", - group_name); - } - - if (g == NULL) { - if ((g = gaim_find_group(_("Buddies"))) == NULL) { - g = gaim_group_new(_("Buddies")); - gaim_blist_add_group(g, NULL); - } - } - b = gaim_buddy_new(gc->account, msn_user_get_passport(user), NULL); @@ -420,7 +435,9 @@ friend = msn_url_decode(params[4]); if (!g_ascii_strcasecmp(list, "FL")) { - user = msn_user_new(session, passport, friend); + user = msn_user_new(session, passport, NULL); + + msn_user_set_group_id(user, atoi(params[5])); __add_buddy(servconn, user); @@ -455,20 +472,18 @@ __adg_cmd(MsnServConn *servconn, const char *command, const char **params, size_t param_count) { + MsnGroup *group; MsnSession *session = servconn->session; - gint *group_id; + gint group_id; char *group_name; - group_id = g_new(gint, 1); - *group_id = atoi(params[3]); + group_id = atoi(params[3]); group_name = msn_url_decode(params[2]); - gaim_debug(GAIM_DEBUG_INFO, "msn", "Added group %s (id %d)\n", - group_name, group_id); + group = msn_group_new(session, group_id, group_name); - g_hash_table_insert(session->group_ids, group_name, group_id); - g_hash_table_insert(session->group_names, group_id, g_strdup(group_name)); + msn_groups_add(session->groups, group); return TRUE; } @@ -592,10 +607,10 @@ size_t param_count) { MsnSession *session = servconn->session; + MsnGroup *group; struct group *g; const char *name; int group_num, num_groups, group_id; - gint *group_id_1, *group_id_2; group_num = atoi(params[2]); num_groups = atoi(params[3]); @@ -605,24 +620,12 @@ if (num_groups == 0) return TRUE; - if (group_num == 1) { - session->group_names = g_hash_table_new_full(g_int_hash, g_int_equal, - g_free, g_free); - session->group_ids = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); - } - - group_id_1 = g_new(gint, 1); - group_id_2 = g_new(gint, 1); - - *group_id_1 = group_id; - *group_id_2 = group_id; - if (!strcmp(name, "~")) name = _("Buddies"); - g_hash_table_insert(session->group_names, group_id_1, g_strdup(name)); - g_hash_table_insert(session->group_ids, g_strdup(name), group_id_2); + group = msn_group_new(session, group_id, name); + + msn_groups_add(session->groups, group); if ((g = gaim_find_group(name)) == NULL) { g = gaim_group_new(name); @@ -837,8 +840,6 @@ friend = msn_url_decode(params[3]); - gaim_debug(GAIM_DEBUG_INFO, "msn", "Setting friendly name to %s\n", - friend); g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", friend); return TRUE; @@ -849,22 +850,21 @@ size_t param_count) { MsnSession *session = servconn->session; - gint *group_id; + MsnGroup *group; + int group_id; char *group_name; - group_id = g_new(gint, 1); - *group_id = atoi(params[2]); + group_id = atoi(params[2]); group_name = msn_url_decode(params[3]); - gaim_debug(GAIM_DEBUG_INFO, "msn", "Renamed group %s to %s\n", - g_hash_table_lookup(session->group_names, group_id), - group_name); + group = msn_groups_find_with_id(session->groups, group_id); - g_hash_table_replace(session->group_names, group_id, g_strdup(group_name)); + gaim_debug(GAIM_DEBUG_INFO, "msn", "Renamed group %s to %s\n", + msn_group_get_name(group), group_name); - g_hash_table_remove(session->group_ids, group_name); - g_hash_table_insert(session->group_ids, group_name, group_id); + if (group != NULL) + msn_group_set_name(group, group_name); return TRUE; } @@ -877,38 +877,84 @@ /* I hate this. */ if (session->moving_buddy) { + MsnGroup *group, *old_group; struct gaim_connection *gc = session->account->gc; const char *passport = params[3]; char outparams[MSN_BUF_LEN]; - int *group_id; + + group = msn_groups_find_with_name(session->groups, + session->dest_group_name); + + old_group = session->old_group; + + session->moving_buddy = FALSE; + session->old_group = NULL; - group_id = g_hash_table_lookup(session->group_ids, - session->dest_group_name); + if (group == NULL) { + gaim_debug(GAIM_DEBUG_ERROR, "msn", + "Still don't have a group ID for %s while moving %s!\n", + session->dest_group_name, passport); + + g_free(session->dest_group_name); + session->dest_group_name = NULL; + + return TRUE; + } g_free(session->dest_group_name); session->dest_group_name = NULL; - session->moving_buddy = FALSE; - - if (group_id == NULL) { - gaim_debug(GAIM_DEBUG_ERROR, "msn", - "Still don't have a group ID for %s while moving %s!\n", - session->dest_group_name, passport); - return TRUE; - } g_snprintf(outparams, sizeof(outparams), "FL %s %s %d", - passport, passport, *group_id); + passport, passport, msn_group_get_id(group)); if (!msn_servconn_send_command(session->notification_conn, "ADD", outparams)) { hide_login_progress(gc, _("Write error")); signoff(gc); + return FALSE; + } + + if (old_group != NULL) + msn_group_remove_user(old_group, session->moving_user); + + msn_user_unref(session->moving_user); + + session->moving_user = NULL; + + if (old_group != NULL && + msn_users_get_count(msn_group_get_users(old_group)) <= 0) { + + g_snprintf(outparams, sizeof(outparams), "%d", + msn_group_get_id(old_group)); + + if (!msn_servconn_send_command(session->notification_conn, + "RMG", outparams)) { + + hide_login_progress(gc, _("Write error")); + signoff(gc); + return FALSE; + } } } return TRUE; } +static gboolean +__rmg_cmd(MsnServConn *servconn, const char *command, const char **params, + size_t param_count) +{ + MsnSession *session = servconn->session; + MsnGroup *group; + + group = msn_groups_find_with_id(session->groups, atoi(params[2])); + + if (group != NULL) + msn_groups_remove(session->groups, group); + + return TRUE; +} + /************************************************************************** * Misc commands **************************************************************************/ @@ -1354,7 +1400,7 @@ msn_servconn_register_command(notification, "REA", __rea_cmd); msn_servconn_register_command(notification, "REG", __reg_cmd); msn_servconn_register_command(notification, "REM", __rem_cmd); - msn_servconn_register_command(notification, "RMG", __blank_cmd); + msn_servconn_register_command(notification, "RMG", __rmg_cmd); msn_servconn_register_command(notification, "RNG", __rng_cmd); msn_servconn_register_command(notification, "SYN", __blank_cmd); msn_servconn_register_command(notification, "URL", __url_cmd);
