[go: up one dir, main page]

File: Connection.h

package info (click to toggle)
sbnc 1.3.9-3
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 8,156 kB
  • ctags: 4,719
  • sloc: ansic: 20,379; cpp: 14,175; sh: 12,783; tcl: 6,025; php: 448; makefile: 430; perl: 46; awk: 25
file content (153 lines) | stat: -rw-r--r-- 5,013 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*******************************************************************************
 * shroudBNC - an object-oriented framework for IRC                            *
 * Copyright (C) 2005-2014 Gunnar Beutner                                      *
 *                                                                             *
 * This program is free software; you can redistribute it and/or               *
 * modify it under the terms of the GNU General Public License                 *
 * as published by the Free Software Foundation; either version 2              *
 * of the License, or (at your option) any later version.                      *
 *                                                                             *
 * This program is distributed in the hope that it will be useful,             *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of              *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               *
 * GNU General Public License for more details.                                *
 *                                                                             *
 * You should have received a copy of the GNU General Public License           *
 * along with this program; if not, write to the Free Software                 *
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. *
 *******************************************************************************/

#ifndef CONNECTION_H
#define CONNECTION_H

class CUser;
class CTrafficStats;
class CFIFOBuffer;

/**
 * connection_role_e
 *
 * The role of a connection.
 */
enum connection_role_e {
	Role_Unknown,
	Role_Server = Role_Unknown,
	Role_Client
};

/**
 * CConnection
 *
 * A base class for connections.
 */
class SBNCAPI CConnection : public CSocketEvents {
#ifndef SWIG
	friend class CCore;
	friend class CUser;
#endif /* SWIG */
protected:
	virtual void ParseLine(const char *Line);

	void Timeout(int TimeLeft);

	void SetRole(connection_role_e Role);

	void InitSocket(void);

	void ProcessBuffer(void);

	void AsyncConnect(void);

	bool m_Shutdown; /**< are we about to close this socket? */
	time_t m_Timeout; /**< timeout for this socket */

	bool m_HasSSL; /**< is this an ssl-enabled connection? */
	SSL *m_SSL; /**< SSL context for this connection */

	CFIFOBuffer *m_SendQ; /**< send queue */
	CFIFOBuffer *m_RecvQ; /**< receive queue */

	bool m_LatchedDestruction; /**< should the connection object be destroyed? */

public:
	virtual void AsyncDnsFinished(hostent *Response);
	virtual void AsyncBindIpDnsFinished(hostent *Response);

private:
	CDnsQuery *m_DnsQuery; /**< the dns query for looking up the hostname */
	CDnsQuery *m_BindDnsQuery; /**< the dns query for looking up the bind address */
	unsigned int m_PortCache; /**< the port or -1 if the cache is invalided */
	char *m_BindIpCache; /**< the bind address */

	CTrafficStats *m_Traffic; /**< the traffic statistics for this connection */

	void *m_BindAddr; /**< the bind address (an in_addr or in_addr6) */
	void *m_HostAddr; /** the remote address (an in_addr or in_addr6) */

	connection_role_e m_Role; /**< the role of this connection */

	SOCKET m_Socket; /**< the socket */
	int m_Family; /**< the socket's address family */

	bool m_Connected; /**< is the object connected? */

	time_t m_InboundTrafficReset; /**< when the inbound traffic was last reset */
	size_t m_InboundTraffic; /**< inbound traffic (in bytes) since last reset */

	void InitConnection(SOCKET Client, bool SSL);

	virtual const char *GetClassName(void) const;
public:
#ifndef SWIG
	CConnection(SOCKET Socket, bool SSL = false, connection_role_e Role = Role_Unknown);
	CConnection(const char *Host, unsigned int Port, const char *BindIp = NULL, bool SSL = false, int Family = AF_UNSPEC);
	virtual ~CConnection(void);
#endif /* SWIG */

	void SetSocket(SOCKET Socket);
	SOCKET GetSocket(void) const;

	virtual void WriteUnformattedLine(const char *Line);
	virtual void WriteLine(const char *Format, ...);
	virtual bool ReadLine(char **Out);

	connection_role_e GetRole(void) const;

	virtual void Kill(const char *Error);

	size_t GetSendqSize(void) const;
	size_t GetRecvqSize(void) const;

	void Shutdown(void);

	void SetTrafficStats(CTrafficStats *Stats);
	const CTrafficStats *GetTrafficStats(void) const;

	void FlushSendQ(void);

	bool IsSSL(void) const;
	const X509 *GetPeerCertificate(void) const;
	virtual int SSLVerify(int PreVerifyOk, X509_STORE_CTX *Context) const;

	sockaddr *GetRemoteAddress(void) const;
	sockaddr *GetLocalAddress(void) const;

	void Destroy(void);

	bool IsConnected(void);

	size_t GetInboundRate(void);

	void SetSendQ(CFIFOBuffer *Buffer);
	void SetRecvQ(CFIFOBuffer *Buffer);
	void SetSSLObject(void *SSLObject);

	// should really be "protected"
	virtual int Read(bool DontProcess = false);
	virtual int Write(void);
	virtual void Error(int ErrorCode);
	virtual bool HasQueuedData(void) const;
	virtual bool ShouldDestroy(void) const;
};

#endif /* CONNECTION_H */