src/irc_conn.c
changeset 45 71e65564afd2
parent 39 a4891d71aca9
child 47 7d4094eb3117
equal deleted inserted replaced
44:6bd70113e1ed 45:71e65564afd2
     5 
     5 
     6 #include <stdlib.h>
     6 #include <stdlib.h>
     7 #include <string.h>
     7 #include <string.h>
     8 
     8 
     9 /**
     9 /**
    10  * @group Forward-declerations
    10  * Handle an async error on this IRC connection that we could not recover from any other way, the protocol is now dead,
    11  * @{
    11  * and should be considered as destroyed after this returns.
    12  */
    12  *
    13 
    13  * For conveniance, this returns the ERROR_CODE
    14 /**
    14  */
    15  * Handle an event-based error on this IRC connection.
    15 static err_t irc_conn_set_error (struct irc_conn *conn, struct error_info *err)
    16  */
    16 {
    17 static void irc_conn_handle_error (struct irc_conn *conn, struct error_info *err);
    17     // notify user callback
       
    18     conn->callbacks.on_error(conn, err, conn->cb_arg);
       
    19 
       
    20     return ERROR_CODE(err);
       
    21 }
       
    22 
    18 
    23 
    19 /**
    24 /**
    20  * Update irc_conn.nickname
    25  * Update irc_conn.nickname
    21  */
    26  */
    22 static err_t irc_conn_set_nickname (struct irc_conn *conn, const char *nickname)
    27 static err_t irc_conn_set_nickname (struct irc_conn *conn, const char *nickname)
    26     // strdup
    31     // strdup
    27     if ((conn->nickname = strdup(nickname)) == NULL) {
    32     if ((conn->nickname = strdup(nickname)) == NULL) {
    28         SET_ERROR(&err, ERR_STRDUP);
    33         SET_ERROR(&err, ERR_STRDUP);
    29 
    34 
    30         // notify
    35         // notify
    31         irc_conn_handle_error(conn, &err);
    36         return irc_conn_set_error(conn, &err);
    32 
       
    33         return ERROR_CODE(&err);
       
    34     }
    37     }
    35 
    38 
    36     // ok
    39     // ok
    37     return SUCCESS;
    40     return SUCCESS;
    38 }
    41 }
    39 
       
    40 // @}
       
    41 
    42 
    42 /**
    43 /**
    43  * 001 <nick> :Welcome to the Internet Relay Network <nick>!<user>@<host>
    44  * 001 <nick> :Welcome to the Internet Relay Network <nick>!<user>@<host>
    44  */
    45  */
    45 static void on_RPL_WELCOME (const struct irc_line *line, void *arg)
    46 static void on_RPL_WELCOME (const struct irc_line *line, void *arg)
   136     struct irc_conn *conn = arg;
   137     struct irc_conn *conn = arg;
   137 
   138 
   138     // log
   139     // log
   139     log_err_info(err, "line_proto error");
   140     log_err_info(err, "line_proto error");
   140     
   141     
   141     // 'handle'
   142     // trash ourselves
   142     irc_conn_handle_error(conn, err);
   143     irc_conn_set_error(conn, err);
   143 }
   144 }
   144 
   145 
   145 static struct line_proto_callbacks _lp_callbacks = {
   146 static struct line_proto_callbacks _lp_callbacks = {
   146     .on_line        = &irc_conn_on_line,
   147     .on_line        = &irc_conn_on_line,
   147     .on_error       = &irc_conn_on_error,
   148     .on_error       = &irc_conn_on_error,
   148 };
   149 };
   149 
       
   150 static void irc_conn_handle_error (struct irc_conn *conn, struct error_info *err)
       
   151 {
       
   152     // XXX: notify user callback
       
   153 }
       
   154 
   150 
   155 err_t irc_conn_create (struct irc_conn **conn_ptr, struct sock_stream *sock, const struct irc_conn_callbacks *callbacks, 
   151 err_t irc_conn_create (struct irc_conn **conn_ptr, struct sock_stream *sock, const struct irc_conn_callbacks *callbacks, 
   156         void *cb_arg, struct error_info *err)
   152         void *cb_arg, struct error_info *err)
   157 {
   153 {
   158     struct irc_conn *conn;
   154     struct irc_conn *conn;