--- a/libpurple/purpleconversation.c Sun Nov 10 04:09:47 2024 -0600 +++ b/libpurple/purpleconversation.c Wed Nov 13 14:26:11 2024 -0600 @@ -72,6 +72,8 @@ gboolean logging; gboolean drafting; + + GError *error; }; enum { @@ -104,6 +106,7 @@ PROP_TYPING_STATE, PROP_LOGGING, PROP_DRAFTING, + PROP_ERROR, N_PROPERTIES, }; static GParamSpec *properties[N_PROPERTIES] = {NULL, }; @@ -577,6 +580,9 @@ purple_conversation_set_drafting(conversation, g_value_get_boolean(value)); break; + case PROP_ERROR: + purple_conversation_set_error(conversation, g_value_get_boxed(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); break; @@ -696,6 +702,9 @@ g_value_set_boolean(value, purple_conversation_get_drafting(conversation)); break; + case PROP_ERROR: + g_value_set_boxed(value, purple_conversation_get_error(conversation)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); break; @@ -776,6 +785,8 @@ g_clear_handle_id(&conversation->typing_state_source, g_source_remove); g_clear_pointer(&conversation->last_typing, g_date_time_unref); + g_clear_error(&conversation->error); + G_OBJECT_CLASS(purple_conversation_parent_class)->finalize(object); } @@ -1239,6 +1250,19 @@ FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** + * PurpleConversation:error: + * + * An error that was encountered in this conversation. For example, this could + * be a channel connection error or a kick message. + * + * Since: 3.0 + */ + properties[PROP_ERROR] = g_param_spec_boxed( + "error", NULL, NULL, + G_TYPE_ERROR, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); /** @@ -2067,3 +2091,24 @@ properties[PROP_DRAFTING]); } } + +GError * +purple_conversation_get_error(PurpleConversation *conversation) { + g_return_val_if_fail(PURPLE_IS_CONVERSATION(conversation), NULL); + + return conversation->error; +} + +void +purple_conversation_set_error(PurpleConversation *conversation, + GError *error) +{ + g_return_if_fail(PURPLE_IS_CONVERSATION(conversation)); + + g_clear_error(&conversation->error); + if(error != NULL) { + conversation->error = g_error_copy(error); + } + + g_object_notify_by_pspec(G_OBJECT(conversation), properties[PROP_ERROR]); +}