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