libgaim/protocols/qq/group.c

changeset 14254
77edc7a6191a
parent 14253
b63ebf84c42b
child 14466
4fcd9fdc8060
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgaim/protocols/qq/group.c	Sat Aug 19 01:50:10 2006 +0000
@@ -0,0 +1,167 @@
+/**
+* The QQ2003C protocol plugin
+ *
+ * for gaim
+ *
+ * Copyright (C) 2004 Puzzlebird
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "internal.h"
+
+#include "debug.h"
+#include "prpl.h"
+#include "request.h"
+
+#include "group_hash.h"
+#include "group_info.h"
+#include "group_search.h"
+#include "utils.h"
+
+#include "group.h"
+
+static void _qq_group_search_callback(GaimConnection *gc, const gchar *input)
+{
+	guint32 external_group_id;
+
+	g_return_if_fail(gc != NULL && input != NULL);
+	external_group_id = qq_string_to_dec_value(input);
+	/* 0x00000000 means search for demo group */
+	qq_send_cmd_group_search_group(gc, external_group_id);
+}
+
+/* This is needed for GaimChat node to be valid */
+GList *qq_chat_info(GaimConnection *gc)
+{
+	GList *m;
+	struct proto_chat_entry *pce;
+
+	m = NULL;
+
+	pce = g_new0(struct proto_chat_entry, 1);
+	pce->label = _("ID: ");
+	pce->identifier = QQ_GROUP_KEY_EXTERNAL_ID;
+	m = g_list_append(m, pce);
+
+	pce = g_new0(struct proto_chat_entry, 1);
+	pce->label = _("Admin: ");
+	pce->identifier = QQ_GROUP_KEY_CREATOR_UID;
+	m = g_list_append(m, pce);
+
+	pce = g_new0(struct proto_chat_entry, 1);
+	pce->label = _("Status: ");
+	pce->identifier = QQ_GROUP_KEY_MEMBER_STATUS_DESC;
+	m = g_list_append(m, pce);
+
+	return m;
+}
+
+/*  get a list of qq groups */
+GaimRoomlist *qq_roomlist_get_list(GaimConnection *gc)
+{
+	GList *fields;
+	qq_data *qd;
+	GaimRoomlist *rl;
+	GaimRoomlistField *f;
+
+	g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL);
+	qd = (qq_data *) gc->proto_data;
+
+	fields = NULL;
+	rl = gaim_roomlist_new(gaim_connection_get_account(gc));
+	qd->roomlist = rl;
+
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, _("Group ID"), QQ_GROUP_KEY_EXTERNAL_ID, FALSE);
+	fields = g_list_append(fields, f);
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, _("Creator"), QQ_GROUP_KEY_CREATOR_UID, FALSE);
+	fields = g_list_append(fields, f);
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING,
+				    _("Group Description"), QQ_GROUP_KEY_GROUP_DESC_UTF8, FALSE);
+	fields = g_list_append(fields, f);
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_INTERNAL_ID, TRUE);
+	fields = g_list_append(fields, f);
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_GROUP_TYPE, TRUE);
+	fields = g_list_append(fields, f);
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, _("Auth"), QQ_GROUP_KEY_AUTH_TYPE, TRUE);
+	fields = g_list_append(fields, f);
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_GROUP_CATEGORY, TRUE);
+	fields = g_list_append(fields, f);
+	f = gaim_roomlist_field_new(GAIM_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_GROUP_NAME_UTF8, TRUE);
+
+	fields = g_list_append(fields, f);
+	gaim_roomlist_set_fields(rl, fields);
+	gaim_roomlist_set_in_progress(qd->roomlist, TRUE);
+
+	gaim_request_input(gc, _("QQ Qun"),
+			   _("Please input external group ID"),
+			   _("You can only search for permanent QQ group\nInput 0 or leave it blank to search for demo groups"),
+			   NULL, FALSE, FALSE, NULL, _("Search"),
+			   G_CALLBACK(_qq_group_search_callback), _("Cancel"), NULL, gc);
+
+	return qd->roomlist;
+}
+
+/* free roomlist space, I have no idea when this one is called ... */
+void qq_roomlist_cancel(GaimRoomlist *list)
+{
+	qq_data *qd;
+	GaimConnection *gc;
+
+	g_return_if_fail(list != NULL);
+	gc = gaim_account_get_connection(list->account);
+
+	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
+	qd = (qq_data *) gc->proto_data;
+
+	gaim_roomlist_set_in_progress(list, FALSE);
+	gaim_roomlist_unref(list);
+}
+
+/* this should be called upon signin, even when we did not open group chat window */
+void qq_group_init(GaimConnection *gc)
+{
+	gint i;
+	GaimAccount *account;
+	GaimChat *chat;
+	GaimGroup *gaim_group;
+	GaimBlistNode *node;
+	qq_group *group;
+
+	g_return_if_fail(gc != NULL);
+	account = gaim_connection_get_account(gc);
+
+
+	gaim_group = gaim_find_group(GAIM_GROUP_QQ_QUN);
+	if (gaim_group == NULL) {
+		gaim_debug(GAIM_DEBUG_INFO, "QQ", "We have no QQ Qun\n");
+		return;
+	}
+
+	i = 0;
+	for (node = ((GaimBlistNode *) gaim_group)->child; node != NULL; node = node->next)
+		if (GAIM_BLIST_NODE_IS_CHAT(node)) {	/* got one */
+			chat = (GaimChat *) node;
+			if (account != chat->account)
+				continue;	/* very important here ! */
+			group = qq_group_from_hashtable(gc, chat->components);
+			if (group != NULL) {
+				i++;
+				qq_send_cmd_group_get_group_info(gc, group);	/* get group info and members */
+			}
+		}
+
+	gaim_debug(GAIM_DEBUG_INFO, "QQ", "Load %d QQ Qun configurations\n", i);
+}

mercurial