Пример #1
0
Файл: chat.c Проект: VoxOx/VoxOx
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;
}
Пример #2
0
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);
}
Пример #3
0
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);
}