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;
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.
*
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);
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);
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;
}
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(
*/
#include "transport.h"
+#include "line.h"
#include <glib.h>
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);
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);
}