libpurple/protocols/ircv3/purpleircv3connection.c

changeset 42542
1407a0aac0bf
parent 42530
55b30ce86f17
child 42543
6dcf672547fe
--- a/libpurple/protocols/ircv3/purpleircv3connection.c	Mon Dec 04 01:59:11 2023 -0600
+++ b/libpurple/protocols/ircv3/purpleircv3connection.c	Mon Dec 04 02:13:29 2023 -0600
@@ -27,7 +27,6 @@
 
 enum {
 	PROP_0,
-	PROP_CANCELLABLE,
 	PROP_CAPABILITIES,
 	PROP_REGISTERED,
 	N_PROPERTIES,
@@ -44,7 +43,6 @@
 
 typedef struct {
 	GSocketConnection *connection;
-	GCancellable *cancellable;
 
 	gchar *server_name;
 	gboolean registered;
@@ -155,6 +153,7 @@
 {
 	PurpleIRCv3Connection *connection = data;
 	PurpleIRCv3ConnectionPrivate *priv = NULL;
+	GCancellable *cancellable = NULL;
 	GDataInputStream *istream = G_DATA_INPUT_STREAM(source);
 	GError *error = NULL;
 	gchar *line = NULL;
@@ -195,9 +194,10 @@
 	g_free(line);
 
 	/* Call read_line_async again to continue reading lines. */
+	cancellable = purple_connection_get_cancellable(PURPLE_CONNECTION(connection));
 	g_data_input_stream_read_line_async(priv->input,
 	                                    G_PRIORITY_DEFAULT,
-	                                    priv->cancellable,
+	                                    cancellable,
 	                                    purple_ircv3_connection_read_cb,
 	                                    connection);
 }
@@ -231,6 +231,7 @@
 {
 	PurpleIRCv3Connection *connection = data;
 	PurpleIRCv3ConnectionPrivate *priv = NULL;
+	GCancellable *cancellable = NULL;
 	GError *error = NULL;
 	GInputStream *istream = NULL;
 	GOutputStream *ostream = NULL;
@@ -266,10 +267,12 @@
 	g_data_input_stream_set_newline_type(G_DATA_INPUT_STREAM(priv->input),
 	                                     G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
 
+	cancellable = purple_connection_get_cancellable(PURPLE_CONNECTION(connection));
+
 	/* Add our read callback. */
 	g_data_input_stream_read_line_async(priv->input,
 	                                    G_PRIORITY_DEFAULT,
-	                                    priv->cancellable,
+	                                    cancellable,
 	                                    purple_ircv3_connection_read_cb,
 	                                    connection);
 
@@ -309,6 +312,7 @@
 	PurpleIRCv3Connection *connection = NULL;
 	PurpleIRCv3ConnectionPrivate *priv = NULL;
 	PurpleAccount *account = NULL;
+	GCancellable *cancellable = NULL;
 	GSocketClient *client = NULL;
 	gint default_port = PURPLE_IRCV3_DEFAULT_TLS_PORT;
 	gint port = 0;
@@ -339,9 +343,11 @@
 	}
 	port = purple_account_get_int(account, "port", default_port);
 
+	cancellable = purple_connection_get_cancellable(purple_connection);
+
 	/* Finally start the async connection. */
 	g_socket_client_connect_to_host_async(client, priv->server_name,
-	                                      port, priv->cancellable,
+	                                      port, cancellable,
 	                                      purple_ircv3_connection_connected_cb,
 	                                      connection);
 
@@ -352,25 +358,23 @@
 
 static gboolean
 purple_ircv3_connection_disconnect(PurpleConnection *purple_connection,
-                                   G_GNUC_UNUSED GError **error)
+                                   GError **error)
 {
 	PurpleIRCv3Connection *connection = NULL;
 	PurpleIRCv3ConnectionPrivate *priv = NULL;
+	PurpleConnectionClass *parent_class = NULL;
 
 	g_return_val_if_fail(PURPLE_IRCV3_IS_CONNECTION(purple_connection), FALSE);
 
+	/* Chain up to our parent's disconnect to do initial clean up. */
+	parent_class = PURPLE_CONNECTION_CLASS(purple_ircv3_connection_parent_class);
+	parent_class->disconnect(purple_connection, error);
+
 	connection = PURPLE_IRCV3_CONNECTION(purple_connection);
 	priv = purple_ircv3_connection_get_instance_private(connection);
 
 	/* TODO: send QUIT command. */
 
-	/* Cancel the cancellable to tell everyone we're shutting down. */
-	if(G_IS_CANCELLABLE(priv->cancellable)) {
-		g_cancellable_cancel(priv->cancellable);
-
-		g_clear_object(&priv->cancellable);
-	}
-
 	if(G_IS_SOCKET_CONNECTION(priv->connection)) {
 		GInputStream *istream = G_INPUT_STREAM(priv->input);
 		GOutputStream *ostream = G_OUTPUT_STREAM(priv->output);
@@ -406,10 +410,6 @@
 	PurpleIRCv3Connection *connection = PURPLE_IRCV3_CONNECTION(obj);
 
 	switch(param_id) {
-		case PROP_CANCELLABLE:
-			g_value_set_object(value,
-			                   purple_ircv3_connection_get_cancellable(connection));
-			break;
 		case PROP_CAPABILITIES:
 			g_value_set_object(value,
 			                   purple_ircv3_connection_get_capabilities(connection));
@@ -431,8 +431,6 @@
 
 	priv = purple_ircv3_connection_get_instance_private(connection);
 
-	g_clear_object(&priv->cancellable);
-
 	g_clear_object(&priv->input);
 	g_clear_object(&priv->output);
 	g_clear_object(&priv->connection);
@@ -512,8 +510,6 @@
 	g_clear_pointer(&title, g_free);
 
 	/* Finally create our objects. */
-	priv->cancellable = g_cancellable_new();
-
 	priv->capabilities = purple_ircv3_capabilities_new(connection);
 	g_signal_connect_object(priv->capabilities, "done",
 	                        G_CALLBACK(purple_ircv3_connection_caps_done_cb),
@@ -542,19 +538,6 @@
 	connection_class->disconnect = purple_ircv3_connection_disconnect;
 
 	/**
-	 * PurpleIRCv3Connection:cancellable:
-	 *
-	 * The [class@Gio.Cancellable] for this connection.
-	 *
-	 * Since: 3.0.0
-	 */
-	properties[PROP_CANCELLABLE] = g_param_spec_object(
-		"cancellable", "cancellable",
-		"The cancellable for this connection",
-		G_TYPE_CANCELLABLE,
-		G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
-
-	/**
 	 * PurpleIRCv3Connection:capabilities:
 	 *
 	 * The capabilities that the server supports.
@@ -676,17 +659,6 @@
 	g_type_class_unref(hack);
 }
 
-GCancellable *
-purple_ircv3_connection_get_cancellable(PurpleIRCv3Connection *connection) {
-	PurpleIRCv3ConnectionPrivate *priv = NULL;
-
-	g_return_val_if_fail(PURPLE_IRCV3_IS_CONNECTION(connection), NULL);
-
-	priv = purple_ircv3_connection_get_instance_private(connection);
-
-	return priv->cancellable;
-}
-
 void
 purple_ircv3_connection_emit_ctcp_request(PurpleIRCv3Connection *connection,
                                           const char *command,
@@ -720,6 +692,7 @@
 {
 	PurpleIRCv3ConnectionPrivate *priv = NULL;
 	GBytes *bytes = NULL;
+	GCancellable *cancellable = NULL;
 	GString *msg = NULL;
 	va_list vargs;
 
@@ -740,9 +713,11 @@
 
 	/* Finally turn the string into bytes and send it! */
 	bytes = g_string_free_to_bytes(msg);
+
+	cancellable = purple_connection_get_cancellable(PURPLE_CONNECTION(connection));
 	purple_queued_output_stream_push_bytes_async(priv->output, bytes,
 	                                             G_PRIORITY_DEFAULT,
-	                                             priv->cancellable,
+	                                             cancellable,
 	                                             purple_ircv3_connection_write_cb,
 	                                             connection);
 

mercurial