--- 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;
}