src/irc_conn.c
changeset 27 e6639132bead
parent 24 08a26d0b9afd
child 28 9c1050bc8709
--- 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];