[evolution-data-server] CamelNetworkService: Return GIOStream instead of CamelStream.



commit 0b07255b80e92e6b6c05af70f9ef9bcc9979e290
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Nov 3 08:50:33 2013 -0500

    CamelNetworkService: Return GIOStream instead of CamelStream.
    
    Similar to recent CamelDataCache changes.  Instead of wrapping a TCP
    connection GIOStream in a CamelStream, return the GIOStream directly
    and let callers wrap it if they need to with camel_stream_new().

 camel/camel-network-service.c               |   48 +++++++++------------------
 camel/camel-network-service.h               |    8 ++--
 camel/providers/imapx/camel-imapx-server.c  |   28 +++++++++++----
 camel/providers/nntp/camel-nntp-store.c     |   14 +++++---
 camel/providers/pop3/camel-pop3-store.c     |   35 +++++++++++++-------
 camel/providers/smtp/camel-smtp-transport.c |   40 ++++++++++++++--------
 6 files changed, 97 insertions(+), 76 deletions(-)
---
diff --git a/camel/camel-network-service.c b/camel/camel-network-service.c
index 8b28c20..5a89b82 100644
--- a/camel/camel-network-service.c
+++ b/camel/camel-network-service.c
@@ -592,7 +592,7 @@ network_service_private_free (CamelNetworkServicePrivate *priv)
        g_slice_free (CamelNetworkServicePrivate, priv);
 }
 
-static CamelStream *
+static GIOStream *
 network_service_connect_sync (CamelNetworkService *service,
                               GCancellable *cancellable,
                               GError **error)
