Add Purple.Protocol.get_action_menu

Thu, 15 Aug 2024 04:11:15 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 15 Aug 2024 04:11:15 -0500
changeset 42877
566102577b66
parent 42876
b7d2f16bf2a2
child 42878
5183064bcc28

Add Purple.Protocol.get_action_menu

Testing Done:
Called in the turtles.

Bugs closed: PIDGIN-17880

Reviewed at https://reviews.imfreedom.org/r/3392/

libpurple/purpleprotocol.c file | annotate | diff | comparison | revisions
libpurple/purpleprotocol.h file | annotate | diff | comparison | revisions
libpurple/tests/test_protocol.c file | annotate | diff | comparison | revisions
--- a/libpurple/purpleprotocol.c	Thu Aug 15 02:54:10 2024 -0500
+++ b/libpurple/purpleprotocol.c	Thu Aug 15 04:11:15 2024 -0500
@@ -375,6 +375,23 @@
 /******************************************************************************
  * Public API
  *****************************************************************************/
+BirbActionMenu *
+purple_protocol_get_action_menu(PurpleProtocol *protocol,
+                                PurpleAccount *account)
+{
+	PurpleProtocolClass *klass = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_PROTOCOL(protocol), NULL);
+	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
+
+	klass = PURPLE_PROTOCOL_GET_CLASS(protocol);
+	if(klass != NULL && klass->get_action_menu != NULL) {
+		return klass->get_action_menu(protocol, account);
+	}
+
+	return NULL;
+}
+
 const gchar *
 purple_protocol_get_id(PurpleProtocol *protocol) {
 	PurpleProtocolPrivate *priv = NULL;
--- a/libpurple/purpleprotocol.h	Thu Aug 15 02:54:10 2024 -0500
+++ b/libpurple/purpleprotocol.h	Thu Aug 15 04:11:15 2024 -0500
@@ -32,6 +32,8 @@
 
 #include <gio/gio.h>
 
+#include <birb.h>
+
 #include "purpleversion.h"
 
 #define PURPLE_TYPE_PROTOCOL (purple_protocol_get_type())
@@ -146,6 +148,8 @@
 
 	PurpleConnection *(*create_connection)(PurpleProtocol *protocol, PurpleAccount *account, const char *password, GError **error);
 
+	BirbActionMenu *(*get_action_menu)(PurpleProtocol *protocol, PurpleAccount *account);
+
 	/*< private >*/
 	gpointer reserved[4];
 };
@@ -321,6 +325,20 @@
 PurpleConnection *purple_protocol_create_connection(PurpleProtocol *protocol, PurpleAccount *account, const char *password, GError **error);
 
 /**
+ * purple_protocol_get_action_menu:
+ * @protocol: The instance.
+ * @account: The account.
+ *
+ * Gets a [class@Birb.ActionMenu] for @account.
+ *
+ * Returns: (transfer full) (nullable): The new action menu or %NULL.
+ *
+ * Since: 3.0
+ */
+PURPLE_AVAILABLE_IN_3_0
+BirbActionMenu *purple_protocol_get_action_menu(PurpleProtocol *protocol, PurpleAccount *account);
+
+/**
  * purple_protocol_get_icon_name:
  * @protocol: The #PurpleProtocol instance.
  *
--- a/libpurple/tests/test_protocol.c	Thu Aug 15 02:54:10 2024 -0500
+++ b/libpurple/tests/test_protocol.c	Thu Aug 15 04:11:15 2024 -0500
@@ -18,6 +18,8 @@
 
 #include <glib.h>
 
+#include <birb.h>
+
 #include <purple.h>
 
 #define TEST_PROTOCOL_DOMAIN (g_quark_from_static_string("test-protocol"))
@@ -77,6 +79,16 @@
 	return g_task_propagate_boolean(G_TASK(result), error);
 }
 
+static BirbActionMenu *
+test_purple_protocol_get_action_menu(PurpleProtocol *protocol,
+                                     PurpleAccount *account)
+{
+	g_assert_true(PURPLE_IS_PROTOCOL(protocol));
+	g_assert_true(PURPLE_IS_ACCOUNT(account));
+
+	return birb_action_menu_new();
+}
+
 static void
 test_purple_protocol_finalize(GObject *obj) {
 	TestPurpleProtocol *protocol = TEST_PURPLE_PROTOCOL(obj);
@@ -100,6 +112,7 @@
 
 	protocol_class->can_connect_async = test_purple_protocol_can_connect_async;
 	protocol_class->can_connect_finish = test_purple_protocol_can_connect_finish;
+	protocol_class->get_action_menu = test_purple_protocol_get_action_menu;
 }
 
 static TestPurpleProtocol *
@@ -208,6 +221,28 @@
 	g_clear_object(&account);
 }
 
+static void
+test_purple_protocol_get_action_menu_valid(void) {
+	PurpleProtocol *protocol = NULL;
+	PurpleAccount *account = NULL;
+	BirbActionMenu *action_menu = NULL;
+
+	protocol = g_object_new(
+		TEST_PURPLE_TYPE_PROTOCOL,
+		"id", "test-provider",
+		"name", "Test Provider",
+		NULL);
+
+	account = purple_account_new("test", "test");
+
+	action_menu = purple_protocol_get_action_menu(protocol, account);
+	g_assert_true(BIRB_IS_ACTION_MENU(action_menu));
+	g_clear_object(&action_menu);
+
+	g_clear_object(&account);
+	g_assert_finalize_object(protocol);
+}
+
 /******************************************************************************
  * Main
  *****************************************************************************/
@@ -222,6 +257,8 @@
 	                test_purple_protocol_can_connect_false);
 	g_test_add_func("/protocol/can-connect/true",
 	                test_purple_protocol_can_connect_true);
+	g_test_add_func("/protocol/get-action-menu/valid",
+	                test_purple_protocol_get_action_menu_valid);
 
 	return g_test_run();
 }

mercurial