mcabber/src/roster.c
changeset 843 915a7f17474a
parent 819 c2d7d9dd4193
child 848 a9161d2dc414
equal deleted inserted replaced
842:f74c5c6d2c24 843:915a7f17474a
    66   /* For groupchats */
    66   /* For groupchats */
    67   gchar *nickname;
    67   gchar *nickname;
    68   gchar *topic;
    68   gchar *topic;
    69   guint8 inside_room;
    69   guint8 inside_room;
    70 
    70 
       
    71   /* To keep track of last status message */
       
    72   gchar *offline_status_message;
       
    73 
    71   /* Flag used for the UI */
    74   /* Flag used for the UI */
    72   guint flags;
    75   guint flags;
    73 
    76 
    74   // list: user -> points to his group; group -> points to its users list
    77   // list: user -> points to his group; group -> points to its users list
    75   GSList *list;
    78   GSList *list;
   182   }
   185   }
   183 
   186 
   184   if (!p_res_elt) return;   // Resource not found
   187   if (!p_res_elt) return;   // Resource not found
   185 
   188 
   186   p_res = p_res_elt->data;
   189   p_res = p_res_elt->data;
       
   190 
       
   191   // Keep a copy of the status message when a buddy goes offline
       
   192   if (g_slist_length(rost->resource) == 1) {
       
   193     g_free(rost->offline_status_message);
       
   194     rost->offline_status_message = p_res->status_msg;
       
   195     p_res->status_msg = NULL;
       
   196   }
       
   197 
   187   // Free allocations and delete resource node
   198   // Free allocations and delete resource node
   188   g_free(p_res->name);
   199   g_free(p_res->name);
   189   g_free(p_res->status_msg);
   200   g_free(p_res->status_msg);
   190   g_free(p_res->realjid);
   201   g_free(p_res->realjid);
   191   rost->resource = g_slist_delete_link(rost->resource, p_res_elt);
   202   rost->resource = g_slist_delete_link(rost->resource, p_res_elt);
   362   // Let's free memory (jid, name, status message)
   373   // Let's free memory (jid, name, status message)
   363   g_free((gchar*)roster_usr->jid);
   374   g_free((gchar*)roster_usr->jid);
   364   g_free((gchar*)roster_usr->name);
   375   g_free((gchar*)roster_usr->name);
   365   g_free((gchar*)roster_usr->nickname);
   376   g_free((gchar*)roster_usr->nickname);
   366   g_free((gchar*)roster_usr->topic);
   377   g_free((gchar*)roster_usr->topic);
       
   378   g_free((gchar*)roster_usr->offline_status_message);
   367   free_all_resources(&roster_usr->resource);
   379   free_all_resources(&roster_usr->resource);
   368   g_free(roster_usr);
   380   g_free(roster_usr);
   369 
   381 
   370   // That's a little complex, we need to dereference twice
   382   // That's a little complex, we need to dereference twice
   371   sl_group = ((roster*)sl_user->data)->list;
   383   sl_group = ((roster*)sl_user->data)->list;
   404       // Free name and jid
   416       // Free name and jid
   405       g_free((gchar*)roster_usr->jid);
   417       g_free((gchar*)roster_usr->jid);
   406       g_free((gchar*)roster_usr->name);
   418       g_free((gchar*)roster_usr->name);
   407       g_free((gchar*)roster_usr->nickname);
   419       g_free((gchar*)roster_usr->nickname);
   408       g_free((gchar*)roster_usr->topic);
   420       g_free((gchar*)roster_usr->topic);
       
   421       g_free((gchar*)roster_usr->offline_status_message);
   409       free_all_resources(&roster_usr->resource);
   422       free_all_resources(&roster_usr->resource);
   410       g_free(roster_usr);
   423       g_free(roster_usr);
   411       sl_usr = g_slist_next(sl_usr);
   424       sl_usr = g_slist_next(sl_usr);
   412     }
   425     }
   413     // Free group's users list
   426     // Free group's users list
   450   // If there is no resource name, we can leave now
   463   // If there is no resource name, we can leave now
   451   if (!resname) return;
   464   if (!resname) return;
   452 
   465 
   453   roster_usr = (roster*)sl_user->data;
   466   roster_usr = (roster*)sl_user->data;
   454 
   467 
   455   // If bstat is offline, we MUST delete the resource, actually
       
   456   if (bstat == offline) {
       
   457     del_resource(roster_usr, resname);
       
   458     return;
       
   459   }
       
   460 
       
   461   // New or updated resource
   468   // New or updated resource
   462   p_res = get_or_add_resource(roster_usr, resname, prio);
   469   p_res = get_or_add_resource(roster_usr, resname, prio);
   463   p_res->prio = prio;
   470   p_res->prio = prio;
   464   p_res->status = bstat;
   471   p_res->status = bstat;
   465   if (p_res->status_msg) {
   472   if (p_res->status_msg) {
   479     g_free((gchar*)p_res->realjid);
   486     g_free((gchar*)p_res->realjid);
   480     p_res->realjid = NULL;
   487     p_res->realjid = NULL;
   481   }
   488   }
   482   if (realjid)
   489   if (realjid)
   483     p_res->realjid = g_strdup(realjid);
   490     p_res->realjid = g_strdup(realjid);
       
   491 
       
   492   // If bstat is offline, we MUST delete the resource, actually
       
   493   if (bstat == offline) {
       
   494     del_resource(roster_usr, resname);
       
   495     return;
       
   496   }
   484 }
   497 }
   485 
   498 
   486 //  roster_setflags()
   499 //  roster_setflags()
   487 // Set one or several flags to value (TRUE/FALSE)
   500 // Set one or several flags to value (TRUE/FALSE)
   488 void roster_setflags(const char *jid, guint flags, guint value)
   501 void roster_setflags(const char *jid, guint flags, guint value)
   613 
   626 
   614   roster_usr = (roster*)sl_user->data;
   627   roster_usr = (roster*)sl_user->data;
   615   p_res = get_resource(roster_usr, resname);
   628   p_res = get_resource(roster_usr, resname);
   616   if (p_res)
   629   if (p_res)
   617     return p_res->status_msg;
   630     return p_res->status_msg;
   618   return NULL;
   631   return roster_usr->offline_status_message;
   619 }
   632 }
   620 
   633 
   621 guint roster_gettype(const char *jid)
   634 guint roster_gettype(const char *jid)
   622 {
   635 {
   623   GSList *sl_user;
   636   GSList *sl_user;
   971 {
   984 {
   972   roster *roster_usr = rosterdata;
   985   roster *roster_usr = rosterdata;
   973   res *p_res = get_resource(roster_usr, resname);
   986   res *p_res = get_resource(roster_usr, resname);
   974   if (p_res)
   987   if (p_res)
   975     return p_res->status_msg;
   988     return p_res->status_msg;
   976   return NULL;
   989   return roster_usr->offline_status_message;
   977 }
   990 }
   978 
   991 
   979 time_t buddy_getstatustime(gpointer rosterdata, const char *resname)
   992 time_t buddy_getstatustime(gpointer rosterdata, const char *resname)
   980 {
   993 {
   981   roster *roster_usr = rosterdata;
   994   roster *roster_usr = rosterdata;