@@ -603,7 +603,6 @@ network_service_connect_sync (CamelNetworkService *service,
        CamelNetworkSecurityMethod method;
        CamelNetworkSettings *network_settings;
        CamelSettings *settings;
-       CamelStream *stream = NULL;
 
        settings = camel_service_ref_settings (CAMEL_SERVICE (service));
 
@@ -630,17 +629,12 @@ network_service_connect_sync (CamelNetworkService *service,
        connection = g_socket_client_connect (
                client, connectable, cancellable, error);
 
-       if (connection != NULL) {
-               stream = camel_stream_new (G_IO_STREAM (connection));
-               g_object_unref (connection);
-       }
-
        g_object_unref (connectable);
        g_object_unref (client);
 
        g_object_unref (settings);
 
-       return stream;
+       return (connection != NULL) ? G_IO_STREAM (connection) : NULL;
 }
 
 static GSocketConnectable *
@@ -896,11 +890,11 @@ camel_network_service_get_host_reachable (CamelNetworkService *service)
  * connection attempt is cancelled, the function sets @error and returns
  * %NULL.
  *
- * Returns: a #CamelStream, or %NULL
+ * Returns: a #GIOStream, or %NULL
  *
  * Since: 3.2
  **/
-CamelStream *
+GIOStream *
 camel_network_service_connect_sync (CamelNetworkService *service,
                                     GCancellable *cancellable,
                                     GError **error)
@@ -918,35 +912,30 @@ camel_network_service_connect_sync (CamelNetworkService *service,
 /**
  * camel_network_service_starttls:
  * @service: a #CamelNetworkService
- * @stream: a #CamelStream
+ * @base_stream: a #GIOStream
  * @error: return location for a #GError, or %NULL
  *
- * Replaces @stream's #CamelStream:base-stream with a #GTlsClientConnection
- * wrapping #CamelStream:base-stream, which is assumed to communicate with
- * the server identified by @service's #CamelNetworkService:connectable.
+ * Creates a #GTlsClientConnection wrapping @base_stream, which is
+ * assumed to communicate with the server identified by @service's
+ * #CamelNetworkService:connectable.
  *
- * This should typically be called after issuing a STARTTLS command to a
- * server to initiate a Transport Layer Security handshake.
+ * This should typically be called after issuing a STARTTLS command
+ * to a server to initiate a Transport Layer Security handshake.
  *
- * Returns: %TRUE on success, %FALSE on failure
+ * Returns: the new #GTlsClientConnection, or %NULL on error
  *
  * Since: 3.12
  **/
-gboolean
+GIOStream *
 camel_network_service_starttls (CamelNetworkService *service,
-                                CamelStream *stream,
+                                GIOStream *base_stream,
                                 GError **error)
 {
        GSocketConnectable *connectable;
        GIOStream *tls_client_connection;
-       GIOStream *base_stream;
-       gboolean success = FALSE;
 
-       g_return_val_if_fail (CAMEL_IS_NETWORK_SERVICE (service), FALSE);
-       g_return_val_if_fail (CAMEL_IS_STREAM (stream), FALSE);
-
-       base_stream = camel_stream_ref_base_stream (stream);
-       g_return_val_if_fail (base_stream != NULL, FALSE);
+       g_return_val_if_fail (CAMEL_IS_NETWORK_SERVICE (service), NULL);
+       g_return_val_if_fail (G_IS_IO_STREAM (base_stream), NULL);
 
        connectable = camel_network_service_ref_connectable (service);
        g_return_val_if_fail (connectable != NULL, FALSE);
@@ -959,15 +948,10 @@ camel_network_service_starttls (CamelNetworkService *service,
                        tls_client_connection, "accept-certificate",
                        G_CALLBACK (network_service_accept_certificate_cb),
                        service);
-
-               camel_stream_set_base_stream (stream, tls_client_connection);
-               g_object_unref (tls_client_connection);
-               success = TRUE;
        }
 
-       g_object_unref (base_stream);
        g_object_unref (connectable);
 
-       return success;
+       return tls_client_connection;
 }
 
diff --git a/camel/camel-network-service.h b/camel/camel-network-service.h
index 7d3479d..dd819a5 100644
--- a/camel/camel-network-service.h
+++ b/camel/camel-network-service.h
@@ -66,7 +66,7 @@ struct _CamelNetworkServiceInterface {
                                        (CamelNetworkService *service,
                                         CamelNetworkSecurityMethod method);
 
-       CamelStream *   (*connect_sync) (CamelNetworkService *service,
+       GIOStream *     (*connect_sync) (CamelNetworkService *service,
                                         GCancellable *cancellable,
                                         GError **error);
 
@@ -92,13 +92,13 @@ void                camel_network_service_set_connectable
                                         GSocketConnectable *connectable);
 gboolean       camel_network_service_get_host_reachable
                                        (CamelNetworkService *service);
-CamelStream *  camel_network_service_connect_sync
+GIOStream *    camel_network_service_connect_sync
                                        (CamelNetworkService *service,
                                         GCancellable *cancellable,
                                         GError **error);
-gboolean       camel_network_service_starttls
+GIOStream *    camel_network_service_starttls
                                        (CamelNetworkService *service,
-                                        CamelStream *stream,
+                                        GIOStream *base_stream,
                                         GError **error);
 
 G_END_DECLS
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index bc9c8e9..2d38704 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -4203,10 +4203,12 @@ imapx_connect_to_server (CamelIMAPXServer *is,
 {
        CamelNetworkSettings *network_settings;
        CamelNetworkSecurityMethod method;
-       CamelStream *tcp_stream = NULL;
+       CamelStream *stream = NULL;
        CamelStream *imapx_stream = NULL;
        CamelIMAPXStore *store;
        CamelSettings *settings;
+       GIOStream *base_stream;
+       GIOStream *tls_stream;
        guint len;
        guchar *token;
        gint tok;
@@ -4253,15 +4255,18 @@ imapx_connect_to_server (CamelIMAPXServer *is,
        }
 #endif
 
-       tcp_stream = camel_network_service_connect_sync (
+       base_stream = camel_network_service_connect_sync (
                CAMEL_NETWORK_SERVICE (store), cancellable, error);
 
-       if (tcp_stream == NULL) {
+       if (base_stream != NULL) {
+               stream = camel_stream_new (base_stream);
+               g_object_unref (base_stream);
+       } else {
                success = FALSE;
                goto exit;
        }
 
-       imapx_stream = camel_imapx_stream_new (tcp_stream);
+       imapx_stream = camel_imapx_stream_new (stream);
 
        /* CamelIMAPXServer takes ownership of the IMAPX stream.
         * We need to set this right away for imapx_command_run()
@@ -4272,7 +4277,7 @@ imapx_connect_to_server (CamelIMAPXServer *is,
        is->priv->stream = CAMEL_IMAPX_STREAM (imapx_stream);
        g_mutex_unlock (&is->priv->stream_lock);
 
-       g_object_unref (tcp_stream);
+       g_object_unref (stream);
 
  connected:
        CAMEL_IMAPX_STREAM (imapx_stream)->tagprefix = is->tagprefix;
@@ -4380,13 +4385,20 @@ imapx_connect_to_server (CamelIMAPXServer *is,
                if (!success)
                        goto exit;
 
-               success = camel_network_service_starttls (
-                       CAMEL_NETWORK_SERVICE (store), tcp_stream, error);
-               if (!success) {
+               base_stream = camel_stream_ref_base_stream (stream);
+               tls_stream = camel_network_service_starttls (
+                       CAMEL_NETWORK_SERVICE (store), base_stream, error);
+               g_object_unref (base_stream);
+
+               if (tls_stream != NULL) {
+                       camel_stream_set_base_stream (stream, tls_stream);
+                       g_object_unref (tls_stream);
+               } else {
                        g_prefix_error (
                                error,
                                _("Failed to connect to IMAP server %s in secure mode: "),
                                host);
+                       success = FALSE;
                        goto exit;
                }
 
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
index 9063110..548fb02 100644
--- a/camel/providers/nntp/camel-nntp-store.c
+++ b/camel/providers/nntp/camel-nntp-store.c
@@ -350,7 +350,8 @@ connect_to_server (CamelService *service,
        CamelNetworkSettings *network_settings;
        CamelSettings *settings;
        CamelSession *session;
-       CamelStream *tcp_stream;
+       CamelStream *stream;
+       GIOStream *base_stream;
        const gchar *user_cache_dir;
        guchar *buf;
        guint len;
@@ -371,14 +372,17 @@ connect_to_server (CamelService *service,
 
        g_object_unref (settings);
 
-       tcp_stream = camel_network_service_connect_sync (
+       base_stream = camel_network_service_connect_sync (
                CAMEL_NETWORK_SERVICE (service), cancellable, error);
 
-       if (tcp_stream == NULL)
+       if (base_stream == NULL)
                goto fail;
 
-       nntp_stream = camel_nntp_stream_new (tcp_stream);
-       g_object_unref (tcp_stream);
+       stream = camel_stream_new (base_stream);
+       nntp_stream = camel_nntp_stream_new (stream);
+       g_object_unref (stream);
+
+       g_object_unref (base_stream);
 
        /* Read the greeting, if any. */
        if (camel_nntp_stream_line (nntp_stream, &buf, &len, cancellable, error) == -1) {
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
index 42cb5c1..067e76d 100644
--- a/camel/providers/pop3/camel-pop3-store.c
+++ b/camel/providers/pop3/camel-pop3-store.c
@@ -111,9 +111,11 @@ connect_to_server (CamelService *service,
        CamelNetworkSettings *network_settings;
        CamelNetworkSecurityMethod method;
        CamelSettings *settings;
-       CamelStream *tcp_stream;
+       CamelStream *stream;
        CamelPOP3Engine *pop3_engine = NULL;
        CamelPOP3Command *pc;
+       GIOStream *base_stream;
+       GIOStream *tls_stream;
        gboolean disable_extensions;
        gboolean success = TRUE;
        gchar *host;
@@ -132,10 +134,13 @@ connect_to_server (CamelService *service,
 
        g_object_unref (settings);
 
-       tcp_stream = camel_network_service_connect_sync (
+       base_stream = camel_network_service_connect_sync (
                CAMEL_NETWORK_SERVICE (service), cancellable, error);
 
-       if (tcp_stream == NULL) {
+       if (base_stream != NULL) {
+               stream = camel_stream_new (base_stream);
+               g_object_unref (base_stream);
+       } else {
                success = FALSE;
                goto exit;
        }
@@ -143,7 +148,7 @@ connect_to_server (CamelService *service,
        /* parent class connect initialization */
        if (CAMEL_SERVICE_CLASS (camel_pop3_store_parent_class)->
                connect_sync (service, cancellable, error) == FALSE) {
-               g_object_unref (tcp_stream);
+               g_object_unref (stream);
                success = FALSE;
                goto exit;
        }
@@ -151,7 +156,7 @@ connect_to_server (CamelService *service,
        if (disable_extensions)
                flags |= CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS;
 
-       if (!(pop3_engine = camel_pop3_engine_new (tcp_stream, flags, cancellable, &local_error)) ||
+       if (!(pop3_engine = camel_pop3_engine_new (stream, flags, cancellable, &local_error)) ||
            local_error != NULL) {
                if (local_error)
                        g_propagate_error (error, local_error);
@@ -160,13 +165,13 @@ connect_to_server (CamelService *service,
                                error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
                                _("Failed to read a valid greeting from POP server %s"),
                                host);
-               g_object_unref (tcp_stream);
+               g_object_unref (stream);
                success = FALSE;
                goto exit;
        }
 
        if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT) {
-               g_object_unref (tcp_stream);
+               g_object_unref (stream);
                goto exit;
        }
 
@@ -202,9 +207,15 @@ connect_to_server (CamelService *service,
        }
 
        /* Okay, now toggle SSL/TLS mode */
-       success = camel_network_service_starttls (
-               CAMEL_NETWORK_SERVICE (service), tcp_stream, error);
-       if (!success) {
+       base_stream = camel_stream_ref_base_stream (stream);
+       tls_stream = camel_network_service_starttls (
+               CAMEL_NETWORK_SERVICE (service), base_stream, error);
+       g_object_unref (base_stream);
+
+       if (tls_stream != NULL) {
+               camel_stream_set_base_stream (stream, tls_stream);
+               g_object_unref (tls_stream);
+       } else {
                g_prefix_error (
                        error,
                        _("Failed to connect to POP server %s in secure mode: "),
@@ -212,7 +223,7 @@ connect_to_server (CamelService *service,
                goto stls_exception;
        }
 
-       g_object_unref (tcp_stream);
+       g_object_unref (stream);
 
        /* rfc2595, section 4 states that after a successful STLS
         * command, the client MUST discard prior CAPA responses */
@@ -235,7 +246,7 @@ stls_exception:
        }*/
 
 exception:
-       g_object_unref (tcp_stream);
+       g_object_unref (stream);
 
        g_clear_object (&pop3_engine);
 
diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c
index 2b83893..b364e13 100644
--- a/camel/providers/smtp/camel-smtp-transport.c
+++ b/camel/providers/smtp/camel-smtp-transport.c
@@ -116,8 +116,9 @@ connect_to_server (CamelService *service,
        CamelNetworkSettings *network_settings;
        CamelNetworkSecurityMethod method;
        CamelSettings *settings;
-       CamelStream *tcp_stream;
+       CamelStream *stream;
        GIOStream *base_stream;
+       GIOStream *tls_stream;
        gchar *respbuf = NULL;
        gboolean success = TRUE;
        gchar *host;
@@ -138,25 +139,27 @@ connect_to_server (CamelService *service,
 
        g_object_unref (settings);
 
-       tcp_stream = camel_network_service_connect_sync (
+       base_stream = camel_network_service_connect_sync (
                CAMEL_NETWORK_SERVICE (service), cancellable, error);
 
-       if (tcp_stream == NULL) {
+       if (base_stream != NULL) {
+               /* get the localaddr - needed later by smtp_helo */
+               transport->local_address =
+                       g_socket_connection_get_local_address (
+                       G_SOCKET_CONNECTION (base_stream), NULL);
+
+               stream = camel_stream_new (base_stream);
+               g_object_unref (base_stream);
+       } else {
                success = FALSE;
                goto exit;
        }
 
        transport->connected = TRUE;
 
-       /* get the localaddr - needed later by smtp_helo */
-       base_stream = camel_stream_ref_base_stream (tcp_stream);
-       transport->local_address = g_socket_connection_get_local_address (
-               G_SOCKET_CONNECTION (base_stream), NULL);
-       g_object_unref (base_stream);
-
-       transport->ostream = tcp_stream;
+       transport->ostream = stream;
        transport->istream = camel_stream_buffer_new (
-               tcp_stream, CAMEL_STREAM_BUFFER_READ);
+               stream, CAMEL_STREAM_BUFFER_READ);
 
        /* Read the greeting, note whether the server is ESMTP or not. */
        do {
@@ -219,7 +222,7 @@ connect_to_server (CamelService *service,
 
        d (fprintf (stderr, "sending : STARTTLS\r\n"));
        if (camel_stream_write (
-               tcp_stream, "STARTTLS\r\n", 10, cancellable, error) == -1) {
+               stream, "STARTTLS\r\n", 10, cancellable, error) == -1) {
                g_prefix_error (error, _("STARTTLS command failed: "));
                success = FALSE;
                goto exit;
@@ -250,13 +253,20 @@ connect_to_server (CamelService *service,
        } while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */
 
        /* Okay, now toggle SSL/TLS mode */
-       success = camel_network_service_starttls (
-               CAMEL_NETWORK_SERVICE (service), tcp_stream, error);
-       if (!success) {
+       base_stream = camel_stream_ref_base_stream (stream);
+       tls_stream = camel_network_service_starttls (
+               CAMEL_NETWORK_SERVICE (service), base_stream, error);
+       g_object_unref (base_stream);
+
+       if (tls_stream != NULL) {
+               camel_stream_set_base_stream (stream, tls_stream);
+               g_object_unref (tls_stream);
+       } else {
                g_prefix_error (
                        error,
                        _("Failed to connect to SMTP server %s in secure mode: "),
                        host);
+               success = FALSE;
                goto exit;
        }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]