Merge branch 'mcatanzaro/#2393' into 'main'

gtlsconnection: use a vfunc to implement get_negotiated_protocol()

Closes #2393

See merge request GNOME/glib!2076
This commit is contained in:
Philip Withnall 2021-06-21 15:22:24 +00:00
commit 00868f4bb0
3 changed files with 26 additions and 43 deletions

View File

@ -45,8 +45,9 @@ typedef struct _GDtlsConnectionInterface GDtlsConnectionInterface;
* @shutdown: Shut down one or both directions of the connection. * @shutdown: Shut down one or both directions of the connection.
* @shutdown_async: Start an asynchronous shutdown operation. * @shutdown_async: Start an asynchronous shutdown operation.
* @shutdown_finish: Finish an asynchronous shutdown operation. * @shutdown_finish: Finish an asynchronous shutdown operation.
* @set_advertised_protocols: Set APLN protocol list * @set_advertised_protocols: Set APLN protocol list (Since: 2.60)
* @get_negotiated_protocol: Retrieve ALPN-negotiated protocol * @get_negotiated_protocol: Get ALPN-negotiated protocol (Since: 2.60)
* @get_binding_data: Retrieve TLS channel binding data (Since: 2.66)
* *
* Virtual method table for a #GDtlsConnection implementation. * Virtual method table for a #GDtlsConnection implementation.
* *

View File

@ -55,12 +55,7 @@
* Since: 2.28 * Since: 2.28
*/ */
struct _GTlsConnectionPrivate G_DEFINE_ABSTRACT_TYPE (GTlsConnection, g_tls_connection, G_TYPE_IO_STREAM)
{
gchar *negotiated_protocol;
};
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GTlsConnection, g_tls_connection, G_TYPE_IO_STREAM)
static void g_tls_connection_get_property (GObject *object, static void g_tls_connection_get_property (GObject *object,
guint prop_id, guint prop_id,
@ -70,7 +65,6 @@ static void g_tls_connection_set_property (GObject *object,
guint prop_id, guint prop_id,
const GValue *value, const GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void g_tls_connection_finalize (GObject *object);
enum { enum {
ACCEPT_CERTIFICATE, ACCEPT_CERTIFICATE,
@ -104,7 +98,6 @@ g_tls_connection_class_init (GTlsConnectionClass *klass)
gobject_class->get_property = g_tls_connection_get_property; gobject_class->get_property = g_tls_connection_get_property;
gobject_class->set_property = g_tls_connection_set_property; gobject_class->set_property = g_tls_connection_set_property;
gobject_class->finalize = g_tls_connection_finalize;
/** /**
* GTlsConnection:base-io-stream: * GTlsConnection:base-io-stream:
@ -413,17 +406,6 @@ g_tls_connection_set_property (GObject *object,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
static void
g_tls_connection_finalize (GObject *object)
{
GTlsConnection *conn = G_TLS_CONNECTION(object);
GTlsConnectionPrivate *priv = g_tls_connection_get_instance_private (conn);
g_clear_pointer (&priv->negotiated_protocol, g_free);
G_OBJECT_CLASS (g_tls_connection_parent_class)->finalize (object);
}
/** /**
* g_tls_connection_set_use_system_certdb: * g_tls_connection_set_use_system_certdb:
* @conn: a #GTlsConnection * @conn: a #GTlsConnection
@ -871,31 +853,15 @@ g_tls_connection_set_advertised_protocols (GTlsConnection *conn,
const gchar * const gchar *
g_tls_connection_get_negotiated_protocol (GTlsConnection *conn) g_tls_connection_get_negotiated_protocol (GTlsConnection *conn)
{ {
GTlsConnectionPrivate *priv; GTlsConnectionClass *class;
gchar *protocol;
g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL); g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL);
g_object_get (G_OBJECT (conn), class = G_TLS_CONNECTION_GET_CLASS (conn);
"negotiated-protocol", &protocol, if (class->get_negotiated_protocol == NULL)
NULL); return NULL;
/* return class->get_negotiated_protocol (conn);
* Cache the property internally so we can return a `const` pointer
* to the caller.
*/
priv = g_tls_connection_get_instance_private (conn);
if (g_strcmp0 (priv->negotiated_protocol, protocol) != 0)
{
g_free (priv->negotiated_protocol);
priv->negotiated_protocol = protocol;
}
else
{
g_free (protocol);
}
return priv->negotiated_protocol;
} }
/** /**

View File

@ -43,6 +43,20 @@ struct _GTlsConnection {
GTlsConnectionPrivate *priv; GTlsConnectionPrivate *priv;
}; };
/**
* GTlsConnectionClass:
* @parent_class: The parent class.
* @accept_certificate: Check whether to accept a certificate.
* @handshake: Perform a handshake operation.
* @handshake_async: Start an asynchronous handshake operation.
* @handshake_finish: Finish an asynchronous handshake operation.
* @get_binding_data: Retrieve TLS channel binding data (Since: 2.66)
* @get_negotiated_protocol: Get ALPN-negotiated protocol (Since: 2.70)
*
* The class structure for the #GTlsConnection type.
*
* Since: 2.28
*/
struct _GTlsConnectionClass struct _GTlsConnectionClass
{ {
GIOStreamClass parent_class; GIOStreamClass parent_class;
@ -73,9 +87,11 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
GError **error); GError **error);
G_GNUC_END_IGNORE_DEPRECATIONS G_GNUC_END_IGNORE_DEPRECATIONS
const gchar *(*get_negotiated_protocol) (GTlsConnection *conn);
/*< private >*/ /*< private >*/
/* Padding for future expansion */ /* Padding for future expansion */
gpointer padding[7]; gpointer padding[6];
}; };
GLIB_AVAILABLE_IN_ALL GLIB_AVAILABLE_IN_ALL