/pidgin/main: 08ec2e6e0174: libpurple: Add purple_connection_g_e...

Mike Ruprecht <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 08ec2e6e0174c533e88a0be0a919f45fc2e229c9
Author:	 Mike Ruprecht <[email protected]>
Date:	 2016-04-29 03:09 -0500
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/08ec2e6e0174

Description:

libpurple: Add purple_connection_g_error() to simplify handling G_IO_ERRORs

This patch adds purple_connection_g_error() to simplify handling
G_IO_ERRORs. This is especially useful for GSocketConnections and
generally with Gio. It behaves like purple_connection_error(), but
takes a GError, translating it to purple's error codes.

diffstat:

 libpurple/connection.c |  38 ++++++++++++++++++++++++++++++++++++++
 libpurple/connection.h |  21 +++++++++++++++++++++
 2 files changed, 59 insertions(+), 0 deletions(-)

diffs (79 lines):

diff --git a/libpurple/connection.c b/libpurple/connection.c
--- a/libpurple/connection.c
+++ b/libpurple/connection.c
@@ -542,6 +542,44 @@ purple_connection_ssl_error (PurpleConne
 		purple_ssl_strerror(ssl_error));
 }
 
+void
+purple_connection_g_error(PurpleConnection *pc, const GError *error,
+		const gchar *description)
+{
+	PurpleConnectionError reason;
+	gchar *tmp;
+
+	if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		/* Not a connection error. Ignore. */
+		return;
+	}
+
+	if (error->domain == G_TLS_ERROR) {
+		switch (error->code) {
+			case G_TLS_ERROR_UNAVAILABLE:
+				reason = PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT;
+			case G_TLS_ERROR_NOT_TLS:
+			case G_TLS_ERROR_HANDSHAKE:
+				reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR;
+			case G_TLS_ERROR_BAD_CERTIFICATE:
+			case G_TLS_ERROR_CERTIFICATE_REQUIRED:
+				reason = PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR;
+			case G_TLS_ERROR_EOF:
+			case G_TLS_ERROR_MISC:
+			default:
+				reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+		}
+	} else if (error->domain == G_IO_ERROR) {
+		reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+	} else {
+		reason = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+	}
+
+	tmp = g_strdup_printf(description, error->message);
+	purple_connection_error(pc, reason, tmp);
+	g_free(tmp);
+}
+
 gboolean
 purple_connection_error_is_fatal (PurpleConnectionError reason)
 {
diff --git a/libpurple/connection.h b/libpurple/connection.h
--- a/libpurple/connection.h
+++ b/libpurple/connection.h
@@ -506,6 +506,27 @@ void
 purple_connection_ssl_error (PurpleConnection *gc,
                              PurpleSslErrorType ssl_error);
 
+/*
+ * purple_connection_g_error
+ * @gc: Connection the error is associated with
+ * @error: Error information
+ * @description: Extra string which further explains the error.
+ *               Substitutes a "%s" with the GError message.
+ *
+ * Closes a connection similar to purple_connection_error(), but
+ * takes a GError which is then converted to purple error codes.
+ *
+ * This function ignores G_IO_ERROR_CANCELLED, returning without
+ * closing the connection. This can be used as a shortcut when
+ * cancelling connections, as this is commonly done when shutting
+ * down a connection. If G_IO_ERROR_CANCELLED needs to be caught,
+ * do so with g_error_matches() prior to calling this function.
+ */
+void
+purple_connection_g_error(PurpleConnection *pc,
+                          const GError *error,
+                          const gchar *description);
+
 /**
  * purple_connection_error_is_fatal:
  *

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.