--- a/src/irc_conn.c Tue Mar 10 01:11:12 2009 +0200
+++ b/src/irc_conn.c Tue Mar 10 01:46:09 2009 +0200
@@ -15,9 +15,12 @@
(void) arg;
// update state
+ conn->registering = false;
conn->registered = true;
- log_info("registered");
+ // trigger callback
+ if (conn->callbacks.on_registered)
+ conn->callbacks.on_registered(conn, conn->cb_arg);
}
/*
@@ -78,7 +81,8 @@
}
}
-err_t irc_conn_create (struct irc_conn **conn_ptr, struct sock_stream *sock, const struct irc_conn_config *config, struct error_info *err)
+err_t irc_conn_create (struct irc_conn **conn_ptr, struct sock_stream *sock, const struct irc_conn_callbacks *callbacks,
+ void *cb_arg, struct error_info *err)
{
struct irc_conn *conn;
@@ -86,6 +90,10 @@
if ((conn = calloc(1, sizeof(struct irc_conn))) == NULL)
return SET_ERROR(err, ERR_CALLOC);
+ // init state
+ conn->callbacks = *callbacks;
+ conn->cb_arg = cb_arg;
+
// initialize command handlers
STAILQ_INIT(&conn->handlers);
@@ -97,13 +105,6 @@
if (line_proto_create(&conn->lp, sock, IRC_LINE_MAX * 1.5, &irc_conn_on_line, conn, err))
return ERROR_CODE(err);
- // send the initial messages
- if (
- irc_conn_NICK(conn, config->nickname)
- || irc_conn_USER(conn, config->username, config->realname)
- )
- return ERROR_CODE(err);
-
// ok
*conn_ptr = conn;
@@ -129,6 +130,29 @@
return SUCCESS;
}
+err_t irc_conn_register (struct irc_conn *conn, const struct irc_conn_register_info *info)
+{
+ err_t err;
+
+ // assert state
+ if (conn->registering || conn->registered)
+ // XXX: stupid error code
+ return ERR_IRC_CONN_REGISTER_STATE;
+
+ // send the initial messages
+ if (
+ (err = irc_conn_NICK(conn, info->nickname))
+ || (err = irc_conn_USER(conn, info->username, info->realname))
+ )
+ return err;
+
+ // set state
+ conn->registering = true;
+
+ // ok
+ return SUCCESS;
+}
+
err_t irc_conn_send (struct irc_conn *conn, const struct irc_line *line)
{
char line_buf[IRC_LINE_MAX + 2];