mcabber/src/roster.c
changeset 221 73f6ce668ba8
parent 214 9484ba81ec53
child 225 d5ae42cbe1fa
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;