libpurple/protocols/gg/chat.c

changeset 34352
16ee13f507a0
parent 34350
89441dbabc83
child 34353
300c246402ac
--- a/libpurple/protocols/gg/chat.c	Tue Sep 11 12:58:04 2012 +0200
+++ b/libpurple/protocols/gg/chat.c	Tue Sep 11 15:17:44 2012 +0200
@@ -32,7 +32,7 @@
 	gboolean new_arrival);
 static void ggp_chat_left(ggp_chat_local_info *chat, uin_t uin);
 static const gchar * ggp_chat_get_name_from_id(uint64_t id);
-/*static uint64_t ggp_chat_get_id_from_name(const gchar * name);*/
+static uint64_t ggp_chat_get_id_from_name(const gchar * name);
 
 static inline ggp_chat_session_data *
 ggp_chat_get_sdata(PurpleConnection *gc)
@@ -87,7 +87,7 @@
 		return chat;
 	}
 
-	chat->conv = serv_got_joined_chat(gc, local_id,
+	chat->conv = serv_got_joined_chat(gc, chat->local_id,
 		ggp_chat_get_name_from_id(id));
 	if (chat->previously_joined)
 	{
@@ -217,6 +217,18 @@
 	return m;
 }
 
+GHashTable * ggp_chat_info_defaults(PurpleConnection *gc, const char *chat_name)
+{
+	GHashTable *defaults;
+
+	defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
+
+	if (chat_name != NULL && ggp_chat_get_id_from_name(chat_name) != 0)
+		g_hash_table_insert(defaults, "id", g_strdup(chat_name));
+
+	return defaults;
+}
+
 char * ggp_chat_get_name(GHashTable *components)
 {
 	return g_strdup((gchar*)g_hash_table_lookup(components, "id"));
@@ -229,7 +241,6 @@
 	return buff;
 }
 
-# if 0
 static uint64_t ggp_chat_get_id_from_name(const gchar * name)
 {
 	uint64_t id;
@@ -245,7 +256,6 @@
 
 	return id;
 }
-#endif
 
 void ggp_chat_join(PurpleConnection *gc, GHashTable *components)
 {
@@ -255,12 +265,14 @@
 	id = g_hash_table_lookup(components, "id");
 	if (id == NULL || id[0] != '\0')
 	{
+		purple_debug_error("gg", "ggp_chat_join; cannot join\n");
 		purple_serv_got_join_chat_failed(gc, components);
 		return;
 	}
 
 	if (gg_chat_create(info->session) < 0)
 	{
+		purple_debug_error("gg", "ggp_chat_join; cannot create\n");
 		purple_serv_got_join_chat_failed(gc, components);
 		return;
 	}
@@ -363,3 +375,63 @@
 			PURPLE_MESSAGE_RECV, message, time);
 	}
 }
+
+static gboolean ggp_chat_roomlist_get_list_finish(gpointer roomlist)
+{
+	purple_roomlist_set_in_progress((PurpleRoomlist*)roomlist, FALSE);
+	return FALSE;
+}
+
+PurpleRoomlist * ggp_chat_roomlist_get_list(PurpleConnection *gc)
+{
+	ggp_chat_session_data *sdata = ggp_chat_get_sdata(gc);
+	PurpleRoomlist *roomlist;
+	GList *fields = NULL;
+	int i;
+
+	purple_debug_info("gg", "ggp_chat_roomlist_get_list\n");
+
+	roomlist = purple_roomlist_new(purple_connection_get_account(gc));
+
+	fields = g_list_append(fields, purple_roomlist_field_new(
+		PURPLE_ROOMLIST_FIELD_STRING, _("Conference identifier"), "id",
+		TRUE));
+
+	fields = g_list_append(fields, purple_roomlist_field_new(
+		PURPLE_ROOMLIST_FIELD_STRING, _("Start Date"), "date",
+		FALSE));
+
+	fields = g_list_append(fields, purple_roomlist_field_new(
+		PURPLE_ROOMLIST_FIELD_INT, _("User Count"), "users",
+		FALSE));
+
+	fields = g_list_append(fields, purple_roomlist_field_new(
+		PURPLE_ROOMLIST_FIELD_STRING, _("Status"), "status",
+		FALSE));
+
+	purple_roomlist_set_fields(roomlist, fields);
+
+	for (i = sdata->chats_count - 1; i >= 0 ; i--)
+	{
+		PurpleRoomlistRoom *room;
+		ggp_chat_local_info *chat = &sdata->chats[i];
+		const gchar *name;
+		time_t date;
+		
+		date = (uint32_t)(chat->id >> 32);
+		
+		name = ggp_chat_get_name_from_id(chat->id);
+		room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM,
+			name, NULL);
+		purple_roomlist_room_add_field(roomlist, room, name);
+		purple_roomlist_room_add_field(roomlist, room, purple_date_format_full(localtime(&date)));
+		purple_roomlist_room_add_field(roomlist, room, GINT_TO_POINTER(123));
+		purple_roomlist_room_add_field(roomlist, room, _("Unknown"));
+		purple_roomlist_room_add(roomlist, room);
+	}
+
+	//TODO
+	//purple_roomlist_set_in_progress(roomlist, FALSE);
+	purple_timeout_add(1, ggp_chat_roomlist_get_list_finish, roomlist);
+	return roomlist;
+}

mercurial