Mercurial > pidgin
diff src/protocols/msn/group.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 | |
| children | b7e113a59b51 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/protocols/msn/group.c Sun May 25 22:51:19 2003 +0000 @@ -0,0 +1,274 @@ +/** + * @file group.c Group functions + * + * gaim + * + * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "msn.h" +#include "group.h" + +MsnGroup * +msn_group_new(MsnSession *session, int id, const char *name) +{ + MsnGroup *group; + + g_return_val_if_fail(session != NULL, NULL); + g_return_val_if_fail(id >= 0, NULL); + g_return_val_if_fail(name != NULL, NULL); + + group = msn_groups_find_with_id(session->groups, id); + + if (group == NULL) { + group = g_new0(MsnGroup, 1); + + group->session = session; + group->id = id; + group->name = g_strdup(name); + group->users = msn_users_new(); + } + + msn_group_ref(group); + + return group; +} + +void +msn_group_destroy(MsnGroup *group) +{ + g_return_if_fail(group != NULL); + + if (group->ref_count > 0) { + msn_group_unref(group); + + return; + } + + if (group->session != NULL && group->session->groups != NULL) + msn_groups_remove(group->session->groups, group); + + msn_users_destroy(group->users); + + g_free(group->name); + g_free(group); +} + +MsnGroup * +msn_group_ref(MsnGroup *group) +{ + g_return_val_if_fail(group != NULL, NULL); + + group->ref_count++; + + return group; +} + +MsnGroup * +msn_group_unref(MsnGroup *group) +{ + g_return_val_if_fail(group != NULL, NULL); + + if (group->ref_count <= 0) + return NULL; + + group->ref_count--; + + if (group->ref_count == 0) { + msn_group_destroy(group); + + return NULL; + } + + return group; +} + +void +msn_group_set_id(MsnGroup *group, int id) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(id >= 0); + + group->id = id; +} + +void +msn_group_set_name(MsnGroup *group, const char *name) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(name != NULL); + + if (group->name != NULL) + g_free(group->name); + + group->name = g_strdup(name); +} + +int +msn_group_get_id(const MsnGroup *group) +{ + g_return_val_if_fail(group != NULL, -1); + + return group->id; +} + +const char * +msn_group_get_name(const MsnGroup *group) +{ + g_return_val_if_fail(group != NULL, NULL); + + return group->name; +} + +void +msn_group_add_user(MsnGroup *group, MsnUser *user) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(user != NULL); + + msn_users_add(group->users, user); + + msn_user_ref(user); + + gaim_debug(GAIM_DEBUG_INFO, "msn", "Adding user %s to group %s (%d)\n", + msn_user_get_passport(user), msn_group_get_name(group), + msn_group_get_id(group)); +} + +void +msn_group_remove_user(MsnGroup *group, MsnUser *user) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(user != NULL); + + msn_users_remove(group->users, user); + + msn_user_unref(user); +} + +MsnUsers * +msn_group_get_users(const MsnGroup *group) +{ + g_return_val_if_fail(group != NULL, NULL); + + return group->users; +} + + +MsnGroups * +msn_groups_new(void) +{ + return g_new0(MsnGroups, 1); +} + +void +msn_groups_destroy(MsnGroups *groups) +{ + g_return_if_fail(groups != NULL); + + while (groups->groups != NULL) + msn_group_destroy(groups->groups->data); + + /* See if we've leaked anybody. */ + while (groups->groups != NULL) { + gaim_debug(GAIM_DEBUG_WARNING, "msn", + "Leaking group %s (id %d)\n", + msn_group_get_name(groups->groups->data), + msn_group_get_id(groups->groups->data)); + } + + g_free(groups); +} + +void +msn_groups_add(MsnGroups *groups, MsnGroup *group) +{ + g_return_if_fail(groups != NULL); + g_return_if_fail(group != NULL); + + groups->groups = g_list_append(groups->groups, group); + + groups->count++; + + gaim_debug(GAIM_DEBUG_INFO, "msn", "Adding group %s (%d)\n", + msn_group_get_name(group), msn_group_get_id(group)); +} + +void +msn_groups_remove(MsnGroups *groups, MsnGroup *group) +{ + g_return_if_fail(groups != NULL); + g_return_if_fail(group != NULL); + + gaim_debug(GAIM_DEBUG_INFO, "msn", "Removing group %s (%d)\n", + msn_group_get_name(group), msn_group_get_id(group)); + + groups->groups = g_list_remove(groups->groups, group); + + groups->count--; +} + +size_t +msn_groups_get_count(const MsnGroups *groups) +{ + g_return_val_if_fail(groups != NULL, 0); + + return groups->count; +} + +GList * +msn_groups_get_list(const MsnGroups *groups) +{ + g_return_val_if_fail(groups != NULL, NULL); + + return groups->groups; +} + +MsnGroup * +msn_groups_find_with_id(MsnGroups *groups, int id) +{ + GList *l; + + g_return_val_if_fail(groups != NULL, NULL); + g_return_val_if_fail(id >= 0, NULL); + + for (l = groups->groups; l != NULL; l = l->next) { + MsnGroup *group = l->data; + + if (group->id == id) + return group; + } + + return NULL; +} + +MsnGroup * +msn_groups_find_with_name(MsnGroups *groups, const char *name) +{ + GList *l; + + g_return_val_if_fail(groups != NULL, NULL); + g_return_val_if_fail(name != NULL, NULL); + + for (l = groups->groups; l != NULL; l = l->next) { + MsnGroup *group = l->data; + + if (group->name != NULL && !g_ascii_strcasecmp(name, group->name)) + return group; + } + + return NULL; +}
