--- a/libpurple/protocols/silc/silc.c Fri Jul 29 02:58:56 2022 -0500
+++ b/libpurple/protocols/silc/silc.c Fri Jul 29 03:58:22 2022 -0500
@@ -941,12 +941,17 @@
-silcpurple_attrs(PurpleProtocolAction *action)
+silcpurple_attrs(G_GNUC_UNUSED GSimpleAction *action, + G_GNUC_UNUSED gpointer data) - PurpleConnection *gc = action->connection;
- SilcPurple sg = purple_connection_get_protocol_data(gc);
- SilcClient client = sg->client;
- SilcClientConnection conn = sg->conn;
+ const gchar *account_id = NULL; + PurpleAccountManager *manager = NULL; + PurpleAccount *account = NULL; + PurpleConnection *gc = NULL; + SilcClient client = NULL; + SilcClientConnection conn = NULL; PurpleRequestFields *fields;
PurpleRequestFieldGroup *g;
@@ -963,10 +968,23 @@
char status[1024], tz[16];
+ if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) { + g_critical("SILC attrs action parameter is of incorrect type %s", + g_variant_get_type_string(parameter)); + account_id = g_variant_get_string(parameter, NULL); + manager = purple_account_manager_get_default(); + account = purple_account_manager_find_by_id(manager, account_id); + gc = purple_account_get_connection(account); sg = purple_connection_get_protocol_data(gc);
memset(status, 0, sizeof(status));
attrs = silc_client_attributes_get(client, conn);
@@ -1100,16 +1118,33 @@
-silcpurple_detach(PurpleProtocolAction *action)
+silcpurple_detach(G_GNUC_UNUSED GSimpleAction *action, + G_GNUC_UNUSED gpointer data) - PurpleConnection *gc = action->connection;
+ const gchar *account_id = NULL; + PurpleAccountManager *manager = NULL; + PurpleAccount *account = NULL; + PurpleConnection *connection = NULL; + if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) { + g_critical("SILC detach action parameter is of incorrect type %s", + g_variant_get_type_string(parameter)); + account_id = g_variant_get_string(parameter, NULL); + manager = purple_account_manager_get_default(); + account = purple_account_manager_find_by_id(manager, account_id); + connection = purple_account_get_connection(account); - sg = purple_connection_get_protocol_data(gc);
+ sg = purple_connection_get_protocol_data(connection); silc_client_command_call(sg->client, sg->conn, "DETACH");
@@ -1117,28 +1152,45 @@
-silcpurple_view_motd(PurpleProtocolAction *action)
+silcpurple_view_motd(G_GNUC_UNUSED GSimpleAction *action, + G_GNUC_UNUSED gpointer data) - PurpleConnection *gc = action->connection;
+ const gchar *account_id = NULL; + PurpleAccountManager *manager = NULL; + PurpleAccount *account = NULL; + PurpleConnection *connection = NULL;
+ if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) { + g_critical("SILC view MOTD action parameter is of incorrect type %s", + g_variant_get_type_string(parameter)); + account_id = g_variant_get_string(parameter, NULL); + manager = purple_account_manager_get_default(); + account = purple_account_manager_find_by_id(manager, account_id); + connection = purple_account_get_connection(account); - sg = purple_connection_get_protocol_data(gc);
+ sg = purple_connection_get_protocol_data(connection); - purple_notify_error(gc, _("Message of the Day"), _("No Message "
+ purple_notify_error(connection, _("Message of the Day"), _("No Message " "of the Day available"), _("There is no Message of the "
"Day associated with this connection"),
- purple_request_cpar_from_connection(gc));
+ purple_request_cpar_from_connection(connection)); tmp = g_markup_escape_text(sg->motd, -1);
- purple_notify_formatted(gc, NULL, _("Message of the Day"), NULL,
+ purple_notify_formatted(connection, NULL, _("Message of the Day"), NULL, @@ -1243,10 +1295,14 @@
-silcpurple_create_keypair(PurpleProtocolAction *action)
+silcpurple_create_keypair(G_GNUC_UNUSED GSimpleAction *action, + G_GNUC_UNUSED gpointer data) - PurpleConnection *gc = action->connection;
- SilcPurple sg = purple_connection_get_protocol_data(gc);
+ const gchar *account_id = NULL; + PurpleAccountManager *manager = NULL; + PurpleAccount *account = NULL; + PurpleConnection *connection = NULL; PurpleRequestFields *fields;
PurpleRequestFieldGroup *g;
@@ -1254,19 +1310,29 @@
char tmp[256], pkd[256], pkd2[256], prd[256], prd2[256];
- username = purple_account_get_username(sg->account);
+ if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) { + g_critical("SILC create keypair action parameter is of incorrect type %s", + g_variant_get_type_string(parameter)); + account_id = g_variant_get_string(parameter, NULL); + manager = purple_account_manager_get_default(); + account = purple_account_manager_find_by_id(manager, account_id); + connection = purple_account_get_connection(account); + username = purple_account_get_username(account); u = g_strsplit(username, "@", 2);
- realname = purple_account_get_user_info(sg->account);
+ realname = purple_account_get_user_info(account); hostname = silc_net_localhost();
g_snprintf(tmp, sizeof(tmp), "%s@%s", username, hostname);
g_snprintf(pkd2, sizeof(pkd2), "%s" G_DIR_SEPARATOR_S"public_key.pub", silcpurple_silcdir());
g_snprintf(prd2, sizeof(prd2), "%s" G_DIR_SEPARATOR_S"private_key.prv", silcpurple_silcdir());
g_snprintf(pkd, sizeof(pkd) - 1, "%s",
- purple_account_get_string(purple_connection_get_account(gc), "public-key", pkd2));
+ purple_account_get_string(account, "public-key", pkd2)); g_snprintf(prd, sizeof(prd) - 1, "%s",
- purple_account_get_string(purple_connection_get_account(gc), "private-key", prd2));
+ purple_account_get_string(account, "private-key", prd2)); fields = purple_request_fields_new();
@@ -1303,21 +1369,35 @@
purple_request_field_group_add_field(g, f);
purple_request_fields_add_group(fields, g);
- purple_request_fields(gc, _("Create New SILC Key Pair"),
+ purple_request_fields(connection, _("Create New SILC Key Pair"), _("Create New SILC Key Pair"), NULL, fields,
_("Generate Key Pair"), G_CALLBACK(silcpurple_create_keypair_cb),
_("Cancel"), G_CALLBACK(silcpurple_create_keypair_cancel),
- purple_request_cpar_from_connection(gc), gc);
+ purple_request_cpar_from_connection(connection), connection); -silcpurple_change_pass(PurpleProtocolAction *action)
+silcpurple_change_pass(G_GNUC_UNUSED GSimpleAction *action, + G_GNUC_UNUSED gpointer data) - PurpleConnection *gc = action->connection;
- purple_account_request_change_password(purple_connection_get_account(gc));
+ const gchar *account_id = NULL; + PurpleAccountManager *manager = NULL; + PurpleAccount *account = NULL; + if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) { + g_critical("SILC change password action parameter is of incorrect type %s", + g_variant_get_type_string(parameter)); + account_id = g_variant_get_string(parameter, NULL); + manager = purple_account_manager_get_default(); + account = purple_account_manager_find_by_id(manager, account_id); + purple_account_request_change_password(account); @@ -1331,10 +1411,24 @@
-silcpurple_show_set_info(PurpleProtocolAction *action)
+silcpurple_show_set_info(G_GNUC_UNUSED GSimpleAction *action, + G_GNUC_UNUSED gpointer data) - PurpleConnection *gc = action->connection;
- purple_account_request_change_user_info(purple_connection_get_account(gc));
+ const gchar *account_id = NULL; + PurpleAccountManager *manager = NULL; + PurpleAccount *account = NULL; + if(!g_variant_is_of_type(parameter, G_VARIANT_TYPE_STRING)) { + g_critical("SILC change password action parameter is of incorrect type %s", + g_variant_get_type_string(parameter)); + account_id = g_variant_get_string(parameter, NULL); + manager = purple_account_manager_get_default(); + account = purple_account_manager_find_by_id(manager, account_id); + purple_account_request_change_user_info(account); @@ -1342,37 +1436,104 @@
-silcpurple_get_actions(PurpleProtocolClient *client, PurpleConnection *gc)
+silcpurple_protocol_actions_get_prefix(PurpleProtocolActions *actions) { +silcpurple_protocol_actions_get_action_group(PurpleProtocolActions *actions, + PurpleConnection *connection)
- PurpleProtocolAction *act;
- act = purple_protocol_action_new(_("Online Status"),
- list = g_list_append(list, act);
- act = purple_protocol_action_new(_("Detach From Server"),
- list = g_list_append(list, act);
- act = purple_protocol_action_new(_("View Message of the Day"),
- list = g_list_append(list, act);
- act = purple_protocol_action_new(_("Create SILC Key Pair..."),
- silcpurple_create_keypair);
- list = g_list_append(list, act);
- act = purple_protocol_action_new(_("Change Password..."),
- silcpurple_change_pass);
- list = g_list_append(list, act);
- act = purple_protocol_action_new(_("Set User Info..."),
- silcpurple_show_set_info);
- list = g_list_append(list, act);
+ GSimpleActionGroup *group = NULL; + GActionEntry entries[] = { + .activate = silcpurple_attrs, + .activate = silcpurple_detach, + .activate = silcpurple_view_motd, + .name = "create-keypair", + .activate = silcpurple_create_keypair, + .name = "change-password", + .activate = silcpurple_change_pass, + .name = "set-user-info", + .activate = silcpurple_show_set_info, + gsize nentries = G_N_ELEMENTS(entries); + group = g_simple_action_group_new(); + g_action_map_add_action_entries(G_ACTION_MAP(group), entries, nentries, + return G_ACTION_GROUP(group); +silcpurple_protocol_actions_get_menu(PurpleProtocolActions *actions) + GMenuItem *item = NULL; + item = g_menu_item_new(_("Online Status"), "prpl-silc.attrs"); + g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s", + g_menu_append_item(menu, item); + item = g_menu_item_new(_("Detach From Server"), "prpl-silc.detach"); + g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s", + g_menu_append_item(menu, item); + item = g_menu_item_new(_("View Message of the Day"), "prpl-silc.view-motd"); + g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s", + g_menu_append_item(menu, item); + item = g_menu_item_new(_("Create SILC Key Pair..."), + "prpl-silc.create-keypair"); + g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s", + g_menu_append_item(menu, item); + item = g_menu_item_new(_("Change Password..."), + "prpl-silc.change-password"); + g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s", + g_menu_append_item(menu, item); + item = g_menu_item_new(_("Set User Info..."), "prpl-silc.set-user-info"); + g_menu_item_set_attribute(item, PURPLE_MENU_ATTRIBUTE_DYNAMIC_TARGET, "s", + g_menu_append_item(menu, item); @@ -2264,9 +2425,16 @@
+silcpurple_protocol_actions_iface_init(PurpleProtocolActionsInterface *iface) + iface->get_prefix = silcpurple_protocol_actions_get_prefix; + iface->get_action_group = silcpurple_protocol_actions_get_action_group; + iface->get_menu = silcpurple_protocol_actions_get_menu; silcpurple_protocol_client_iface_init(PurpleProtocolClientInterface *client_iface)
- client_iface->get_actions = silcpurple_get_actions;
client_iface->status_text = silcpurple_status_text;
client_iface->tooltip_text = silcpurple_tooltip_text;
client_iface->blist_node_menu = silcpurple_blist_node_menu;
@@ -2322,6 +2490,9 @@
G_DEFINE_DYNAMIC_TYPE_EXTENDED(
SilcProtocol, silcpurple_protocol, PURPLE_TYPE_PROTOCOL, 0,
+ G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ACTIONS, + silcpurple_protocol_actions_iface_init) G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
silcpurple_protocol_client_iface_init)