diff libpurple/protocols/qq/group.c @ 15373:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children 32c366eeeb99
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/qq/group.c	Sat Jan 20 02:32:10 2007 +0000
@@ -0,0 +1,176 @@
+/**
+ * @file group.c
+ *
+ * gaim
+ *
+ * Gaim is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * 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_internal.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(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);
+}
+
+static void _qq_group_search_cancel_callback(GaimConnection *gc, const gchar *input)
+{
+	qq_data *qd;
+
+	qd = (qq_data *) gc->proto_data;
+	gaim_roomlist_set_in_progress(qd->roomlist, FALSE);
+}
+
+/* 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);
+	
+	return m;
+}
+
+GHashTable *qq_chat_info_defaults(GaimConnection *gc, const gchar *chat_name)
+{
+	GHashTable *defaults;
+
+	defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
+
+	if (chat_name != NULL)
+		g_hash_table_insert(defaults, QQ_GROUP_KEY_EXTERNAL_ID, g_strdup(chat_name));
+
+	return defaults;
+}
+
+/*  get a list of qq groups */
+GaimRoomlist *qq_roomlist_get_list(GaimConnection *gc)
+{
+	GList *fields;
+	qq_data *qd;
+	GaimRoomlist *rl;
+	GaimRoomlistField *f;
+
+	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 groups\n"),
+			   NULL, FALSE, FALSE, NULL, 
+			   _("Search"), G_CALLBACK(_qq_group_search_callback), 
+			   _("Cancel"), G_CALLBACK(_qq_group_search_cancel_callback), 
+			   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);
+
+	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;
+
+	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);
+}