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;