static void soup_socket_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object); switch (prop_id) { case PROP_LOCAL_ADDRESS: g_value_set_object (value, soup_socket_get_local_address (SOUP_SOCKET (object))); break; case PROP_REMOTE_ADDRESS: g_value_set_object (value, soup_socket_get_remote_address (SOUP_SOCKET (object))); break; case PROP_NON_BLOCKING: g_value_set_boolean (value, priv->non_blocking); break; case PROP_IS_SERVER: g_value_set_boolean (value, priv->is_server); break; case PROP_SSL_CREDENTIALS: g_value_set_pointer (value, priv->ssl_creds); break; case PROP_SSL_STRICT: g_value_set_boolean (value, priv->ssl_strict); break; case PROP_SSL_FALLBACK: g_value_set_boolean (value, priv->ssl_fallback); break; case PROP_TRUSTED_CERTIFICATE: g_value_set_boolean (value, priv->tls_errors == 0); break; case PROP_ASYNC_CONTEXT: g_value_set_pointer (value, priv->async_context ? g_main_context_ref (priv->async_context) : NULL); break; case PROP_USE_THREAD_CONTEXT: g_value_set_boolean (value, priv->use_thread_context); break; case PROP_TIMEOUT: g_value_set_uint (value, priv->timeout); break; case PROP_TLS_CERTIFICATE: if (G_IS_TLS_CONNECTION (priv->conn)) g_value_set_object (value, g_tls_connection_get_peer_certificate (G_TLS_CONNECTION (priv->conn))); else g_value_set_object (value, NULL); break; 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; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void socket_connect_complete (GObject *object, GAsyncResult *result, gpointer user_data) { SoupSocket *sock = SOUP_SOCKET (object); GTask *task = user_data; SoupConnection *conn = g_task_get_source_object (task); SoupConnectionPrivate *priv = SOUP_CONNECTION_GET_PRIVATE (conn); GError *error = NULL; if (!soup_socket_connect_finish_internal (sock, result, &error)) { socket_connect_finished (task, sock, error); return; } priv->proxy_uri = soup_socket_get_http_proxy_uri (sock); if (priv->ssl && !priv->proxy_uri) { soup_socket_handshake_async (sock, priv->remote_uri->host, g_task_get_cancellable (task), socket_handshake_complete, task); return; } socket_connect_finished (task, sock, NULL); }
static void socket_handshake_complete (GObject *object, GAsyncResult *result, gpointer user_data) { SoupSocket *sock = SOUP_SOCKET (object); GTask *task = user_data; GError *error = NULL; soup_socket_handshake_finish (sock, result, &error); socket_connect_finished (task, sock, error); }
static void soup_socket_finalize (GObject *object) { SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object); if (priv->connect_cancel) { if (priv->clean_dispose) g_warning ("Disposing socket %p during connect", object); g_object_unref (priv->connect_cancel); } if (priv->gsock) { if (priv->clean_dispose) g_warning ("Disposing socket %p while still connected", object); disconnect_internal (SOUP_SOCKET (object), TRUE); } g_clear_object (&priv->conn); g_clear_object (&priv->iostream); g_clear_object (&priv->istream); g_clear_object (&priv->ostream); g_clear_object (&priv->local_addr); g_clear_object (&priv->remote_addr); g_clear_object (&priv->proxy_resolver); if (priv->watch_src) { if (priv->clean_dispose && !priv->is_server) g_warning ("Disposing socket %p during async op", object); g_source_destroy (priv->watch_src); } g_clear_pointer (&priv->async_context, g_main_context_unref); g_mutex_clear (&priv->addrlock); g_mutex_clear (&priv->iolock); G_OBJECT_CLASS (soup_socket_parent_class)->finalize (object); }