1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Authors: Jeffrey Stedfast <fejj@ximian.com>
5 * Copyright 2001 Ximian, Inc. (www.ximian.com)
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.
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.
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.
24 #ifndef CAMEL_TCP_STREAM_H
25 #define CAMEL_TCP_STREAM_H
27 #include <glibconfig.h>
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 #include <netinet/in.h>
33 #include <netinet/tcp.h>
41 #include <camel/camel-stream.h>
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))
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 */
58 CAMEL_SOCKOPT_IPTIMETOLIVE, /* time to live */
59 CAMEL_SOCKOPT_IPTYPEOFSERVICE, /* type of service and precedence */
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 */
67 CAMEL_SOCKOPT_NODELAY, /* don't delay send to coalesce packets */
68 CAMEL_SOCKOPT_MAXSEGMENT, /* maximum segment size */
69 CAMEL_SOCKOPT_BROADCAST, /* enable broadcast */
73 typedef struct linger CamelLinger;
75 typedef struct _CamelSockOptData {
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 */
94 struct _CamelTcpStream {
95 CamelStream parent_object;
100 CamelStreamClass parent_class;
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);
107 struct sockaddr * (*get_local_address) (CamelTcpStream *stream, socklen_t *len);
108 struct sockaddr * (*get_remote_address) (CamelTcpStream *stream, socklen_t *len);
109 } CamelTcpStreamClass;
111 /* Standard Camel function */
112 CamelType camel_tcp_stream_get_type (void);
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);
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);
124 #endif /* CAMEL_TCP_STREAM_H */