static void roomlist_disco_result_cb(JabberStream *js, xmlnode *packet, gpointer data) { xmlnode *query; xmlnode *item; const char *type; if(!js->roomlist) return; if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result")) { char *err = jabber_parse_error(js,packet); gaim_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); gaim_roomlist_set_in_progress(js->roomlist, FALSE); gaim_roomlist_unref(js->roomlist); js->roomlist = NULL; g_free(err); return; } if(!(query = xmlnode_get_child(packet, "query"))) { char *err = jabber_parse_error(js, packet); gaim_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); gaim_roomlist_set_in_progress(js->roomlist, FALSE); gaim_roomlist_unref(js->roomlist); js->roomlist = NULL; g_free(err); return; } for(item = xmlnode_get_child(query, "item"); item; item = xmlnode_get_next_twin(item)) { const char *name; GaimRoomlistRoom *room; JabberID *jid; if(!(jid = jabber_id_new(xmlnode_get_attrib(item, "jid")))) continue; name = xmlnode_get_attrib(item, "name"); room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, jid->node, NULL); gaim_roomlist_room_add_field(js->roomlist, room, jid->node); gaim_roomlist_room_add_field(js->roomlist, room, jid->domain); gaim_roomlist_room_add_field(js->roomlist, room, name ? name : ""); gaim_roomlist_room_add(js->roomlist, room); jabber_id_free(jid); } gaim_roomlist_set_in_progress(js->roomlist, FALSE); gaim_roomlist_unref(js->roomlist); js->roomlist = NULL; }
void gaym_roomlist_expand_category(struct _GaimRoomlist *list, struct _GaimRoomlistRoom *category) { GaimRoomlistRoom *room = NULL; gchar *altname = NULL; gchar *altchan = NULL; int i = 0; if (category->type & GAIM_ROOMLIST_ROOMTYPE_ROOM && !category->expanded_once) { category->expanded_once = TRUE; int max = gaim_prefs_get_int("/plugins/prpl/gaym/chat_room_instances"); gchar *name = category->fields->data; gchar *chan = category->fields->next->data; for (i = 1; i <= max; i++) { altname = g_strdup_printf("%.*s%d", strlen(name) - 1, name, i); altchan = g_strdup_printf("%.*s%d", strlen(chan) - 1, chan, i); room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, altname, category); gaim_roomlist_room_add_field(list, room, altname); gaim_roomlist_room_add_field(list, room, altchan); gaim_roomlist_room_add(list, room); g_free(altname); g_free(altchan); } } gaim_roomlist_set_in_progress(list, FALSE); }
void build_roomlist_from_config(GaimRoomlist * roomlist, GHashTable * confighash, gchar * pattern) { gchar **roominst = NULL; gchar *altname = NULL; gchar *normalized = NULL; gchar *lowercase = NULL; gchar *found = NULL; int level = 0; int old_level = 0; int i = 0; GaimRoomlistRoom *room = NULL; GaimRoomlistRoom *parent = NULL; g_return_if_fail(roomlist != NULL); g_return_if_fail(confighash != NULL); int max = gaim_prefs_get_int("/plugins/prpl/gaym/chat_room_instances"); gchar *roomstr = g_hash_table_lookup(confighash, "roomlist"); g_return_if_fail(roomstr != NULL); gchar **roomarr = g_strsplit(roomstr, "|", -1); /** * We need to skip the first instance, because they start * with a "|", which we've just split by, leaving a blank * at the beginning of the list */ for (i = 1; roomarr[i] != NULL; i++) { if (roomarr[i][0] == '#') { /** * This is an actual room string, break it into its * component parts, determine the level and the parent, * and add this as both a room and a category */ if (pattern != NULL) { lowercase = g_utf8_strdown(roomarr[i], -1); normalized = g_utf8_normalize(lowercase, -1, G_NORMALIZE_ALL); found = g_strstr_len(normalized, -1, pattern); g_free(normalized); g_free(lowercase); } if (found != NULL || pattern == NULL) { found = NULL; roominst = g_strsplit(roomarr[i], " ", 2); level = roomlist_level_strip(roominst[1]); parent = find_parent(level, old_level, room); altname = g_strdup_printf("%s:*", roominst[1]); if (max == 0) { room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, altname, parent); } else { room = gaim_roomlist_room_new (GAIM_ROOMLIST_ROOMTYPE_CATEGORY | GAIM_ROOMLIST_ROOMTYPE_ROOM, altname, parent); } gaim_roomlist_room_add_field(roomlist, room, altname); gaim_roomlist_room_add_field(roomlist, room, roominst[0]); gaim_roomlist_room_add(roomlist, room); g_free(altname); g_strfreev(roominst); old_level = level; } } else if (pattern == NULL) { /** * This is a plain category, determine the level and * the parent and add it. */ level = roomlist_level_strip(roomarr[i]); parent = find_parent(level, old_level, room); room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_CATEGORY, roomarr[i], parent); gaim_roomlist_room_add(roomlist, room); } old_level = level; } g_strfreev(roomarr); gaim_roomlist_set_in_progress(roomlist, FALSE); }