libpurple/protocols/ircv3/purpleircv3parser.c

changeset 42333
a34601ac633c
parent 42275
7568bf87e388
child 42503
55eff782a478
--- a/libpurple/protocols/ircv3/purpleircv3parser.c	Tue Oct 03 00:02:16 2023 -0500
+++ b/libpurple/protocols/ircv3/purpleircv3parser.c	Tue Oct 03 00:05:15 2023 -0500
@@ -20,6 +20,7 @@
 
 #include "purpleircv3capabilities.h"
 #include "purpleircv3core.h"
+#include "purpleircv3message.h"
 #include "purpleircv3messagehandlers.h"
 #include "purpleircv3sasl.h"
 
@@ -193,22 +194,21 @@
 {
 	GStrvBuilder *builder = g_strv_builder_new();
 	GStrv result = NULL;
-	guint count = 0;
 
-	*n_params = 0;
-
-	count = purple_ircv3_parser_extract_params(parser, builder, middle);
-	*n_params = *n_params + count;
+	purple_ircv3_parser_extract_params(parser, builder, middle);
 
 	if(*coda != '\0') {
 		g_strv_builder_add(builder, trailing);
-		*n_params = *n_params + 1;
 	}
 
 	result = g_strv_builder_end(builder);
 
 	g_strv_builder_unref(builder);
 
+	if(result != NULL && n_params != NULL) {
+		*n_params = g_strv_length(result);
+	}
+
 	return result;
 }
 
@@ -216,16 +216,12 @@
  * Handlers
  *****************************************************************************/
 static gboolean
-purple_ircv3_fallback_handler(G_GNUC_UNUSED GHashTable *tags,
-                              G_GNUC_UNUSED const gchar *source,
-                              G_GNUC_UNUSED const gchar *command,
-                              G_GNUC_UNUSED guint n_params,
-                              G_GNUC_UNUSED GStrv params,
+purple_ircv3_fallback_handler(PurpleIRCv3Message *message,
                               GError **error,
                               G_GNUC_UNUSED gpointer data)
 {
 	g_set_error(error, PURPLE_IRCV3_DOMAIN, 0, "no handler for command %s",
-	            command);
+	            purple_ircv3_message_get_command(message));
 
 	return FALSE;
 }
@@ -296,6 +292,7 @@
 purple_ircv3_parser_parse(PurpleIRCv3Parser *parser, const gchar *buffer,
                           GError **error, gpointer data)
 {
+	PurpleIRCv3Message *message = NULL;
 	PurpleIRCv3MessageHandler handler = NULL;
 	GError *local_error = NULL;
 	GHashTable *tags = NULL;
@@ -309,7 +306,6 @@
 	gchar *trailing = NULL;
 	gboolean matches = FALSE;
 	gboolean result = FALSE;
-	guint n_params = 0;
 
 	g_return_val_if_fail(PURPLE_IRCV3_IS_PARSER(parser), FALSE);
 	g_return_val_if_fail(buffer != NULL, FALSE);
@@ -346,6 +342,8 @@
 	/* If we made it this far, we have our handler, so lets get the rest of the
 	 * parameters and call the handler.
 	 */
+	message = purple_ircv3_message_new(command);
+
 	tags_string = g_match_info_fetch_named(info, "tags");
 	tags = purple_ircv3_parser_parse_tags(parser, tags_string, &local_error);
 	g_free(tags_string);
@@ -353,32 +351,44 @@
 		g_propagate_error(error, local_error);
 
 		g_free(command);
+		g_clear_object(&message);
 		g_hash_table_destroy(tags);
 		g_match_info_unref(info);
 
 		return FALSE;
 	}
+	if(tags != NULL) {
+		purple_ircv3_message_set_tags(message, tags);
+		g_hash_table_unref(tags);
+	}
 
 	source = g_match_info_fetch_named(info, "source");
+	if(!purple_strempty(source)) {
+		purple_ircv3_message_set_source(message, source);
+	}
+	g_free(source);
+
 	middle = g_match_info_fetch_named(info, "middle");
 	coda = g_match_info_fetch_named(info, "coda");
 	trailing = g_match_info_fetch_named(info, "trailing");
-
 	params = purple_ircv3_parser_build_params(parser, middle, coda, trailing,
-	                                          &n_params);
+	                                          NULL);
+	if(params != NULL) {
+		purple_ircv3_message_set_params(message, params);
+	}
 
-	/* Call the handler. */
-	result = handler(tags, source, command, n_params, params, error, data);
-
-	/* Cleanup everything. */
-	g_free(source);
 	g_free(command);
 	g_free(middle);
 	g_free(coda);
 	g_free(trailing);
 	g_strfreev(params);
-	g_hash_table_destroy(tags);
+
+	/* Call the handler. */
+	result = handler(message, error, data);
+
+	/* Cleanup the left overs. */
 	g_match_info_unref(info);
+	g_clear_object(&message);
 
 	return result;
 }

mercurial