| 21 */ |
21 */ |
| 22 #include "msn.h" |
22 #include "msn.h" |
| 23 #include "group.h" |
23 #include "group.h" |
| 24 |
24 |
| 25 MsnGroup * |
25 MsnGroup * |
| 26 msn_group_new(MsnSession *session, int id, const char *name) |
26 msn_group_new(MsnUserList *userlist, int id, const char *name) |
| 27 { |
27 { |
| 28 MsnGroup *group; |
28 MsnGroup *group; |
| 29 |
29 |
| 30 g_return_val_if_fail(session != NULL, NULL); |
30 g_return_val_if_fail(id >= 0, NULL); |
| 31 g_return_val_if_fail(id >= 0, NULL); |
31 g_return_val_if_fail(name != NULL, NULL); |
| 32 g_return_val_if_fail(name != NULL, NULL); |
|
| 33 |
32 |
| 34 group = msn_groups_find_with_id(session->groups, id); |
33 group = g_new0(MsnGroup, 1); |
| 35 |
34 |
| 36 if (group == NULL) { |
35 msn_userlist_add_group(userlist, group); |
| 37 group = g_new0(MsnGroup, 1); |
|
| 38 |
36 |
| 39 group->session = session; |
37 group->id = id; |
| 40 group->id = id; |
38 group->name = g_strdup(name); |
| 41 group->name = g_strdup(name); |
|
| 42 group->users = msn_users_new(); |
|
| 43 } |
|
| 44 |
|
| 45 msn_group_ref(group); |
|
| 46 |
39 |
| 47 return group; |
40 return group; |
| 48 } |
41 } |
| 49 |
42 |
| 50 void |
43 void |
| 51 msn_group_destroy(MsnGroup *group) |
44 msn_group_destroy(MsnGroup *group) |
| 52 { |
45 { |
| 53 g_return_if_fail(group != NULL); |
46 g_return_if_fail(group != NULL); |
| 54 |
47 |
| 55 if (group->ref_count > 0) { |
|
| 56 msn_group_unref(group); |
|
| 57 |
|
| 58 return; |
|
| 59 } |
|
| 60 |
|
| 61 if (group->session != NULL && group->session->groups != NULL) |
|
| 62 msn_groups_remove(group->session->groups, group); |
|
| 63 |
|
| 64 msn_users_destroy(group->users); |
|
| 65 |
|
| 66 g_free(group->name); |
48 g_free(group->name); |
| 67 g_free(group); |
49 g_free(group); |
| 68 } |
|
| 69 |
|
| 70 MsnGroup * |
|
| 71 msn_group_ref(MsnGroup *group) |
|
| 72 { |
|
| 73 g_return_val_if_fail(group != NULL, NULL); |
|
| 74 |
|
| 75 group->ref_count++; |
|
| 76 |
|
| 77 return group; |
|
| 78 } |
|
| 79 |
|
| 80 MsnGroup * |
|
| 81 msn_group_unref(MsnGroup *group) |
|
| 82 { |
|
| 83 g_return_val_if_fail(group != NULL, NULL); |
|
| 84 |
|
| 85 if (group->ref_count <= 0) |
|
| 86 return NULL; |
|
| 87 |
|
| 88 group->ref_count--; |
|
| 89 |
|
| 90 if (group->ref_count == 0) { |
|
| 91 msn_group_destroy(group); |
|
| 92 |
|
| 93 return NULL; |
|
| 94 } |
|
| 95 |
|
| 96 return group; |
|
| 97 } |
50 } |
| 98 |
51 |
| 99 void |
52 void |
| 100 msn_group_set_id(MsnGroup *group, int id) |
53 msn_group_set_id(MsnGroup *group, int id) |
| 101 { |
54 { |
| 130 { |
83 { |
| 131 g_return_val_if_fail(group != NULL, NULL); |
84 g_return_val_if_fail(group != NULL, NULL); |
| 132 |
85 |
| 133 return group->name; |
86 return group->name; |
| 134 } |
87 } |
| 135 |
|
| 136 void |
|
| 137 msn_group_add_user(MsnGroup *group, MsnUser *user) |
|
| 138 { |
|
| 139 g_return_if_fail(group != NULL); |
|
| 140 g_return_if_fail(user != NULL); |
|
| 141 |
|
| 142 msn_users_add(group->users, user); |
|
| 143 |
|
| 144 msn_user_ref(user); |
|
| 145 |
|
| 146 gaim_debug(GAIM_DEBUG_INFO, "msn", "Adding user %s to group %s (%d)\n", |
|
| 147 msn_user_get_passport(user), msn_group_get_name(group), |
|
| 148 msn_group_get_id(group)); |
|
| 149 } |
|
| 150 |
|
| 151 void |
|
| 152 msn_group_remove_user(MsnGroup *group, MsnUser *user) |
|
| 153 { |
|
| 154 g_return_if_fail(group != NULL); |
|
| 155 g_return_if_fail(user != NULL); |
|
| 156 |
|
| 157 msn_users_remove(group->users, user); |
|
| 158 |
|
| 159 msn_user_unref(user); |
|
| 160 } |
|
| 161 |
|
| 162 MsnUsers * |
|
| 163 msn_group_get_users(const MsnGroup *group) |
|
| 164 { |
|
| 165 g_return_val_if_fail(group != NULL, NULL); |
|
| 166 |
|
| 167 return group->users; |
|
| 168 } |
|
| 169 |
|
| 170 |
|
| 171 MsnGroups * |
|
| 172 msn_groups_new(void) |
|
| 173 { |
|
| 174 return g_new0(MsnGroups, 1); |
|
| 175 } |
|
| 176 |
|
| 177 void |
|
| 178 msn_groups_destroy(MsnGroups *groups) |
|
| 179 { |
|
| 180 g_return_if_fail(groups != NULL); |
|
| 181 |
|
| 182 while (groups->groups != NULL) |
|
| 183 msn_group_destroy(groups->groups->data); |
|
| 184 |
|
| 185 /* See if we've leaked anybody. */ |
|
| 186 while (groups->groups != NULL) { |
|
| 187 gaim_debug(GAIM_DEBUG_WARNING, "msn", |
|
| 188 "Leaking group %s (id %d)\n", |
|
| 189 msn_group_get_name(groups->groups->data), |
|
| 190 msn_group_get_id(groups->groups->data)); |
|
| 191 } |
|
| 192 |
|
| 193 g_free(groups); |
|
| 194 } |
|
| 195 |
|
| 196 void |
|
| 197 msn_groups_add(MsnGroups *groups, MsnGroup *group) |
|
| 198 { |
|
| 199 g_return_if_fail(groups != NULL); |
|
| 200 g_return_if_fail(group != NULL); |
|
| 201 |
|
| 202 groups->groups = g_list_append(groups->groups, group); |
|
| 203 |
|
| 204 groups->count++; |
|
| 205 |
|
| 206 gaim_debug(GAIM_DEBUG_INFO, "msn", "Adding group %s (%d)\n", |
|
| 207 msn_group_get_name(group), msn_group_get_id(group)); |
|
| 208 } |
|
| 209 |
|
| 210 void |
|
| 211 msn_groups_remove(MsnGroups *groups, MsnGroup *group) |
|
| 212 { |
|
| 213 g_return_if_fail(groups != NULL); |
|
| 214 g_return_if_fail(group != NULL); |
|
| 215 |
|
| 216 gaim_debug(GAIM_DEBUG_INFO, "msn", "Removing group %s (%d)\n", |
|
| 217 msn_group_get_name(group), msn_group_get_id(group)); |
|
| 218 |
|
| 219 groups->groups = g_list_remove(groups->groups, group); |
|
| 220 |
|
| 221 groups->count--; |
|
| 222 } |
|
| 223 |
|
| 224 size_t |
|
| 225 msn_groups_get_count(const MsnGroups *groups) |
|
| 226 { |
|
| 227 g_return_val_if_fail(groups != NULL, 0); |
|
| 228 |
|
| 229 return groups->count; |
|
| 230 } |
|
| 231 |
|
| 232 GList * |
|
| 233 msn_groups_get_list(const MsnGroups *groups) |
|
| 234 { |
|
| 235 g_return_val_if_fail(groups != NULL, NULL); |
|
| 236 |
|
| 237 return groups->groups; |
|
| 238 } |
|
| 239 |
|
| 240 MsnGroup * |
|
| 241 msn_groups_find_with_id(MsnGroups *groups, int id) |
|
| 242 { |
|
| 243 GList *l; |
|
| 244 |
|
| 245 g_return_val_if_fail(groups != NULL, NULL); |
|
| 246 g_return_val_if_fail(id >= 0, NULL); |
|
| 247 |
|
| 248 for (l = groups->groups; l != NULL; l = l->next) { |
|
| 249 MsnGroup *group = l->data; |
|
| 250 |
|
| 251 if (group->id == id) |
|
| 252 return group; |
|
| 253 } |
|
| 254 |
|
| 255 return NULL; |
|
| 256 } |
|
| 257 |
|
| 258 MsnGroup * |
|
| 259 msn_groups_find_with_name(MsnGroups *groups, const char *name) |
|
| 260 { |
|
| 261 GList *l; |
|
| 262 |
|
| 263 g_return_val_if_fail(groups != NULL, NULL); |
|
| 264 g_return_val_if_fail(name != NULL, NULL); |
|
| 265 |
|
| 266 for (l = groups->groups; l != NULL; l = l->next) { |
|
| 267 MsnGroup *group = l->data; |
|
| 268 |
|
| 269 if (group->name != NULL && !g_ascii_strcasecmp(name, group->name)) |
|
| 270 return group; |
|
| 271 } |
|
| 272 |
|
| 273 return NULL; |
|
| 274 } |
|