src/irc_client.c
changeset 53 12d806823775
child 55 6f7f6ae729d0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/irc_client.c	Fri Mar 13 16:10:48 2009 +0200
@@ -0,0 +1,92 @@
+#include "irc_client.h"
+#include "log.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+err_t irc_client_create (struct irc_client **client_ptr, struct error_info *err)
+{
+    struct irc_client *client;
+
+    // allocate
+    if ((client = calloc(1, sizeof(*client))) == NULL)
+        return SET_ERROR(err, ERR_CALLOC);
+
+    // init
+    TAILQ_INIT(&client->networks);
+
+    // ok
+    *client_ptr = client;
+
+    return SUCCESS;
+}
+
+void irc_client_destroy (struct irc_client *client)
+{
+    struct irc_net *next = TAILQ_FIRST(&client->networks), *net;
+
+    // our networks
+    while (next) {
+        net = next;
+        next = TAILQ_NEXT(net, client_networks);
+
+        irc_net_destroy(net);
+    }
+
+    // ourselves
+    free(client);
+}
+
+err_t irc_client_add_net (struct irc_client *client, struct irc_net **net_ptr, struct irc_net_info *net_info)
+{
+    struct irc_net *net;
+    struct error_info err;
+
+    // create the new irc_chan struct
+    if (irc_net_create(&net, net_info, &err))
+        return ERROR_CODE(&err);
+    
+    // add to network list
+    TAILQ_INSERT_TAIL(&client->networks, net, client_networks);
+    
+    // ok
+    *net_ptr = net;
+
+    return SUCCESS;
+}
+
+struct irc_net* irc_client_get_net (struct irc_client *client, const char *network)
+{
+    struct irc_net *net = NULL;
+
+    // look for it...
+    TAILQ_FOREACH(net, &client->networks, client_networks) {
+        if (strcasecmp(net->info.network, network) == 0)
+            // found it
+            return net;
+    }
+
+    // no such network
+    return NULL;
+}
+
+err_t irc_client_quit (struct irc_client *client, const char *message)
+{
+    struct irc_net *net;
+    err_t err;
+
+    // quit each network
+    TAILQ_FOREACH(net, &client->networks, client_networks) {
+        if ((err = irc_net_quit(net, message))) {
+            log_err(err, "irc_net_quit: %s [%s]", net->info.network, message);
+            
+            // XXX: destroy it?
+        }
+    }
+
+    // state
+    client->quitting = true;
+
+    // ok
+    return SUCCESS;
+}