src/irc_chan.c
changeset 37 4fe4a3c4496e
parent 26 aec062af155d
child 38 0c2e0cb46c3a
--- a/src/irc_chan.c	Thu Mar 12 18:08:27 2009 +0200
+++ b/src/irc_chan.c	Thu Mar 12 18:11:44 2009 +0200
@@ -1,4 +1,6 @@
 #include "irc_chan.h"
+#include "irc_nm.h"
+#include "log.h"
 
 #include <stdlib.h>
 #include <assert.h>
@@ -8,6 +10,33 @@
     return chan->info.channel;
 }
 
+/**
+ * :nm JOIN <channel>
+ */ 
+static void irc_chan_on_JOIN (const struct irc_line *line, void *arg)
+{
+    struct irc_chan *chan = arg;
+
+    // us?
+    if (irc_prefix_cmp_nick(line->prefix, chan->net->conn->nickname) == 0) {
+        // twiddle state
+        chan->state.joining = false;
+        chan->state.joined = true;
+
+        log_info("joined channel: %s", chan->info.channel);
+
+        // TODO: callbacks
+    }
+}
+
+/**
+ * Core command handlers
+ */
+struct irc_cmd_handler _cmd_handlers[] = {
+    {   "JOIN",     &irc_chan_on_JOIN   },
+    {   NULL,       NULL                }
+};
+
 err_t irc_chan_create (struct irc_chan **chan_ptr, struct irc_net *net, const struct irc_chan_info *info, struct error_info *err)
 {
     struct irc_chan *chan;
@@ -19,12 +48,33 @@
     // store
     chan->net = net;
     chan->info = *info;
-    chan->state = IRC_CHAN_INIT;
+
+    // init
+    irc_cmd_init(&chan->handlers);
+    
+    // add handlers
+    if ((ERROR_CODE(err) = irc_cmd_add(&chan->handlers, _cmd_handlers, chan)))
+        goto error;
 
     // ok
     *chan_ptr = chan;
 
     return SUCCESS;
+
+error:
+    // cleanup
+    irc_chan_destroy(chan);
+
+    return ERROR_CODE(err);
+}
+
+void irc_chan_destroy (struct irc_chan *chan)
+{
+    // free command handlers
+    irc_cmd_free(&chan->handlers);
+
+    // free chan itself
+    free(chan);
 }
 
 err_t irc_chan_join (struct irc_chan *chan)
@@ -32,17 +82,16 @@
     err_t err;
 
     // XXX: error instead?
-    assert(chan->state == IRC_CHAN_INIT);
+    assert(!chan->state.joining && !chan->state.joined);
 
     // send JOIN message on the appropriate connection
     if ((err = irc_conn_JOIN(chan->net->conn, chan->info.channel)))
-        // XXX: state?
+        // XXX: error state?
         return err;
 
-    // ok, joining
-    chan->state = IRC_CHAN_JOINING;
+    // ok
+    chan->state.joining = true;
 
-    // done
     return SUCCESS;
 }