Use callbacks for networks.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 30 Apr 2008 16:14:02 +0000 (18:14 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Wed, 30 Apr 2008 16:14:02 +0000 (18:14 +0200)
lib/network.c
lib/network.h
src/admin.c
src/internals.h
src/network.c
src/user.c
testsuite/test-transport.c

index 051c199447f11705e65ca61f817d86f75c96a2d8..be95db6746ef3ac4c74d027e2aff2ebbcaa10470 100644 (file)
@@ -47,9 +47,7 @@ static void server_send_login (struct irc_network *s)
 
        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);
 
@@ -132,7 +130,7 @@ static gboolean on_transport_recv(struct irc_transport *transport,
                                                          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)
@@ -313,7 +311,7 @@ gboolean virtual_network_recv_line(struct irc_network *s, struct irc_line *l)
        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);
 }
 
 /**
@@ -874,12 +872,12 @@ static gboolean delayed_connect_server(struct irc_network *s)
        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;
@@ -1076,7 +1074,7 @@ void network_log(enum log_level l, const struct irc_network *s,
        char *ret;
        va_list ap;
 
-       if (s->log == NULL)
+       if (s->callbacks->log == NULL)
                return;
 
        g_assert(s);
@@ -1086,18 +1084,8 @@ void network_log(enum log_level l, const struct irc_network *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);
-}
index fc2e7261de8a90c982f202800b0b8c68f5c8a643..495ad27e4328d15d8e9b522370e037565008d769 100644 (file)
@@ -95,7 +95,12 @@ struct network_connection {
        } 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
@@ -126,18 +131,15 @@ struct 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);
@@ -152,7 +154,5 @@ G_MODULE_EXPORT G_GNUC_MALLOC struct linestack_context *new_linestack(struct irc
 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__ */
index cbff59cc288e296656b2c9751e44bb9e16619e39..8bd12c9c64780eb70692abd73119fdd4caeff75e 100644 (file)
@@ -349,7 +349,6 @@ static void add_network_helper(admin_handle h, const char *name)
        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);
 }
index e9b31141789c4dc4872c7756f78e1dd2f88be53d..630f92b414887908407eae8af7d195b4f983236c 100644 (file)
@@ -65,7 +65,7 @@ char **get_motd_lines(const char *motd_file);
 
 /* 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);
index e1eb2c54dc4d3374d8d5a397cd2b20032ec4d287..9125d9c2de53008c71beb57f248521c762827747 100644 (file)
@@ -281,7 +281,6 @@ struct irc_network *find_network_by_hostname(struct global *global,
                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;
        }
 
@@ -310,6 +309,11 @@ void register_new_network_notify(struct global *global, new_network_notify_fn fn
        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.
  *
@@ -329,7 +333,7 @@ struct irc_network *load_network(struct global *global, struct network_config *s
                        return net;
        }
        
-       net = irc_network_new(process_from_server, sc);
+       net = irc_network_new(&default_callbacks, sc);
 
        net->global = global;
 
@@ -360,8 +364,7 @@ struct irc_network *load_network(struct global *global, struct network_config *s
  * @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);
@@ -370,8 +373,6 @@ gboolean load_networks(struct global *global, struct ctrlproxy_config *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;
index 951e83cc75b1748d07569ca2e9d3a7f4935c2341..cf2482ff12d5ca0e5050db1ae99935f9a7718111 100644 (file)
@@ -76,7 +76,7 @@ struct global *load_global(const char *config_dir)
        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);
 
index 419c4671d7fd0471df6dc34b5fe11c68cbf3cc82..1f433ce6f0ededa34b70ca464b9a45a972541b7d 100644 (file)
@@ -44,13 +44,13 @@ START_TEST(test_send)
        /* 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);