diff mcabber/src/jabglue.c @ 1022:4c8d7b558e83

Annotations listing (/roster note in the status buffer)
author Mikael Berthe <mikael@lilotux.net>
date Sat, 18 Nov 2006 10:44:58 +0100
parents 9d5f6e0ea7b3
children 94d9a3cbb211
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Wed Nov 15 22:47:35 2006 +0100
+++ b/mcabber/src/jabglue.c	Sat Nov 18 10:44:58 2006 +0100
@@ -1238,6 +1238,53 @@
                  "Warning: you're not connected to the server.");
 }
 
+static struct annotation *parse_storage_rosternote(xmlnode notenode)
+{
+  const char *p;
+  struct annotation *note = g_new0(struct annotation, 1);
+  p = xmlnode_get_attrib(notenode, "cdate");
+  if (p)
+    note->cdate = from_iso8601(p, 1);
+  p = xmlnode_get_attrib(notenode, "mdate");
+  if (p)
+    note->mdate = from_iso8601(p, 1);
+  note->text = g_strdup(xmlnode_get_data(notenode));
+  note->jid = g_strdup(xmlnode_get_attrib(notenode, "jid"));
+  return note;
+}
+
+//  jb_get_all_storage_rosternotes()
+// Return a GSList with all storage annotations.
+// The caller should g_free the list and its contents.
+GSList *jb_get_all_storage_rosternotes(void)
+{
+  xmlnode x;
+  GSList *sl_notes = NULL;
+
+  // If we have no rosternotes, probably the server doesn't support them.
+  if (!rosternotes)
+    return NULL;
+
+  // Walk through the storage rosternotes tags
+  x = xmlnode_get_firstchild(rosternotes);
+  for ( ; x; x = xmlnode_get_nextsibling(x)) {
+    const char *p;
+    struct annotation *note;
+    p = xmlnode_get_name(x);
+
+    // We want a note item
+    if (!p || strcmp(p, "note"))
+      continue;
+    // Just in case, check the jid...
+    if (!xmlnode_get_attrib(x, "jid"))
+      continue;
+    // Ok, let's add the note to our list
+    note = parse_storage_rosternote(x);
+    sl_notes = g_slist_append(sl_notes, note);
+  }
+  return sl_notes;
+}
+
 //  jb_get_storage_rosternotes(barejid)
 // Return the annotation associated with this jid.
 // The caller should g_free the string and structure after use.
@@ -1255,30 +1302,19 @@
     return NULL;
   }
 
-  // Walk through the storage tags
+  // Walk through the storage rosternotes tags
   x = xmlnode_get_firstchild(rosternotes);
   for ( ; x; x = xmlnode_get_nextsibling(x)) {
     const char *jid;
     const char *p;
     p = xmlnode_get_name(x);
-    // If the current node is a conference item, see if we have to replace it.
-    if (p && !strcmp(p, "note")) {
-      jid = xmlnode_get_attrib(x, "jid");
-      if (!jid)
-        continue;
-      if (!strcmp(jid, barejid)) {
-        // We've found a note for this contact.
-        struct annotation *note = g_new0(struct annotation, 1);
-        p = xmlnode_get_attrib(x, "cdate");
-        if (p)
-          note->cdate = from_iso8601(p, 1);
-        p = xmlnode_get_attrib(x, "mdate");
-        if (p)
-          note->mdate = from_iso8601(p, 1);
-        note->text = g_strdup(xmlnode_get_data(x));
-        return note;
-      }
-    }
+    // We want a note item
+    if (!p || strcmp(p, "note"))
+      continue;
+    // Just in case, check the jid...
+    jid = xmlnode_get_attrib(x, "jid");
+    if (jid && !strcmp(jid, barejid))  // We've found a note for this contact.
+      return parse_storage_rosternote(x);
   }
   return NULL;  // No note found
 }