/info can show multiple resources
Add buddy_getresources() and teach /info about multiple resources.
--- a/mcabber/src/commands.c Mon Sep 19 23:32:42 2005 +0200
+++ b/mcabber/src/commands.c Tue Sep 20 21:27:21 2005 +0200
@@ -616,9 +616,8 @@
static void do_info(char *arg)
{
gpointer bud;
- const char *jid, *name, *st_msg;
+ const char *jid, *name;
guint type;
- enum imstatus status;
char *buffer;
if (!current_buddy) return;
@@ -627,12 +626,11 @@
jid = buddy_getjid(bud);
name = buddy_getname(bud);
type = buddy_gettype(bud);
- status = buddy_getstatus(bud, NULL);
- st_msg = buddy_getstatusmsg(bud, NULL);
buffer = g_new(char, 128);
if (jid) {
+ GSList *resources;
char *typestr = "unknown";
snprintf(buffer, 127, "jid: <%s>", jid);
@@ -641,20 +639,34 @@
snprintf(buffer, 127, "Name: %s", name);
scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO);
}
- if (st_msg) {
- snprintf(buffer, 127, "Status message: %s", st_msg);
- scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO);
- }
- if (type == ROSTER_TYPE_USER) typestr = "user";
+ if (type == ROSTER_TYPE_USER) typestr = "user";
else if (type == ROSTER_TYPE_AGENT) typestr = "agent";
-
snprintf(buffer, 127, "Type: %s", typestr);
scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO);
+
+ resources = buddy_getresources(bud);
+ for ( ; resources ; resources = g_slist_next(resources) ) {
+ gchar rprio;
+ enum imstatus rstatus;
+ const char *rst_msg;
+
+ rprio = buddy_getresourceprio(bud, resources->data);
+ rstatus = buddy_getstatus(bud, resources->data);
+ rst_msg = buddy_getstatusmsg(bud, resources->data);
+
+ snprintf(buffer, 127, "Resource: [%c] (%d) %s", imstatus2char[rstatus],
+ rprio, (char*)resources->data);
+ scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO);
+ if (rst_msg) {
+ snprintf(buffer, 127, "Status message: %s", rst_msg);
+ scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO);
+ }
+ }
} else {
if (name) scr_LogPrint(LPRINT_NORMAL, "Name: %s", name);
scr_LogPrint(LPRINT_NORMAL, "Type: %s",
- ((type == ROSTER_TYPE_GROUP) ? "group" : "unknown"));
+ ((type == ROSTER_TYPE_GROUP) ? "group" : "unknown"));
}
g_free(buffer);
--- a/mcabber/src/roster.c Mon Sep 19 23:32:42 2005 +0200
+++ b/mcabber/src/roster.c Tue Sep 20 21:27:21 2005 +0200
@@ -790,6 +790,29 @@
return NULL;
}
+gchar buddy_getresourceprio(gpointer rosterdata, const char *resname)
+{
+ roster *roster_usr = rosterdata;
+ res *p_res = get_resource(roster_usr, resname);
+ if (p_res)
+ return p_res->prio;
+ return 0;
+}
+
+// buddy_getresources(roster_data)
+// Return a singly-linked-list of resource names
+// Note: the caller should free the list (and data) after use
+GSList *buddy_getresources(gpointer rosterdata)
+{
+ roster *roster_usr = rosterdata;
+ GSList *reslist = NULL, *lp;
+
+ for (lp = roster_usr->resource; lp; lp = g_slist_next(lp))
+ reslist = g_slist_append(reslist, g_strdup(((res*)lp->data)->name));
+
+ return reslist;
+}
+
// buddy_setflags()
// Set one or several flags to value (TRUE/FALSE)
void buddy_setflags(gpointer rosterdata, guint flags, guint value)
--- a/mcabber/src/roster.h Mon Sep 19 23:32:42 2005 +0200
+++ b/mcabber/src/roster.h Tue Sep 20 21:27:21 2005 +0200
@@ -74,6 +74,8 @@
gpointer buddy_getgroup(gpointer rosterdata);
enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname);
const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname);
+gchar buddy_getresourceprio(gpointer rosterdata, const char *resname);
+GSList *buddy_getresources(gpointer rosterdata);
void buddy_setflags(gpointer rosterdata, guint flags, guint value);
guint buddy_getflags(gpointer rosterdata);
GList *buddy_search(char *string);