pidgin/plugins/disco/xmppdisco.c

changeset 42037
af20db93f2c2
parent 41913
8bdccbde0536
child 42074
58ae70ad7f21
--- 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;
 		PurpleXmlNode *feature;
 
-		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->flags = 0;
-		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));
 
 		if (item_data->node) {
 			if (item_data->name) {
-				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);
 			} else {
-				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);
 			}
 		} else {
-			service->name = g_strdup(from);
+			xmpp_disco_service_set_name(service, from);
 		}
 
-		if (!service->node) {
+		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);
 		}
 
 		if (item_data->name) {
-			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);
 		} else if (identity) {
-			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);
 	}
 
 out:
@@ -403,7 +404,7 @@
 
 			has_items = TRUE;
 
-			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);
+				if(name != NULL) {
+					xmpp_disco_service_set_name(service, name);
+				} else {
+					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);
 			} else {
 				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)) {
 		return;
 	}
 
+	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);
+	++list->fetch_count;
+	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),
 	                    got_items_cb);
-	service->expanded = TRUE;
+	xmpp_disco_service_set_expanded(service, TRUE);
 }
 
-void xmpp_disco_service_register(XmppDiscoService *service)
+void
+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);
 	if (iq != NULL) {
 		purple_xmlnode_free(iq);
 	}
@@ -684,6 +693,7 @@
 		return FALSE;
 	}
 
+	xmpp_disco_service_register(plugin);
 	pidgin_disco_dialog_register(plugin);
 
 	purple_signal_connect(purple_connections_get_handle(), "signing-off",

mercurial