diff mcabber/mcabber/roster.c @ 2013:8dc418af3e72

Allow to select to which buddy resource messages go. Closes issue #55
author Hermitifier
date Thu, 01 Mar 2012 15:10:41 +0100
parents 7837d5a3f509
children e04b6dfbb054
line wrap: on
line diff
--- a/mcabber/mcabber/roster.c	Thu Mar 01 14:46:49 2012 +0100
+++ b/mcabber/mcabber/roster.c	Thu Mar 01 15:10:41 2012 +0100
@@ -94,6 +94,7 @@
   guint type;
   enum subscr subscription;
   GSList *resource;
+  res *active_resource;
 
   /* For groupchats */
   gchar *nickname;
@@ -265,6 +266,9 @@
     p_res->status_msg = NULL;
   }
 
+  if (rost->active_resource == p_res)
+    rost->active_resource = NULL;
+
   // Free allocations and delete resource node
   free_resource_data(p_res);
   rost->resource = g_slist_delete_link(rost->resource, p_res_elt);
@@ -279,6 +283,7 @@
   if (!roster_usr)
     return;
   g_free((gchar*)roster_usr->jid);
+  //g_free((gchar*)roster_usr->active_resource);
   g_free((gchar*)roster_usr->name);
   g_free((gchar*)roster_usr->nickname);
   g_free((gchar*)roster_usr->topic);
@@ -1451,6 +1456,32 @@
   return reslist;
 }
 
+//  buddy_getactiveresource(roster_data)
+// Returns name of active (selected for chat) resource
+const char *buddy_getactiveresource(gpointer rosterdata)
+{
+  roster *roster_usr = rosterdata;
+  res *resource;
+
+  if (!roster_usr) {
+    if (!current_buddy) return NULL;
+    roster_usr = BUDDATA(current_buddy);
+  }
+  
+  resource = roster_usr->active_resource;
+  if (!resource) return NULL;
+  return resource->name;
+}
+
+void buddy_setactiveresource(gpointer rosterdata, const char *resname)
+{
+  roster *roster_usr = rosterdata;
+  res *p_res = NULL;
+  if (resname)
+    p_res = get_resource(roster_usr, resname);
+  roster_usr->active_resource = p_res;
+}
+
 /*
 //  buddy_isresource(roster_data)
 // Return true if there is at least one resource