Mercurial > hg
comparison 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 |
comparison
equal
deleted
inserted
replaced
1021:97f862e44d5d | 1022:4c8d7b558e83 |
---|---|
1236 else | 1236 else |
1237 scr_LogPrint(LPRINT_LOGNORM, | 1237 scr_LogPrint(LPRINT_LOGNORM, |
1238 "Warning: you're not connected to the server."); | 1238 "Warning: you're not connected to the server."); |
1239 } | 1239 } |
1240 | 1240 |
1241 static struct annotation *parse_storage_rosternote(xmlnode notenode) | |
1242 { | |
1243 const char *p; | |
1244 struct annotation *note = g_new0(struct annotation, 1); | |
1245 p = xmlnode_get_attrib(notenode, "cdate"); | |
1246 if (p) | |
1247 note->cdate = from_iso8601(p, 1); | |
1248 p = xmlnode_get_attrib(notenode, "mdate"); | |
1249 if (p) | |
1250 note->mdate = from_iso8601(p, 1); | |
1251 note->text = g_strdup(xmlnode_get_data(notenode)); | |
1252 note->jid = g_strdup(xmlnode_get_attrib(notenode, "jid")); | |
1253 return note; | |
1254 } | |
1255 | |
1256 // jb_get_all_storage_rosternotes() | |
1257 // Return a GSList with all storage annotations. | |
1258 // The caller should g_free the list and its contents. | |
1259 GSList *jb_get_all_storage_rosternotes(void) | |
1260 { | |
1261 xmlnode x; | |
1262 GSList *sl_notes = NULL; | |
1263 | |
1264 // If we have no rosternotes, probably the server doesn't support them. | |
1265 if (!rosternotes) | |
1266 return NULL; | |
1267 | |
1268 // Walk through the storage rosternotes tags | |
1269 x = xmlnode_get_firstchild(rosternotes); | |
1270 for ( ; x; x = xmlnode_get_nextsibling(x)) { | |
1271 const char *p; | |
1272 struct annotation *note; | |
1273 p = xmlnode_get_name(x); | |
1274 | |
1275 // We want a note item | |
1276 if (!p || strcmp(p, "note")) | |
1277 continue; | |
1278 // Just in case, check the jid... | |
1279 if (!xmlnode_get_attrib(x, "jid")) | |
1280 continue; | |
1281 // Ok, let's add the note to our list | |
1282 note = parse_storage_rosternote(x); | |
1283 sl_notes = g_slist_append(sl_notes, note); | |
1284 } | |
1285 return sl_notes; | |
1286 } | |
1287 | |
1241 // jb_get_storage_rosternotes(barejid) | 1288 // jb_get_storage_rosternotes(barejid) |
1242 // Return the annotation associated with this jid. | 1289 // Return the annotation associated with this jid. |
1243 // The caller should g_free the string and structure after use. | 1290 // The caller should g_free the string and structure after use. |
1244 struct annotation *jb_get_storage_rosternotes(const char *barejid) | 1291 struct annotation *jb_get_storage_rosternotes(const char *barejid) |
1245 { | 1292 { |
1253 scr_LogPrint(LPRINT_LOGNORM, | 1300 scr_LogPrint(LPRINT_LOGNORM, |
1254 "Sorry, your server doesn't seem to support private storage."); | 1301 "Sorry, your server doesn't seem to support private storage."); |
1255 return NULL; | 1302 return NULL; |
1256 } | 1303 } |
1257 | 1304 |
1258 // Walk through the storage tags | 1305 // Walk through the storage rosternotes tags |
1259 x = xmlnode_get_firstchild(rosternotes); | 1306 x = xmlnode_get_firstchild(rosternotes); |
1260 for ( ; x; x = xmlnode_get_nextsibling(x)) { | 1307 for ( ; x; x = xmlnode_get_nextsibling(x)) { |
1261 const char *jid; | 1308 const char *jid; |
1262 const char *p; | 1309 const char *p; |
1263 p = xmlnode_get_name(x); | 1310 p = xmlnode_get_name(x); |
1264 // If the current node is a conference item, see if we have to replace it. | 1311 // We want a note item |
1265 if (p && !strcmp(p, "note")) { | 1312 if (!p || strcmp(p, "note")) |
1266 jid = xmlnode_get_attrib(x, "jid"); | 1313 continue; |
1267 if (!jid) | 1314 // Just in case, check the jid... |
1268 continue; | 1315 jid = xmlnode_get_attrib(x, "jid"); |
1269 if (!strcmp(jid, barejid)) { | 1316 if (jid && !strcmp(jid, barejid)) // We've found a note for this contact. |
1270 // We've found a note for this contact. | 1317 return parse_storage_rosternote(x); |
1271 struct annotation *note = g_new0(struct annotation, 1); | |
1272 p = xmlnode_get_attrib(x, "cdate"); | |
1273 if (p) | |
1274 note->cdate = from_iso8601(p, 1); | |
1275 p = xmlnode_get_attrib(x, "mdate"); | |
1276 if (p) | |
1277 note->mdate = from_iso8601(p, 1); | |
1278 note->text = g_strdup(xmlnode_get_data(x)); | |
1279 return note; | |
1280 } | |
1281 } | |
1282 } | 1318 } |
1283 return NULL; // No note found | 1319 return NULL; // No note found |
1284 } | 1320 } |
1285 | 1321 |
1286 // jb_set_storage_rosternotes(barejid, note) | 1322 // jb_set_storage_rosternotes(barejid, note) |