Move more functionality to transport.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 9 Apr 2008 20:32:51 +0000 (22:32 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Wed, 9 Apr 2008 20:32:51 +0000 (22:32 +0200)
lib/client.c
lib/client.h
lib/transport.c
lib/transport.h

index 2b1931c06ff503e89dd05a2a2823bc86fb6cc9fc..330e8aac3b97cf83bc50206d219f812910725eb0 100644 (file)
@@ -170,7 +170,7 @@ gboolean client_send_line(struct irc_client *c, const struct irc_line *l)
                if (status == G_IO_STATUS_AGAIN) {
                        c->transport->outgoing_id = g_io_add_watch(c->transport->incoming, G_IO_OUT, 
                                                                                        handle_client_send_queue, c);
-                       g_queue_push_tail(c->pending_lines, linedup(l));
+                       g_queue_push_tail(c->transport->pending_lines, linedup(l));
                } else if (status != G_IO_STATUS_NORMAL) {
                        c->connected = FALSE;
 
@@ -183,16 +183,11 @@ gboolean client_send_line(struct irc_client *c, const struct irc_line *l)
                return TRUE;
        }
 
-       g_queue_push_tail(c->pending_lines, linedup(l));
+       g_queue_push_tail(c->transport->pending_lines, linedup(l));
 
        return TRUE;
 }
 
-static void free_pending_line(void *_line, void *userdata)
-{
-       free_line((struct irc_line *)_line);
-}
-
 /*
  * Disconnect a client.
  *
@@ -224,7 +219,7 @@ void client_disconnect(struct irc_client *c, const char *reason)
 
        irc_send_args(c->transport->incoming, c->transport->outgoing_iconv, NULL, "ERROR", reason, NULL);
 
-       free_irc_transport(c->transport);
+       irc_transport_disconnect(c->transport);
 
        if (c->exit_on_close) 
                exit(0);
@@ -241,8 +236,7 @@ static void free_client(struct irc_client *c)
        g_free(c->requested_nick);
        g_free(c->requested_username);
        g_free(c->requested_hostname);
-       g_queue_foreach(c->pending_lines, free_pending_line, NULL);
-       g_queue_free(c->pending_lines);
+       free_irc_transport(c->transport);
        g_free(c->default_origin);
        if (c->callbacks->free_private_data)
                c->callbacks->free_private_data(c);
@@ -278,17 +272,17 @@ static gboolean handle_client_send_queue(GIOChannel *ioc, GIOCondition cond,
 
        g_assert(ioc == c->transport->incoming);
 
-       while (!g_queue_is_empty(c->pending_lines)) {
+       while (!g_queue_is_empty(c->transport->pending_lines)) {
                GIOStatus status;
                GError *error = NULL;
-               struct irc_line *l = g_queue_pop_head(c->pending_lines);
+               struct irc_line *l = g_queue_pop_head(c->transport->pending_lines);
 
                g_assert(c->transport->incoming != NULL);
                status = irc_send_line(c->transport->incoming, 
                                                           c->transport->outgoing_iconv, l, &error);
 
                if (status == G_IO_STATUS_AGAIN) {
-                       g_queue_push_head(c->pending_lines, l);
+                       g_queue_push_head(c->transport->pending_lines, l);
                        return TRUE;
                }
 
@@ -572,9 +566,7 @@ struct irc_client *irc_client_new(GIOChannel *c, const char *default_origin, con
        client->transport = irc_transport_new_iochannel(c);
        client->description = g_strdup(desc);
        client->connected = TRUE;
-       client->pending_lines = g_queue_new();
 
-       client->transport->outgoing_iconv = client->transport->incoming_iconv = (GIConv)-1;
        client_set_charset(client, DEFAULT_CLIENT_CHARSET);
        pending_clients = g_list_append(pending_clients, client);
        client->transport->incoming_id = g_io_add_watch(
index 23476fb53bec7f0a2cc74266e123cee92f999575..babcb3b72625bfe62018c11511f0c5b495c3de99 100644 (file)
@@ -49,7 +49,6 @@ struct irc_client {
        int references;
        struct irc_network *network;
        char *description;
-       GQueue *pending_lines;
        gint ping_id;
        time_t last_ping;
        time_t last_pong;
index 594408bccfb373196146f5134ba3c01a8246d388..236ea67270659608fffe007e62e3d57456bca57e 100644 (file)
@@ -19,6 +19,7 @@
 */
 
 #include "transport.h"
+#include "line.h"
 #include <glib.h>
 
 struct irc_transport *irc_transport_new_iochannel(GIOChannel *iochannel)
@@ -26,11 +27,23 @@ struct irc_transport *irc_transport_new_iochannel(GIOChannel *iochannel)
        struct irc_transport *ret = g_new0(struct irc_transport, 1);
 
        ret->incoming = iochannel;
+       ret->pending_lines = g_queue_new();
+       ret->outgoing_iconv = ret->incoming_iconv = (GIConv)-1;
        g_io_channel_ref(ret->incoming);
 
        return ret;
 }
 
+void irc_transport_disconnect(struct irc_transport *transport)
+{
+       g_io_channel_shutdown(transport->incoming, FALSE, NULL);
+}
+
+static void free_pending_line(void *_line, void *userdata)
+{
+       free_line((struct irc_line *)_line);
+}
+
 void free_irc_transport(struct irc_transport *transport)
 {
        g_io_channel_unref(transport->incoming);
@@ -42,5 +55,8 @@ void free_irc_transport(struct irc_transport *transport)
        if (transport->incoming_iconv != (GIConv)-1)
                g_iconv_close(transport->incoming_iconv);
 
+       g_queue_foreach(transport->pending_lines, free_pending_line, NULL);
+       g_queue_free(transport->pending_lines);
+
        g_free(transport);
 }
index 8669eeead9e4b69f9fdb54311a33d7375efe3e7c..5e61c773465bd2d44b9bba62fe16f860662ded14 100644 (file)
@@ -33,9 +33,11 @@ struct irc_transport {
        gint outgoing_id;
        GIConv incoming_iconv;
        GIConv outgoing_iconv;
+       GQueue *pending_lines;
 };
 
 struct irc_transport *irc_transport_new_iochannel(GIOChannel *iochannel);
+void irc_transport_disconnect(struct irc_transport *transport);
 void free_irc_transport(struct irc_transport *);
 
 #endif /* __LIBIRC_TRANSPORT_H__ */