summaryrefslogtreecommitdiff
path: root/libsoup/soup-socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-socket.c')
-rw-r--r--libsoup/soup-socket.c66
1 files changed, 40 insertions, 26 deletions
diff --git a/libsoup/soup-socket.c b/libsoup/soup-socket.c
index 754fa460..e964a6af 100644
--- a/libsoup/soup-socket.c
+++ b/libsoup/soup-socket.c
@@ -56,11 +56,10 @@ enum {
PROP_USE_THREAD_CONTEXT,
PROP_TIMEOUT,
PROP_TRUSTED_CERTIFICATE,
- PROP_CLEAN_DISPOSE,
PROP_TLS_CERTIFICATE,
PROP_TLS_ERRORS,
- PROP_PROXY_RESOLVER,
PROP_CLOSE_ON_DISPOSE,
+ PROP_SOCKET_PROPERTIES,
LAST_PROP
};
@@ -153,6 +152,7 @@ soup_socket_finalize (GObject *object)
g_clear_object (&priv->remote_addr);
g_clear_object (&priv->proxy_resolver);
+ g_clear_object (&priv->ssl_creds);
if (priv->watch_src) {
if (priv->clean_dispose && !priv->is_server)
@@ -192,6 +192,7 @@ soup_socket_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object);
+ SoupSocketProperties *props;
switch (prop_id) {
case PROP_LOCAL_ADDRESS:
@@ -205,6 +206,8 @@ soup_socket_set_property (GObject *object, guint prop_id,
break;
case PROP_SSL_CREDENTIALS:
priv->ssl_creds = g_value_get_pointer (value);
+ if (priv->ssl_creds)
+ g_object_ref (priv->ssl_creds);
break;
case PROP_SSL_STRICT:
priv->ssl_strict = g_value_get_boolean (value);
@@ -225,11 +228,32 @@ soup_socket_set_property (GObject *object, guint prop_id,
if (priv->conn)
g_socket_set_timeout (priv->gsock, priv->timeout);
break;
- case PROP_PROXY_RESOLVER:
- priv->proxy_resolver = g_value_dup_object (value);
- break;
- case PROP_CLEAN_DISPOSE:
- priv->clean_dispose = g_value_get_boolean (value);
+ case PROP_SOCKET_PROPERTIES:
+ props = g_value_get_boxed (value);
+ if (props) {
+ g_clear_pointer (&priv->async_context, g_main_context_unref);
+ if (props->async_context)
+ priv->async_context = g_main_context_ref (props->async_context);
+ priv->use_thread_context = props->use_thread_context;
+
+ g_clear_object (&priv->proxy_resolver);
+ if (props->proxy_resolver)
+ priv->proxy_resolver = g_object_ref (props->proxy_resolver);
+ g_clear_object (&priv->local_addr);
+ if (props->local_addr)
+ priv->local_addr = g_object_ref (props->local_addr);
+
+ g_clear_object (&priv->ssl_creds);
+ if (props->tlsdb)
+ priv->ssl_creds = g_object_ref (props->tlsdb);
+ priv->ssl_strict = props->ssl_strict;
+
+ priv->timeout = props->io_timeout;
+ if (priv->conn)
+ g_socket_set_timeout (priv->gsock, priv->timeout);
+
+ priv->clean_dispose = TRUE;
+ }
break;
case PROP_CLOSE_ON_DISPOSE:
priv->close_on_dispose = g_value_get_boolean (value);
@@ -289,9 +313,6 @@ soup_socket_get_property (GObject *object, guint prop_id,
case PROP_TLS_ERRORS:
g_value_set_flags (value, priv->tls_errors);
break;
- case PROP_PROXY_RESOLVER:
- g_value_set_object (value, priv->proxy_resolver);
- break;
case PROP_CLOSE_ON_DISPOSE:
g_value_set_boolean (value, priv->close_on_dispose);
break;
@@ -587,13 +608,6 @@ soup_socket_class_init (SoupSocketClass *socket_class)
0, G_MAXUINT, 0,
G_PARAM_READWRITE));
- g_object_class_install_property (
- object_class, PROP_CLEAN_DISPOSE,
- g_param_spec_boolean ("clean-dispose",
- "Clean dispose",
- "Warn on unclean dispose",
- FALSE,
- G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
/**
* SOUP_SOCKET_TLS_CERTIFICATE:
*
@@ -630,20 +644,20 @@ soup_socket_class_init (SoupSocketClass *socket_class)
G_PARAM_READABLE));
g_object_class_install_property (
- object_class, PROP_PROXY_RESOLVER,
- g_param_spec_object (SOUP_SOCKET_PROXY_RESOLVER,
- "Proxy resolver",
- "GProxyResolver to use",
- G_TYPE_PROXY_RESOLVER,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (
object_class, PROP_CLOSE_ON_DISPOSE,
g_param_spec_boolean (SOUP_SOCKET_CLOSE_ON_DISPOSE,
"Close socket on disposal",
"Whether the socket is closed on disposal",
TRUE,
G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class, PROP_SOCKET_PROPERTIES,
+ g_param_spec_boxed (SOUP_SOCKET_SOCKET_PROPERTIES,
+ "Socket properties",
+ "Socket properties",
+ SOUP_TYPE_SOCKET_PROPERTIES,
+ G_PARAM_WRITABLE));
}
@@ -1020,7 +1034,7 @@ listen_watch (GObject *pollable, gpointer data)
new_priv->is_server = TRUE;
new_priv->ssl = priv->ssl;
if (priv->ssl_creds)
- new_priv->ssl_creds = priv->ssl_creds;
+ new_priv->ssl_creds = g_object_ref (priv->ssl_creds);
finish_socket_setup (new_priv);
if (new_priv->ssl_creds) {