From c779ca37882e0b7efaca91f9c82611b743d09b4e Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 30 Nov 2024 05:08:45 +0200 Subject: [PATCH] add shared cancellable holder --- src/client.rs | 1 + src/client/connection.rs | 17 +++++++++++------ src/client/session.rs | 4 ++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/client.rs b/src/client.rs index 2f22e4e..0a8b8ac 100644 --- a/src/client.rs +++ b/src/client.rs @@ -113,6 +113,7 @@ impl Client { connection, certificate, Some(network_address), + cancellable.clone(), ) { Ok(connection) => { // Wrap to shared reference support clone semantics diff --git a/src/client/connection.rs b/src/client/connection.rs index b9f799e..2072422 100644 --- a/src/client/connection.rs +++ b/src/client/connection.rs @@ -8,9 +8,10 @@ use gio::{ use glib::object::{Cast, IsA}; pub struct Connection { + pub cancellable: Option, + pub server_identity: Option, pub socket_connection: SocketConnection, pub tls_client_connection: Option, - pub server_identity: Option, } impl Connection { @@ -21,12 +22,14 @@ impl Connection { socket_connection: SocketConnection, certificate: Option, server_identity: Option, + cancellable: Option, ) -> Result { if socket_connection.is_closed() { return Err(Error::Closed); } Ok(Self { + cancellable, server_identity: server_identity.clone(), socket_connection: socket_connection.clone(), tls_client_connection: match certificate { @@ -49,16 +52,16 @@ impl Connection { /// Close owned [SocketConnection](https://docs.gtk.org/gio/class.SocketConnection.html) /// and [TlsClientConnection](https://docs.gtk.org/gio/iface.TlsClientConnection.html) if active - pub fn close(&self, cancellable: Option<&Cancellable>) -> Result<(), Error> { + pub fn close(&self) -> Result<(), Error> { if let Some(ref tls_client_connection) = self.tls_client_connection { if !tls_client_connection.is_closed() { - if let Err(e) = tls_client_connection.close(cancellable) { + if let Err(e) = tls_client_connection.close(self.cancellable.as_ref()) { return Err(Error::TlsClientConnection(e)); } } } if !self.socket_connection.is_closed() { - if let Err(e) = self.socket_connection.close(cancellable) { + if let Err(e) = self.socket_connection.close(self.cancellable.as_ref()) { return Err(Error::SocketConnection(e)); } } @@ -69,8 +72,10 @@ impl Connection { /// * useful for certificate change in runtime /// * support guest and user sessions pub fn rehandshake(&self) -> Result<(), Error> { - match self.tls_client_connection()?.handshake(Cancellable::NONE) { - // @TODO shared `Cancellable` + match self + .tls_client_connection()? + .handshake(self.cancellable.as_ref()) + { Ok(()) => Ok(()), Err(e) => Err(Error::Rehandshake(e)), } diff --git a/src/client/session.rs b/src/client/session.rs index 34af1ea..aea904a 100644 --- a/src/client/session.rs +++ b/src/client/session.rs @@ -4,7 +4,7 @@ pub use error::Error; use super::Connection; use gio::{ prelude::{TlsCertificateExt, TlsConnectionExt}, - Cancellable, TlsCertificate, + TlsCertificate, }; use glib::Uri; use std::{cell::RefCell, collections::HashMap, rc::Rc}; @@ -69,7 +69,7 @@ impl Session { } // Close connection if active yet - if let Err(e) = connection.close(Cancellable::NONE) { + if let Err(e) = connection.close() { return Err(Error::Connection(e)); } }