s->state = network_state_init(nc->nick, nc->username,
get_my_hostname());
- network_state_set_log_fn(s->state, s->log, s->userdata);
- s->state->userdata = s;
- s->state->log = state_log_helper;
+ network_state_set_log_fn(s->state, state_log_helper, s);
s->linestack = new_linestack(s);
g_assert(s->linestack != NULL);
const struct irc_line *line)
{
struct irc_network *server = transport->userdata;
- return server->process_from_server(server, line);
+ return server->callbacks->process_from_server(server, line);
}
static void on_transport_log(struct irc_transport *transport, const struct irc_line *l, const GError *error)
if (l->origin == NULL)
l->origin = g_strdup(get_my_hostname());
- return s->process_from_server(s, l);
+ return s->callbacks->process_from_server(s, l);
}
/**
return (s->connection.state == NETWORK_CONNECTION_STATE_RECONNECT_PENDING);
}
-struct irc_network *irc_network_new(gboolean (*process_from_server) (struct irc_network *, const struct irc_line *), void *private_data)
+struct irc_network *irc_network_new(const struct irc_network_callbacks *callbacks, void *private_data)
{
struct irc_network *s;
s = g_new0(struct irc_network, 1);
- s->process_from_server = process_from_server;
+ s->callbacks = callbacks;
s->references = 1;
s->private_data = private_data;
s->reconnect_interval = ((struct network_config *)private_data)->reconnect_interval == -1?DEFAULT_RECONNECT_INTERVAL:((struct network_config *)private_data)->reconnect_interval;
char *ret;
va_list ap;
- if (s->log == NULL)
+ if (s->callbacks->log == NULL)
return;
g_assert(s);
ret = g_strdup_vprintf(fmt, ap);
va_end(ap);
- s->log(l, s->userdata, ret);
+ s->callbacks->log(l, s, ret);
g_free(ret);
}
-void network_set_log_fn(struct irc_network *s,
- network_log_fn fn,
- void *userdata)
-{
- s->log = fn;
- s->userdata = userdata;
-
- if (s->state != NULL)
- network_state_set_log_fn(s->state, fn, userdata);
-}
} data;
};
-typedef void (*network_log_fn) (enum log_level, void *, const char *);
+typedef void (*network_log_fn) (enum log_level, const struct irc_network *, const char *);
+
+struct irc_network_callbacks {
+ network_log_fn log;
+ gboolean (*process_from_server) (struct irc_network *, const struct irc_line *);
+};
/**
* An IRC network
/** Linestack context. */
struct linestack_context *linestack;
- void *userdata;
- network_log_fn log;
-
int reconnect_interval;
- gboolean (*process_from_server) (struct irc_network *, const struct irc_line *);
+ const struct irc_network_callbacks *callbacks;
};
/* server.c */
G_MODULE_EXPORT gboolean network_set_charset(struct irc_network *n, const char *name);
G_MODULE_EXPORT gboolean autoconnect_networks(GList *);
-G_MODULE_EXPORT struct irc_network *irc_network_new(gboolean (*process_from_server) (struct irc_network *, const struct irc_line *), void *private_data);
+G_MODULE_EXPORT struct irc_network *irc_network_new(const struct irc_network_callbacks *callbacks, void *private_data);
G_MODULE_EXPORT gboolean connect_network(struct irc_network *);
G_MODULE_EXPORT void network_select_next_server(struct irc_network *n);
G_MODULE_EXPORT gboolean disconnect_network(struct irc_network *s);
G_MODULE_EXPORT G_GNUC_MALLOC char *network_generate_feature_string(struct irc_network *n);
G_MODULE_EXPORT struct irc_network *network_ref(struct irc_network *);
G_MODULE_EXPORT void network_unref(struct irc_network *);
-G_MODULE_EXPORT void network_set_log_fn(struct irc_network *s,
- network_log_fn, void *userdata);
#endif /* __CTRLPROXY_NETWORK_H__ */
nc = network_config_init(admin_get_global(h)->config);
g_free(nc->name); nc->name = g_strdup(name);
n = load_network(admin_get_global(h), nc);
- network_set_log_fn(n, (network_log_fn)handle_network_log, n);
admin_out(h, "Network `%s' added. Use ADDSERVER to add a server to this network.", name);
}
/* network.c */
G_MODULE_EXPORT struct irc_network *load_network(struct global *global, struct network_config *sc);
-G_MODULE_EXPORT gboolean load_networks(struct global *, struct ctrlproxy_config *cfg, network_log_fn);
+G_MODULE_EXPORT gboolean load_networks(struct global *, struct ctrlproxy_config *cfg);
G_MODULE_EXPORT void unload_network(struct irc_network *);
typedef void (*new_network_notify_fn) (struct irc_network *, void *);
G_MODULE_EXPORT struct irc_network *find_network_by_hostname(struct global *global, const char *host, guint16 port, gboolean create);
nc->type_settings.tcp.servers = g_list_append(nc->type_settings.tcp.servers, s);
n = load_network(global, nc);
- network_set_log_fn(n, (network_log_fn)handle_network_log, n);
return n;
}
global->new_network_notifiers = g_list_append(global->new_network_notifiers, p);
}
+struct irc_network_callbacks default_callbacks = {
+ .process_from_server = process_from_server,
+ .log = handle_network_log,
+};
+
/**
* Load a network from a configuration file specification.
*
return net;
}
- net = irc_network_new(process_from_server, sc);
+ net = irc_network_new(&default_callbacks, sc);
net->global = global;
* @param fn Function to use for logging.
* @return TRUE
*/
-gboolean load_networks(struct global *global, struct ctrlproxy_config *cfg,
- network_log_fn fn)
+gboolean load_networks(struct global *global, struct ctrlproxy_config *cfg)
{
GList *gl;
g_assert(cfg);
struct network_config *nc = gl->data;
struct irc_network *n;
n = load_network(global, nc);
- if (n != NULL)
- network_set_log_fn(n, fn, n);
}
return TRUE;
global = init_global();
global->config = cfg;
- load_networks(global, global->config, (network_log_fn)handle_network_log);
+ load_networks(global, global->config);
nickserv_load(global);
/* saturate the buffer */
for (i = 0; i < 10000; i++) {
char buf[20];
- snprintf(buf, sizeof(buf), "bar: %d", i);
+ g_snprintf(buf, sizeof(buf), "bar: %d", i);
fail_unless(transport_send_args(t, "PRIVMSG", "foo", buf, NULL));
}
for (i = 0; i < 10000; i++) {
char *str;
char buf[120];
- snprintf(buf, sizeof(buf), "PRIVMSG foo :bar: %d\r\n", i);
+ g_snprintf(buf, sizeof(buf), "PRIVMSG foo :bar: %d\r\n", i);
if (!g_queue_is_empty(t->pending_lines))
g_main_iteration(FALSE);
g_io_channel_read_line(ch2, &str, NULL, NULL, NULL);