Start working on refactoring the network_info code.
[jelmer/ctrlproxy.git] / src / network.h
1 /*
2         ctrlproxy: A modular IRC proxy
3         (c) 2002-2005 Jelmer Vernooij <jelmer@nl.linux.org>
4
5         This program is free software; you can redistribute it and/or modify
6         it under the terms of the GNU General Public License as published by
7         the Free Software Foundation; either version 2 of the License, or
8         (at your option) any later version.
9
10         This program is distributed in the hope that it will be useful,
11         but WITHOUT ANY WARRANTY; without even the implied warranty of
12         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13         GNU General Public License for more details.
14
15         You should have received a copy of the GNU General Public License
16         along with this program; if not, write to the Free Software
17         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #ifndef __CTRLPROXY_NETWORK_H__
21 #define __CTRLPROXY_NETWORK_H__
22
23 /**
24  * @file
25  * @brief Network functions
26  */
27
28 #ifndef G_MODULE_EXPORT
29 #define G_MODULE_EXPORT 
30 #endif
31
32 #include "state.h"
33 #include "isupport.h"
34 #include <sys/socket.h>
35
36 struct global;
37 struct network;
38 struct client;
39 struct line;
40 struct linestack_context;
41
42 enum network_connection_state { 
43                 NETWORK_CONNECTION_STATE_NOT_CONNECTED = 0, 
44                 NETWORK_CONNECTION_STATE_RECONNECT_PENDING,
45                 NETWORK_CONNECTION_STATE_LOGIN_SENT, 
46                 NETWORK_CONNECTION_STATE_MOTD_RECVD,
47 };
48
49 /**
50  * Information about the connection to a network.
51  */
52 struct network_connection {
53         enum network_connection_state state;
54
55         time_t last_line_sent;
56         GQueue *pending_lines;
57
58         GIOChannel *outgoing;
59         gint outgoing_id;
60         gint incoming_id;
61         GIConv outgoing_iconv;
62         GIConv incoming_iconv;
63
64         union { 
65                 struct {
66                         struct tcp_server_config *current_server;
67                         struct sockaddr *remote_name;
68                         struct sockaddr *local_name;
69                         socklen_t namelen;
70                         char *last_disconnect_reason;
71                 } tcp;
72                 
73                 struct {
74                         void *private_data;
75                         struct virtual_network_ops {
76                                 char *name;
77                                 gboolean (*init) (struct network *);
78                                 gboolean (*to_server) (struct network *, struct client *c, const struct line *);
79                                 gboolean (*fini) (struct network *);
80                         } *ops;
81                 } virtual;
82         } data;
83 };
84
85 /**
86  * An IRC network
87  */
88 struct network {
89         char *name;
90         struct global *global;
91         struct network_config *config;
92
93         GList *clients;
94         guint reconnect_id;
95
96         gpointer ssl_credentials;
97
98         struct network_state *state;
99         struct network_info info;
100         struct network_connection connection;
101         struct linestack_context *linestack;
102 };
103
104 /* server.c */
105 G_MODULE_EXPORT gboolean network_set_charset(struct network *n, const char *name);
106 G_MODULE_EXPORT struct network *find_network_by_hostname(struct global *global, const char *host, guint16 port, gboolean create);
107 G_MODULE_EXPORT gboolean load_networks(struct global *, struct ctrlproxy_config *cfg);
108 G_MODULE_EXPORT gboolean autoconnect_networks(struct global *);
109 G_MODULE_EXPORT struct network *load_network(struct global *, struct network_config *);
110 G_MODULE_EXPORT void unload_network(struct network *);
111 G_MODULE_EXPORT gboolean connect_network(struct network *);
112 G_MODULE_EXPORT void network_select_next_server(struct network *n);
113 G_MODULE_EXPORT gboolean disconnect_network(struct network *s);
114 G_MODULE_EXPORT void clients_send(GList *clients, struct line *, const struct client *exception);
115 G_MODULE_EXPORT void clients_send_args_ex(GList *clients, const char *hostmask, ...);
116 G_MODULE_EXPORT gboolean network_send_line(struct network *s, struct client *c, const struct line *);
117 G_MODULE_EXPORT gboolean network_send_args(struct network *s, ...);
118 G_MODULE_EXPORT void register_virtual_network(struct virtual_network_ops *);
119 G_MODULE_EXPORT struct network *find_network(struct global *, const char *);
120 G_MODULE_EXPORT gboolean virtual_network_recv_line(struct network *l, struct line *);
121 G_MODULE_EXPORT gboolean virtual_network_recv_args(struct network *l, const char *origin, ...); 
122 typedef void (*new_network_notify_fn) (struct network *, void *);
123 G_MODULE_EXPORT void register_new_network_notify(struct global *, new_network_notify_fn, void *userdata);
124 G_MODULE_EXPORT struct linestack_context *new_linestack(struct network *network);
125 char *network_generate_feature_string(struct network *n);
126
127 #endif /* __CTRLPROXY_NETWORK_H__ */