libpurple/purpleconversation.c

changeset 42299
2dce52f93848
parent 42298
4671ff5c65d6
child 42302
54e2bf5af34a
--- a/libpurple/purpleconversation.c	Tue Aug 29 02:09:55 2023 -0500
+++ b/libpurple/purpleconversation.c	Tue Aug 29 02:11:27 2023 -0500
@@ -53,6 +53,8 @@
 	PurpleContactInfo *creator;
 	PurpleTags *tags;
 	GListStore *members;
+
+	GListStore *messages;
 } PurpleConversationPrivate;
 
 enum {
@@ -73,6 +75,7 @@
 	PROP_CREATOR,
 	PROP_TAGS,
 	PROP_MEMBERS,
+	PROP_MESSAGES,
 	N_PROPERTIES
 };
 static GParamSpec *properties[N_PROPERTIES] = { NULL, };
@@ -383,6 +386,9 @@
 		case PROP_MEMBERS:
 			g_value_set_object(value, purple_conversation_get_members(conv));
 			break;
+		case PROP_MESSAGES:
+			g_value_set_object(value, purple_conversation_get_messages(conv));
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
 			break;
@@ -397,6 +403,7 @@
 
 	priv->tags = purple_tags_new();
 	priv->members = g_list_store_new(PURPLE_TYPE_CONVERSATION_MEMBER);
+	priv->messages = g_list_store_new(PURPLE_TYPE_MESSAGE);
 }
 
 static void
@@ -484,6 +491,7 @@
 	g_clear_object(&priv->creator);
 	g_clear_object(&priv->tags);
 	g_clear_object(&priv->members);
+	g_clear_object(&priv->messages);
 
 	G_OBJECT_CLASS(purple_conversation_parent_class)->finalize(object);
 }
@@ -704,6 +712,19 @@
 		G_TYPE_LIST_MODEL,
 		G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
 
+	/**
+	 * PurpleConversation:messages:
+	 *
+	 * A [iface.Gio.ListModel] of all the messages in this conversation.
+	 *
+	 * Since: 3.0.0
+	 */
+	properties[PROP_MESSAGES] = g_param_spec_object(
+		"messages", "messages",
+		"All of the messages in this conversation's history.",
+		G_TYPE_LIST_MODEL,
+		G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
 	g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
 
 	/**
@@ -975,6 +996,7 @@
 {
 	PurpleProtocol *protocol = NULL;
 	PurpleConnection *gc = NULL;
+	PurpleConversationPrivate *priv = NULL;
 	PurpleAccount *account;
 	PurpleConversationUiOps *ops;
 	PurpleBuddy *b;
@@ -984,6 +1006,8 @@
 	g_return_if_fail(PURPLE_IS_CONVERSATION(conv));
 	g_return_if_fail(pmsg != NULL);
 
+	priv = purple_conversation_get_instance_private(conv);
+
 	ops = purple_conversation_get_ui_ops(conv);
 
 	account = purple_conversation_get_account(conv);
@@ -1022,7 +1046,7 @@
 		protocol = purple_account_get_protocol(account);
 
 		if(PURPLE_IS_IM_CONVERSATION(conv) ||
-		   !(purple_protocol_get_options(protocol) & OPT_PROTO_UNIQUE_CHATNAME))
+		   !(protocol != NULL && purple_protocol_get_options(protocol) & OPT_PROTO_UNIQUE_CHATNAME))
 		{
 			if(purple_message_get_flags(pmsg) & PURPLE_MESSAGE_SEND) {
 				PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
@@ -1060,6 +1084,8 @@
 		}
 	}
 
+	g_list_store_append(priv->messages, pmsg);
+
 	if(ops) {
 		if (PURPLE_IS_CHAT_CONVERSATION(conv) && ops->write_chat) {
 			ops->write_chat(PURPLE_CHAT_CONVERSATION(conv), pmsg);
@@ -1612,3 +1638,18 @@
 
 	return TRUE;
 }
+
+GListModel *
+purple_conversation_get_messages(PurpleConversation *conversation) {
+	PurpleConversationPrivate *priv = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_CONVERSATION(conversation), NULL);
+
+	priv = purple_conversation_get_instance_private(conversation);
+
+	if(G_IS_LIST_MODEL(priv->messages)) {
+		return G_LIST_MODEL(priv->messages);
+	}
+
+	return NULL;
+}

mercurial