1
// libTorrent - BitTorrent library
2
// Copyright (C) 2005-2007, Jari Sundell
4
// This program is free software; you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation; either version 2 of the License, or
7
// (at your option) any later version.
9
// This program is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
// GNU General Public License for more details.
14
// You should have received a copy of the GNU General Public License
15
// along with this program; if not, write to the Free Software
16
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
// In addition, as a special exception, the copyright holders give
19
// permission to link the code of portions of this program with the
20
// OpenSSL library under certain conditions as described in each
21
// individual source file, and distribute linked combinations
24
// You must obey the GNU General Public License in all respects for
25
// all of the code used other than OpenSSL. If you modify file(s)
26
// with this exception, you may extend this exception to your version
27
// of the file(s), but you are not obligated to do so. If you do not
28
// wish to do so, delete this exception statement from your version.
29
// If you delete this exception statement from all source files in the
30
// program, then also delete it here.
32
// Contact: Jari Sundell <jaris@ifi.uio.no>
35
// 3185 Skoppum, NORWAY
37
#ifndef LIBTORRENT_PEER_LIST_H
38
#define LIBTORRENT_PEER_LIST_H
41
#include <torrent/common.h>
45
bool socket_address_less(const sockaddr* s1, const sockaddr* s2);
47
// Unique key for the address, excluding port numbers etc.
48
class LIBTORRENT_EXPORT socket_address_key {
50
socket_address_key(const sockaddr* sa) : m_sockaddr(sa) {}
52
inline static bool is_comparable(const sockaddr* sa);
54
bool operator < (const socket_address_key& sa) const { return socket_address_less(m_sockaddr, sa.m_sockaddr); }
57
const sockaddr* m_sockaddr;
60
class LIBTORRENT_EXPORT PeerList : private std::multimap<socket_address_key, PeerInfo*> {
62
friend class Handshake;
63
friend class HandshakeManager;
64
friend class ConnectionList;
66
typedef std::multimap<socket_address_key, PeerInfo*> base_type;
67
typedef std::pair<base_type::iterator, base_type::iterator> range_type;
69
using base_type::value_type;
70
using base_type::reference;
71
using base_type::difference_type;
73
using base_type::iterator;
74
using base_type::reverse_iterator;
75
using base_type::const_iterator;
76
using base_type::const_reverse_iterator;
78
using base_type::size;
79
using base_type::empty;
81
static const int address_available = (1 << 0);
83
static const int connect_incoming = (1 << 0);
84
static const int connect_keep_handshakes = (1 << 1);
85
static const int connect_filter_recent = (1 << 2);
87
// Make sure any change here match ConnectionList's flags.
88
static const int disconnect_available = (1 << 0);
89
static const int disconnect_quick = (1 << 1);
90
static const int disconnect_unwanted = (1 << 2);
91
static const int disconnect_set_time = (1 << 3);
93
static const int cull_old = (1 << 0);
94
static const int cull_keep_interesting = (1 << 1);
99
PeerInfo* insert_address(const sockaddr* address, int flags);
101
// This will be used internally only for the moment.
102
uint32_t insert_available(const void* al) LIBTORRENT_NO_EXPORT;
104
AvailableList* available_list() { return m_availableList; }
105
uint32_t available_list_size() const;
107
uint32_t cull_peers(int flags);
109
const_iterator begin() const { return base_type::begin(); }
110
const_iterator end() const { return base_type::end(); }
111
const_reverse_iterator rbegin() const { return base_type::rbegin(); }
112
const_reverse_iterator rend() const { return base_type::rend(); }
115
// Insert, or find a PeerInfo with socket address 'sa'. Returns end
116
// if no more connections are allowed from that host.
117
PeerInfo* connected(const sockaddr* sa, int flags) LIBTORRENT_NO_EXPORT;
119
void disconnected(PeerInfo* p, int flags) LIBTORRENT_NO_EXPORT;
120
iterator disconnected(iterator itr, int flags) LIBTORRENT_NO_EXPORT;
123
PeerList(const PeerList&);
124
void operator = (const PeerList&);
126
AvailableList* m_availableList;