--- a/pidgin/plugins/disco/gtkdisco.c Mon Jan 23 23:27:47 2023 -0600
+++ b/pidgin/plugins/disco/gtkdisco.c Tue Jan 24 15:40:35 2023 -0600
@@ -103,26 +103,6 @@
-pidgin_disco_get_icon_name(XmppDiscoService *service)
- char *icon_name = NULL;
- g_return_val_if_fail(service != NULL, NULL);
- if (service->type == XMPP_DISCO_SERVICE_TYPE_GATEWAY && service->gateway_type) {
- icon_name = g_strconcat("im-", service->gateway_type, NULL);
- } else if (service->type == XMPP_DISCO_SERVICE_TYPE_USER) {
- icon_name = g_strdup("person");
- } else if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) {
- icon_name = g_strdup("chat");
dialog_select_account_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec,
@@ -146,9 +126,9 @@
PidginDiscoDialog *dialog = data;
XmppDiscoService *service = dialog->selected;
- g_return_if_fail(service != NULL);
+ g_return_if_fail(XMPP_DISCO_IS_SERVICE(service)); - xmpp_disco_service_register(service);
+ xmpp_disco_register_service(service); static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server)
@@ -248,15 +228,17 @@
PidginDiscoDialog *dialog = data;
XmppDiscoService *service = dialog->selected;
+ PidginDiscoList *list = NULL; - g_return_if_fail(service != NULL);
+ g_return_if_fail(XMPP_DISCO_IS_SERVICE(service)); - account = purple_connection_get_account(service->list->pc);
+ list = xmpp_disco_service_get_list(service); + account = purple_connection_get_account(list->pc); + jid = xmpp_disco_service_get_jid(service); - if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) {
+ if(xmpp_disco_service_get_service_type(service) == XMPP_DISCO_SERVICE_TYPE_CHAT) { purple_blist_request_add_chat(account, NULL, NULL, jid);
purple_blist_request_add_buddy(account, jid, NULL, NULL);
@@ -318,8 +300,9 @@
dialog->selected = g_value_get_pointer(&val);
if (dialog->selected != NULL) {
- allow_add = (dialog->selected->flags & XMPP_DISCO_ADD);
- allow_register = (dialog->selected->flags & XMPP_DISCO_REGISTER);
+ XmppDiscoServiceFlags flags = xmpp_disco_service_get_flags(dialog->selected); + allow_add = (flags & XMPP_DISCO_ADD) != 0; + allow_register = (flags & XMPP_DISCO_REGISTER) != 0; @@ -351,6 +334,7 @@
PidginDiscoDialog *dialog = user_data;
XmppDiscoService *service;
+ XmppDiscoServiceFlags flags; if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path)) {
@@ -362,15 +346,16 @@
service = g_value_get_pointer(&val);
- if (service->flags & XMPP_DISCO_BROWSE) {
+ flags = xmpp_disco_service_get_flags(service); + if((flags & XMPP_DISCO_BROWSE) != 0) { if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(dialog->tree), path)) {
gtk_tree_view_collapse_row(GTK_TREE_VIEW(dialog->tree), path);
gtk_tree_view_expand_row(GTK_TREE_VIEW(dialog->tree), path, FALSE);
- } else if (service->flags & XMPP_DISCO_REGISTER) {
+ } else if((flags & XMPP_DISCO_REGISTER) != 0) { g_action_activate(G_ACTION(dialog->register_action), NULL);
- } else if (service->flags & XMPP_DISCO_ADD) {
+ } else if((flags & XMPP_DISCO_ADD) != 0) { g_action_activate(G_ACTION(dialog->add_action), NULL);
@@ -452,7 +437,7 @@
- switch (service->type) {
+ switch(xmpp_disco_service_get_service_type(service)) { case XMPP_DISCO_SERVICE_TYPE_UNSET:
@@ -482,16 +467,17 @@
- name = g_markup_escape_text(service->name, -1);
- jid = g_markup_escape_text(service->jid, -1);
- if (service->description != NULL) {
- desc = g_markup_escape_text(service->description, -1);
+ name = g_markup_escape_text(xmpp_disco_service_get_name(service), -1); + jid = g_markup_escape_text(xmpp_disco_service_get_jid(service), -1); + if(xmpp_disco_service_get_description(service) != NULL) { + desc = g_markup_escape_text(xmpp_disco_service_get_description(service), markup = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>\n<b>%s:</b> %s%s%s",
- service->description ? _("\n<b>Description:</b> ") : "",
- service->description ? desc : "");
+ desc != NULL ? _("\n<b>Description:</b> ") : "", + desc != NULL ? desc : ""); gtk_tooltip_set_markup(tooltip, markup);
gtk_tree_view_set_tooltip_row(GTK_TREE_VIEW(widget), tooltip, path);
@@ -663,10 +649,11 @@
g_return_if_fail(dialog != NULL);
- purple_debug_info("xmppdisco", "Adding service \"%s\"", service->name);
+ purple_debug_info("xmppdisco", "Adding service \"%s\"", + xmpp_disco_service_get_name(service)); purple_debug_info("xmppdisco", "Service \"%s\" has no children",
+ xmpp_disco_service_get_name(parent)); gtk_progress_bar_pulse(GTK_PROGRESS_BAR(dialog->progress));
@@ -710,7 +697,7 @@
- if (service->flags & XMPP_DISCO_BROWSE) {
+ if((xmpp_disco_service_get_flags(service) & XMPP_DISCO_BROWSE) != 0) { @@ -724,11 +711,12 @@
gtk_tree_path_free(path);
- icon_name = pidgin_disco_get_icon_name(service);
+ icon_name = xmpp_disco_service_get_icon_name(service); gtk_tree_store_set(dialog->model, &iter, ICON_NAME_COLUMN, icon_name,
- NAME_COLUMN, service->name, DESCRIPTION_COLUMN,
- service->description, SERVICE_COLUMN, service, -1);
+ NAME_COLUMN, xmpp_disco_service_get_name(service), + DESCRIPTION_COLUMN, xmpp_disco_service_get_description(service), + SERVICE_COLUMN, service, -1); --- a/pidgin/plugins/disco/meson.build Mon Jan 23 23:27:47 2023 -0600
+++ b/pidgin/plugins/disco/meson.build Tue Jan 24 15:40:35 2023 -0600
@@ -1,17 +1,28 @@
+xmppdisco_enums = gnome.mkenums_simple('xmppdiscoenums', + sources: xmppdisco_HEADERS, + identifier_prefix: 'XmppDisco', + symbol_prefix: 'xmpp_disco') +xmppdisco_SOURCES += xmppdisco_enums xmppdisco_resource = gnome.compile_resources('xmppdiscoresources',
'resources/xmppdisco.gresource.xml',
source_dir : 'resources',
xmppdisco_SOURCES += xmppdisco_resource
-xmppdisco = library('xmppdisco', xmppdisco_SOURCES,
+xmppdisco = library('xmppdisco', xmppdisco_SOURCES, xmppdisco_HEADERS, c_args : ['-DG_LOG_USE_STRUCTURED', '-DG_LOG_DOMAIN="PidginPlugin-XMPPDisco"'],
dependencies : [libpurple_dep, libpidgin_dep, glib],
--- a/pidgin/plugins/disco/xmppdisco.c Mon Jan 23 23:27:47 2023 -0600
+++ b/pidgin/plugins/disco/xmppdisco.c Tue Jan 24 15:40:35 2023 -0600
@@ -297,48 +297,47 @@
if (purple_strequal(type, "result") &&
(query = purple_xmlnode_get_child(iq, "query"))) {
PurpleXmlNode *identity = purple_xmlnode_get_child(query, "identity");
- XmppDiscoService *service;
+ XmppDiscoService *service = NULL; - service = g_new0(XmppDiscoService, 1);
- service->list = item_data->list;
- purple_debug_info("xmppdisco", "parent for %s is %p\n", from, item_data->parent);
- service->parent = item_data->parent;
- service->type = disco_service_type_from_identity(identity);
+ service = xmpp_disco_service_new(item_data->list); + purple_debug_info("xmppdisco", "parent for %s is %p", from, item_data->parent); + xmpp_disco_service_set_service_type(service, + disco_service_type_from_identity(identity)); - service->name = item_data->name;
- item_data->name = NULL;
+ xmpp_disco_service_set_name(service, item_data->name); + g_clear_pointer(&item_data->name, g_free); - service->name = g_strdup(item_data->node);
+ xmpp_disco_service_set_name(service, item_data->node); - service->node = item_data->node;
- item_data->node = NULL;
+ xmpp_disco_service_set_node(service, item_data->node); + g_clear_pointer(&item_data->node, g_free); - if (service->type == XMPP_DISCO_SERVICE_TYPE_PUBSUB_COLLECTION) {
- service->flags |= XMPP_DISCO_BROWSE;
+ if(xmpp_disco_service_get_service_type(service) == XMPP_DISCO_SERVICE_TYPE_PUBSUB_COLLECTION) { + xmpp_disco_service_add_flags(service, XMPP_DISCO_BROWSE); - service->name = g_strdup(from);
+ xmpp_disco_service_set_name(service, from);
+ if(!xmpp_disco_service_get_node(service)) { /* Only support adding JIDs, not JID+node combos */
- service->flags |= XMPP_DISCO_ADD;
+ xmpp_disco_service_add_flags(service, XMPP_DISCO_ADD); - service->description = item_data->name;
- item_data->name = NULL;
+ xmpp_disco_service_set_description(service, item_data->name); + g_clear_pointer(&item_data->name, g_free); - service->description = g_strdup(purple_xmlnode_get_attrib(identity, "name"));
+ xmpp_disco_service_set_description(service, + purple_xmlnode_get_attrib(identity, "name")); /* TODO: Overlap with service->name a bit */
- service->jid = g_strdup(from);
+ xmpp_disco_service_set_jid(service, from); for (feature = purple_xmlnode_get_child(query, "feature"); feature;
feature = purple_xmlnode_get_next_twin(feature)) {
@@ -348,21 +347,23 @@
if (purple_strequal(var, NS_REGISTER)) {
- service->flags |= XMPP_DISCO_REGISTER;
+ xmpp_disco_service_add_flags(service, XMPP_DISCO_REGISTER); } else if (purple_strequal(var, NS_DISCO_ITEMS)) {
- service->flags |= XMPP_DISCO_BROWSE;
+ xmpp_disco_service_add_flags(service, XMPP_DISCO_BROWSE); } else if (purple_strequal(var, NS_MUC)) {
- service->flags |= XMPP_DISCO_BROWSE;
- service->type = XMPP_DISCO_SERVICE_TYPE_CHAT;
+ xmpp_disco_service_add_flags(service, XMPP_DISCO_BROWSE); + xmpp_disco_service_set_service_type(service, + XMPP_DISCO_SERVICE_TYPE_CHAT); - if (service->type == XMPP_DISCO_SERVICE_TYPE_GATEWAY) {
- service->gateway_type = g_strdup(disco_type_from_string(
+ if(xmpp_disco_service_get_service_type(service) == XMPP_DISCO_SERVICE_TYPE_GATEWAY) { + xmpp_disco_service_set_gateway_type(service, + disco_type_from_string( purple_xmlnode_get_attrib(identity, "type")));
- pidgin_disco_add_service(list, service, service->parent);
+ pidgin_disco_add_service(list, service, item_data->parent); @@ -403,7 +404,7 @@
- if (item_data->parent->type == XMPP_DISCO_SERVICE_TYPE_CHAT) {
+ if(xmpp_disco_service_get_service_type(item_data->parent) == XMPP_DISCO_SERVICE_TYPE_CHAT) { /* This is a hacky first-order approximation. Any MUC
* component that has a >1 level hierarchy (a Yahoo MUC
* transport component probably does) will violate this.
@@ -411,18 +412,18 @@
* On the other hand, this is better than querying all the
* chats at conference.jabber.org to enumerate them.
- XmppDiscoService *service = g_new0(XmppDiscoService, 1);
- service->list = item_data->list;
- service->parent = item_data->parent;
- service->flags = XMPP_DISCO_ADD;
- service->type = XMPP_DISCO_SERVICE_TYPE_CHAT;
+ XmppDiscoService *service = xmpp_disco_service_new(item_data->list); + xmpp_disco_service_set_flags(service, XMPP_DISCO_ADD); + xmpp_disco_service_set_service_type(service, + XMPP_DISCO_SERVICE_TYPE_CHAT); - service->name = g_strdup(name);
- service->jid = g_strdup(jid);
- service->node = g_strdup(node);
- if (service->name == NULL) {
- service->name = g_strdup(jid);
+ xmpp_disco_service_set_name(service, name); + xmpp_disco_service_set_name(service, jid); + xmpp_disco_service_set_jid(service, jid); + xmpp_disco_service_set_node(service, node); pidgin_disco_add_service(list, service, item_data->parent);
struct item_data *item_data2 = g_new0(struct item_data, 1);
@@ -567,43 +568,51 @@
void xmpp_disco_service_expand(XmppDiscoService *service)
+ PidginDiscoList *list = NULL; struct item_data *item_data;
- g_return_if_fail(service != NULL);
+ g_return_if_fail(XMPP_DISCO_IS_SERVICE(service)); - if (service->expanded) {
+ if(xmpp_disco_service_get_expanded(service)) { + list = xmpp_disco_service_get_list(service); item_data = g_new0(struct item_data, 1);
- item_data->list = service->list;
+ item_data->list = list; item_data->parent = service;
- ++service->list->fetch_count;
- pidgin_disco_list_ref(service->list);
+ pidgin_disco_list_ref(list); + pidgin_disco_list_set_in_progress(list, TRUE); - pidgin_disco_list_set_in_progress(service->list, TRUE);
- xmpp_disco_items_do(service->list->pc, item_data, service->jid, service->node,
+ xmpp_disco_items_do(list->pc, item_data, + xmpp_disco_service_get_jid(service), + xmpp_disco_service_get_node(service), - service->expanded = TRUE;
+ xmpp_disco_service_set_expanded(service, TRUE); -void xmpp_disco_service_register(XmppDiscoService *service)
+xmpp_disco_register_service(XmppDiscoService *service) + PidginDiscoList *list = NULL; PurpleXmlNode *iq, *query;
char *id = generate_next_id();
iq = purple_xmlnode_new("iq");
purple_xmlnode_set_attrib(iq, "type", "get");
- purple_xmlnode_set_attrib(iq, "to", service->jid);
+ purple_xmlnode_set_attrib(iq, "to", xmpp_disco_service_get_jid(service)); purple_xmlnode_set_attrib(iq, "id", id);
query = purple_xmlnode_new_child(iq, "query");
purple_xmlnode_set_namespace(query, NS_REGISTER);
- purple_signal_emit(purple_connection_get_protocol(service->list->pc),
- "jabber-sending-xmlnode", service->list->pc, &iq);
+ list = xmpp_disco_service_get_list(service); + purple_signal_emit(purple_connection_get_protocol(list->pc), + "jabber-sending-xmlnode", list->pc, &iq); @@ -684,6 +693,7 @@
+ xmpp_disco_service_register(plugin); pidgin_disco_dialog_register(plugin);
purple_signal_connect(purple_connections_get_handle(), "signing-off",
--- a/pidgin/plugins/disco/xmppdisco.h Mon Jan 23 23:27:47 2023 -0600
+++ b/pidgin/plugins/disco/xmppdisco.h Tue Jan 24 15:40:35 2023 -0600
@@ -22,8 +22,7 @@
#ifndef PIDGIN_XMPP_DISCO_H
#define PIDGIN_XMPP_DISCO_H
-typedef struct _XmppDiscoService XmppDiscoService;
+#include "xmppdiscoservice.h" #define XMPP_PROTOCOL_ID "prpl-jabber"
@@ -38,73 +37,9 @@
extern PurplePlugin *my_plugin;
- * The types of services.
- XMPP_DISCO_SERVICE_TYPE_UNSET,
- * A registerable gateway to another protocol. An example would be
- * XMPP legacy transports.
- XMPP_DISCO_SERVICE_TYPE_GATEWAY,
- * A directory (e.g. allows the user to search for other users).
- XMPP_DISCO_SERVICE_TYPE_DIRECTORY,
- * A chat (multi-user conversation).
- XMPP_DISCO_SERVICE_TYPE_CHAT,
- * A pubsub collection (contains nodes)
- XMPP_DISCO_SERVICE_TYPE_PUBSUB_COLLECTION,
- * A pubsub leaf (contains stuff, not nodes).
- XMPP_DISCO_SERVICE_TYPE_PUBSUB_LEAF,
- * Something else. Do we need more categories?
- XMPP_DISCO_SERVICE_TYPE_OTHER
- * The flags of services.
- XMPP_DISCO_NONE = 0x0000,
- XMPP_DISCO_ADD = 0x0001, /**< Supports an 'add' operation */
- XMPP_DISCO_BROWSE = 0x0002, /**< Supports browsing */
- XMPP_DISCO_REGISTER = 0x0004 /**< Supports a 'register' operation */
-} XmppDiscoServiceFlags;
-struct _XmppDiscoService {
- XmppDiscoServiceType type;
- XmppDiscoServiceFlags flags;
- XmppDiscoService *parent;
void xmpp_disco_start(PidginDiscoList *list);
void xmpp_disco_service_expand(XmppDiscoService *service);
-void xmpp_disco_service_register(XmppDiscoService *service);
+void xmpp_disco_register_service(XmppDiscoService *service); #endif /* PIDGIN_XMPP_DISCO_H */