Mercurial > hg
comparison mcabber/src/roster.c @ 221:73f6ce668ba8
[/trunk] Changeset 233 by mikael
* /info now displays the current status message
author | mikael |
---|---|
date | Sat, 04 Jun 2005 12:47:13 +0000 |
parents | 9484ba81ec53 |
children | d5ae42cbe1fa |
comparison
equal
deleted
inserted
replaced
220:8dfdc6f1778e | 221:73f6ce668ba8 |
---|---|
27 /* This is a private structure type for the roster */ | 27 /* This is a private structure type for the roster */ |
28 | 28 |
29 typedef struct { | 29 typedef struct { |
30 const gchar *name; | 30 const gchar *name; |
31 const gchar *jid; | 31 const gchar *jid; |
32 const gchar *status_msg; | |
32 guint type; | 33 guint type; |
33 enum imstatus status; | 34 enum imstatus status; |
34 guint flags; | 35 guint flags; |
35 // list: user -> points to his group; group -> points to its users list | 36 // list: user -> points to his group; group -> points to its users list |
36 GSList *list; | 37 GSList *list; |
174 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); | 175 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
175 if (sl_user == NULL) | 176 if (sl_user == NULL) |
176 return; | 177 return; |
177 // Let's free memory (jid, name) | 178 // Let's free memory (jid, name) |
178 roster_usr = (roster*)sl_user->data; | 179 roster_usr = (roster*)sl_user->data; |
179 if (roster_usr->jid) | 180 if (roster_usr->jid) g_free((gchar*)roster_usr->jid); |
180 g_free((gchar*)roster_usr->jid); | 181 if (roster_usr->name) g_free((gchar*)roster_usr->name); |
181 if (roster_usr->name) | 182 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg); |
182 g_free((gchar*)roster_usr->name); | |
183 g_free(roster_usr); | 183 g_free(roster_usr); |
184 | 184 |
185 // That's a little complex, we need to dereference twice | 185 // That's a little complex, we need to dereference twice |
186 sl_group = ((roster*)sl_user->data)->list; | 186 sl_group = ((roster*)sl_user->data)->list; |
187 sl_group_listptr = &((roster*)(sl_group->data))->list; | 187 sl_group_listptr = &((roster*)(sl_group->data))->list; |
206 GSList *sl_usr = roster_grp->list; | 206 GSList *sl_usr = roster_grp->list; |
207 // Walk through this group users | 207 // Walk through this group users |
208 while (sl_usr) { | 208 while (sl_usr) { |
209 roster *roster_usr = (roster*)sl_usr->data; | 209 roster *roster_usr = (roster*)sl_usr->data; |
210 // Free name and jid | 210 // Free name and jid |
211 if (roster_usr->jid) | 211 if (roster_usr->jid) g_free((gchar*)roster_usr->jid); |
212 g_free((gchar*)roster_usr->jid); | 212 if (roster_usr->name) g_free((gchar*)roster_usr->name); |
213 if (roster_usr->name) | 213 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg); |
214 g_free((gchar*)roster_usr->name); | |
215 g_free(roster_usr); | 214 g_free(roster_usr); |
216 sl_usr = g_slist_next(sl_usr); | 215 sl_usr = g_slist_next(sl_usr); |
217 } | 216 } |
218 // Free group's users list | 217 // Free group's users list |
219 if (roster_grp->list) | 218 if (roster_grp->list) |
220 g_slist_free(roster_grp->list); | 219 g_slist_free(roster_grp->list); |
221 // Free group's name and jid | 220 // Free group's name and jid |
222 if (roster_grp->jid) | 221 if (roster_grp->jid) g_free((gchar*)roster_grp->jid); |
223 g_free((gchar*)roster_grp->jid); | 222 if (roster_grp->name) g_free((gchar*)roster_grp->name); |
224 if (roster_grp->name) | |
225 g_free((gchar*)roster_grp->name); | |
226 g_free(roster_grp); | 223 g_free(roster_grp); |
227 sl_grp = g_slist_next(sl_grp); | 224 sl_grp = g_slist_next(sl_grp); |
228 } | 225 } |
229 // Free groups list | 226 // Free groups list |
230 if (groups) { | 227 if (groups) { |
234 if (buddylist) | 231 if (buddylist) |
235 buddylist_build(); | 232 buddylist_build(); |
236 } | 233 } |
237 } | 234 } |
238 | 235 |
239 void roster_setstatus(const char *jid, enum imstatus bstat) | 236 void roster_setstatus(const char *jid, enum imstatus bstat, |
237 const char *status_msg) | |
240 { | 238 { |
241 GSList *sl_user; | 239 GSList *sl_user; |
242 roster *roster_usr; | 240 roster *roster_usr; |
243 | 241 |
244 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); | 242 sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
246 if (sl_user == NULL) | 244 if (sl_user == NULL) |
247 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER); | 245 sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER); |
248 | 246 |
249 roster_usr = (roster*)sl_user->data; | 247 roster_usr = (roster*)sl_user->data; |
250 roster_usr->status = bstat; | 248 roster_usr->status = bstat; |
249 if (roster_usr->status_msg) { | |
250 g_free((gchar*)roster_usr->status_msg); | |
251 roster_usr->status_msg = NULL; | |
252 } | |
253 if (status_msg) | |
254 roster_usr->status_msg = g_strdup(status_msg); | |
251 } | 255 } |
252 | 256 |
253 // roster_setflags() | 257 // roster_setflags() |
254 // Set one or several flags to value (TRUE/FALSE) | 258 // Set one or several flags to value (TRUE/FALSE) |
255 void roster_setflags(const char *jid, guint flags, guint value) | 259 void roster_setflags(const char *jid, guint flags, guint value) |
504 roster_clone = (roster*)sl_clone->data; | 508 roster_clone = (roster*)sl_clone->data; |
505 roster_clone->status = roster_usr->status; | 509 roster_clone->status = roster_usr->status; |
506 roster_clone->flags = roster_usr->flags; | 510 roster_clone->flags = roster_usr->flags; |
507 | 511 |
508 // Free old buddy | 512 // Free old buddy |
509 if (roster_usr->jid) g_free((gchar*)roster_usr->jid); | 513 if (roster_usr->jid) g_free((gchar*)roster_usr->jid); |
510 if (roster_usr->name) g_free((gchar*)roster_usr->name); | 514 if (roster_usr->name) g_free((gchar*)roster_usr->name); |
515 if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg); | |
511 g_free(roster_usr); | 516 g_free(roster_usr); |
512 | 517 |
513 // If new new group is folded, the curren_buddy will be lost, and the | 518 // If new new group is folded, the curren_buddy will be lost, and the |
514 // chat window won't be correctly refreshed. So we make sure it isn't... | 519 // chat window won't be correctly refreshed. So we make sure it isn't... |
515 ((roster*)((GSList*)roster_clone->list)->data)->flags &= ~ROSTER_FLAG_HIDE; | 520 ((roster*)((GSList*)roster_clone->list)->data)->flags &= ~ROSTER_FLAG_HIDE; |
587 { | 592 { |
588 roster *roster_usr = rosterdata; | 593 roster *roster_usr = rosterdata; |
589 return roster_usr->status; | 594 return roster_usr->status; |
590 } | 595 } |
591 | 596 |
597 const char *buddy_getstatusmsg(gpointer rosterdata) | |
598 { | |
599 roster *roster_usr = rosterdata; | |
600 return roster_usr->status_msg; | |
601 } | |
602 | |
592 // buddy_setflags() | 603 // buddy_setflags() |
593 // Set one or several flags to value (TRUE/FALSE) | 604 // Set one or several flags to value (TRUE/FALSE) |
594 void buddy_setflags(gpointer rosterdata, guint flags, guint value) | 605 void buddy_setflags(gpointer rosterdata, guint flags, guint value) |
595 { | 606 { |
596 roster *roster_usr = rosterdata; | 607 roster *roster_usr = rosterdata; |