Fix FSF address (Tobias Mueller, #470445)
[platform/upstream/evolution-data-server.git] / camel / camel-tcp-stream.h
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  *  Authors: Jeffrey Stedfast <fejj@ximian.com>
4  *
5  *  Copyright 2001 Ximian, Inc. (www.ximian.com)
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of version 2 of the GNU Lesser General Public
9  * License as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  *
21  */
22
23
24 #ifndef CAMEL_TCP_STREAM_H
25 #define CAMEL_TCP_STREAM_H
26
27 #include <glibconfig.h>
28
29 #ifndef G_OS_WIN32
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 #include <netinet/in.h>
33 #include <netinet/tcp.h>
34 #include <netdb.h>
35 #else
36 #include <winsock2.h>
37 #include <ws2tcpip.h>
38 #endif
39 #include <unistd.h>
40
41 #include <camel/camel-stream.h>
42
43 #define CAMEL_TCP_STREAM_TYPE     (camel_tcp_stream_get_type ())
44 #define CAMEL_TCP_STREAM(obj)     (CAMEL_CHECK_CAST((obj), CAMEL_TCP_STREAM_TYPE, CamelTcpStream))
45 #define CAMEL_TCP_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_TCP_STREAM_TYPE, CamelTcpStreamClass))
46 #define CAMEL_IS_TCP_STREAM(o)    (CAMEL_CHECK_TYPE((o), CAMEL_TCP_STREAM_TYPE))
47
48 G_BEGIN_DECLS
49
50 typedef enum {
51         CAMEL_SOCKOPT_NONBLOCKING,     /* nonblocking io */
52         CAMEL_SOCKOPT_LINGER,          /* linger on close if data present */
53         CAMEL_SOCKOPT_REUSEADDR,       /* allow local address reuse */
54         CAMEL_SOCKOPT_KEEPALIVE,       /* keep connections alive */
55         CAMEL_SOCKOPT_RECVBUFFERSIZE,  /* receive buffer size */
56         CAMEL_SOCKOPT_SENDBUFFERSIZE,  /* send buffer size */
57         
58         CAMEL_SOCKOPT_IPTIMETOLIVE,    /* time to live */
59         CAMEL_SOCKOPT_IPTYPEOFSERVICE, /* type of service and precedence */
60         
61         CAMEL_SOCKOPT_ADDMEMBER,       /* add an IP group membership */
62         CAMEL_SOCKOPT_DROPMEMBER,      /* drop an IP group membership */
63         CAMEL_SOCKOPT_MCASTINTERFACE,  /* multicast interface address */
64         CAMEL_SOCKOPT_MCASTTIMETOLIVE, /* multicast timetolive */
65         CAMEL_SOCKOPT_MCASTLOOPBACK,   /* multicast loopback */
66         
67         CAMEL_SOCKOPT_NODELAY,         /* don't delay send to coalesce packets */
68         CAMEL_SOCKOPT_MAXSEGMENT,      /* maximum segment size */
69         CAMEL_SOCKOPT_BROADCAST,       /* enable broadcast */
70         CAMEL_SOCKOPT_LAST
71 } CamelSockOpt;
72
73 typedef struct linger CamelLinger;
74
75 typedef struct _CamelSockOptData {
76         CamelSockOpt option;
77         union {
78                 guint       ip_ttl;              /* IP time to live */
79                 guint       mcast_ttl;           /* IP multicast time to live */
80                 guint       tos;                 /* IP type of service and precedence */
81                 gboolean    non_blocking;        /* Non-blocking (network) I/O */
82                 gboolean    reuse_addr;          /* Allow local address reuse */
83                 gboolean    keep_alive;          /* Keep connections alive */
84                 gboolean    mcast_loopback;      /* IP multicast loopback */
85                 gboolean    no_delay;            /* Don't delay send to coalesce packets */
86                 gboolean    broadcast;           /* Enable broadcast */
87                 size_t      max_segment;         /* Maximum segment size */
88                 size_t      recv_buffer_size;    /* Receive buffer size */
89                 size_t      send_buffer_size;    /* Send buffer size */
90                 CamelLinger linger;              /* Time to linger on close if data present */
91         } value;
92 } CamelSockOptData;
93
94 struct _CamelTcpStream {
95         CamelStream parent_object;
96         
97 };
98
99 typedef struct {
100         CamelStreamClass parent_class;
101
102         /* Virtual methods */
103         int (*connect)    (CamelTcpStream *stream, struct addrinfo *host);
104         int (*getsockopt) (CamelTcpStream *stream, CamelSockOptData *data);
105         int (*setsockopt) (CamelTcpStream *stream, const CamelSockOptData *data);
106         
107         struct sockaddr * (*get_local_address)  (CamelTcpStream *stream, socklen_t *len);
108         struct sockaddr * (*get_remote_address) (CamelTcpStream *stream, socklen_t *len);
109 } CamelTcpStreamClass;
110
111 /* Standard Camel function */
112 CamelType camel_tcp_stream_get_type (void);
113
114 /* public methods */
115 int         camel_tcp_stream_connect    (CamelTcpStream *stream, struct addrinfo *host);
116 int         camel_tcp_stream_getsockopt (CamelTcpStream *stream, CamelSockOptData *data);
117 int         camel_tcp_stream_setsockopt (CamelTcpStream *stream, const CamelSockOptData *data);
118
119 struct sockaddr *camel_tcp_stream_get_local_address  (CamelTcpStream *stream, socklen_t *len);
120 struct sockaddr *camel_tcp_stream_get_remote_address (CamelTcpStream *stream, socklen_t *len);
121
122 G_END_DECLS
123
124 #endif /* CAMEL_TCP_STREAM_H */