libktorrent  2.2.0
peermanager.h
1 /***************************************************************************
2  * Copyright (C) 2005 by Joris Guisson *
3  * joris.guisson@gmail.com *
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 *
17  * Free Software Foundation, Inc., *
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19  ***************************************************************************/
20 #ifndef BTPEERMANAGER_H
21 #define BTPEERMANAGER_H
22 
23 
24 #include <interfaces/peersource.h>
25 #include <ktorrent_export.h>
26 #include <peer/peer.h>
27 #include <peer/superseeder.h>
28 #include <peer/peerconnector.h>
29 #include <mse/encryptedpacketsocket.h>
30 
31 namespace KNetwork
32 {
33  class KResolverResults;
34 }
35 
36 namespace bt
37 {
38  class PeerID;
39  class Piece;
40  class Torrent;
41  class Authenticate;
42  class ChunkCounter;
43  class PieceDownloader;
44  class ConnectionLimit;
45 
46  using KNetwork::KResolverResults;
47 
48  const Uint32 MAX_SIMULTANIOUS_AUTHS = 20;
49 
51  class KTORRENT_EXPORT PieceHandler
52  {
53  public:
54  virtual ~PieceHandler() {}
55 
56  virtual void pieceReceived(const Piece & p) = 0;
57  };
58 
66  class KTORRENT_EXPORT PeerManager : public QObject
67  {
68  Q_OBJECT
69  public:
75  ~PeerManager() override;
76 
79 
84  void update();
85 
89  void pause();
90 
94  void unpause();
95 
100  QList<Peer::Ptr> getPeers() const;
101 
107  Peer::Ptr findPeer(Uint32 peer_id);
108 
114  Peer::Ptr findPeer(PieceDownloader* pd);
115 
116  void setWantedChunks(const BitSet & bs);
117 
122 
127  void start(bool superseed);
128 
132  void stop();
133 
138 
140  Uint32 getNumConnectedPeers() const;
141 
143  Uint32 getNumConnectedSeeders() const;
144 
146  Uint32 getNumConnectedLeechers() const;
147 
149  Uint32 getNumPending() const;
150 
152  bool isStarted() const;
153 
155  const Torrent & getTorrent() const;
156 
158  Uint32 uploadRate() const;
159 
166  void newConnection(mse::EncryptedPacketSocket::Ptr sock, const PeerID & peer_id, Uint32 support);
167 
174  void addPotentialPeer(const net::Address & addr, bool local);
175 
181  void killSeeders();
182 
188 
191 
194 
196  bool connectedTo(const PeerID & peer_id);
197 
205  void peerAuthenticated(Authenticate* auth, PeerConnector::WPtr pcon, bool ok, ConnectionLimit::Token::Ptr token);
206 
210  void savePeerList(const QString & file);
211 
215  void loadPeerList(const QString & file);
216 
218  {
219  public:
220  virtual ~PeerVisitor() {}
221 
223  virtual void visit(const Peer::Ptr p) = 0;
224  };
225 
227  void visit(PeerVisitor & visitor);
228 
230  bool isPexEnabled() const;
231 
233  void setPexEnabled(bool on);
234 
236  void setGroupIDs(Uint32 up, Uint32 down);
237 
239  void have(Peer* p, Uint32 index);
240 
242  void bitSetReceived(Peer* p, const BitSet & bs);
243 
245  void rerunChoker();
246 
248  bool chokerNeedsToRun() const;
249 
251  void pex(const QByteArray & arr);
252 
254  void portPacketReceived(const QString & ip, Uint16 port);
255 
257  void pieceReceived(const Piece & p);
258 
261 
263  void setSuperSeeding(bool on, const BitSet & chunks);
264 
266  void sendHave(Uint32 index);
267 
269  void setPartialSeed(bool partial_seed);
270 
272  bool isPartialSeed() const;
273 
274  public Q_SLOTS:
280 
281  Q_SIGNALS:
282  void newPeer(Peer* p);
283  void peerKilled(Peer* p);
284 
285  private:
286  class Private;
287  Private* d;
288  };
289 
290 }
291 
292 #endif
bt::PeerManager::setGroupIDs
void setGroupIDs(Uint32 up, Uint32 down)
Set the group IDs of each peer.
bt::PeerManager::killSeeders
void killSeeders()
bt::BitSet
Simple implementation of a BitSet.
Definition: bitset.h:55
bt::PeerManager::getTorrent
const Torrent & getTorrent() const
Get the Torrent.
bt::PeerManager::getNumConnectedSeeders
Uint32 getNumConnectedSeeders() const
Get the number of connected seeders.
bt::PeerManager::unpause
void unpause()
bt::PeerManager::addPotentialPeer
void addPotentialPeer(const net::Address &addr, bool local)
bt::PeerManager::peerAuthenticated
void peerAuthenticated(Authenticate *auth, PeerConnector::WPtr pcon, bool ok, ConnectionLimit::Token::Ptr token)
net::Address
Definition: address.h:59
bt::PeerManager::findPeer
Peer::Ptr findPeer(Uint32 peer_id)
bt::PeerManager::setSuperSeeding
void setSuperSeeding(bool on, const BitSet &chunks)
Enable or disable super seeding.
bt::Piece
Definition: piece.h:50
bt::PeerManager::rerunChoker
void rerunChoker()
Rerun the choker.
bt::ChunkCounter
Definition: chunkcounter.h:54
bt::PeerManager::getAvailableChunksBitSet
const BitSet & getAvailableChunksBitSet() const
Get a BitSet of all available chunks.
bt::PieceDownloader
Definition: piecedownloader.h:57
bt::PeerManager::killUninterested
void killUninterested()
bt::PeerManager::getNumPending
Uint32 getNumPending() const
Get the number of pending peers we are attempting to connect to.
bt::PeerManager::chokerNeedsToRun
bool chokerNeedsToRun() const
Does the choker need to run again.
bt::PeerManager::sendHave
void sendHave(Uint32 index)
Send a have message to all peers.
bt::PeerManager
Manages all the Peers.
Definition: peermanager.h:67
bt::PeerManager::update
void update()
bt::PeerManager::newConnection
void newConnection(mse::EncryptedPacketSocket::Ptr sock, const PeerID &peer_id, Uint32 support)
bt::Peer
Manages the connection with a peer.
Definition: peer.h:59
bt::PeerSource
Definition: peersource.h:60
bt::PeerManager::PeerManager
PeerManager(Torrent &tor)
bt::PeerManager::isStarted
bool isStarted() const
Is the peer manager started.
bt::PeerManager::bitSetReceived
void bitSetReceived(Peer *p, const BitSet &bs)
Bitset received by a peer.
bt::PeerManager::stop
void stop()
bt::PeerManager::pex
void pex(const QByteArray &arr)
A PEX message was received.
bt::PeerManager::connectedTo
bool connectedTo(const PeerID &peer_id)
Are we connected to a Peer given it's PeerID ?
bt::PeerManager::PeerVisitor::visit
virtual void visit(const Peer::Ptr p)=0
Called for each Peer.
bt::PeerManager::closeAllConnections
void closeAllConnections()
bt::Torrent
Loads a .torrent file.
Definition: torrent.h:80
bt::PeerManager::isPartialSeed
bool isPartialSeed() const
Are we a partial seed.
bt::PeerManager::getNumConnectedLeechers
Uint32 getNumConnectedLeechers() const
Get the number of connected leechers.
bt::PeerManager::savePeerList
void savePeerList(const QString &file)
bt::PeerManager::connectionLimits
static ConnectionLimit & connectionLimits()
Get the connection limits.
bt::PeerManager::pieceReceived
void pieceReceived(const Piece &p)
A Piece was received.
bt::PeerManager::portPacketReceived
void portPacketReceived(const QString &ip, Uint16 port)
A port packet was received.
bt::PeerManager::start
void start(bool superseed)
bt::PeerManager::killStalePeers
void killStalePeers()
bt::ConnectionLimit
Definition: connectionlimit.h:54
bt::PeerManager::setPexEnabled
void setPexEnabled(bool on)
Enable or disable PEX.
bt::PeerManager::visit
void visit(PeerVisitor &visitor)
Visit all peers.
bt::PeerManager::isPexEnabled
bool isPexEnabled() const
Is PEX eanbled.
bt::PieceHandler
Base class for handling pieces.
Definition: peermanager.h:52
bt::PeerManager::getNumConnectedPeers
Uint32 getNumConnectedPeers() const
Get the number of connected peers.
bt::PeerManager::pause
void pause()
bt::PeerManager::peerSourceReady
void peerSourceReady(PeerSource *ps)
bt::PeerManager::setPartialSeed
void setPartialSeed(bool partial_seed)
Set if we are a partial seed or not.
bt::PeerManager::uploadRate
Uint32 uploadRate() const
Get the combined upload rate of all peers in bytes per sec.
bt::PeerManager::setPieceHandler
void setPieceHandler(PieceHandler *ph)
Set the piece handler.
bt::PeerManager::PeerVisitor
Definition: peermanager.h:218
bt::PeerManager::have
void have(Peer *p, Uint32 index)
Have message received by a peer.
bt::PeerID
Definition: peerid.h:51
bt::PeerManager::findPeer
Peer::Ptr findPeer(PieceDownloader *pd)
bt::Authenticate
Authenicate a peer.
Definition: authenticate.h:47
bt::PeerManager::getChunkCounter
ChunkCounter & getChunkCounter()
Get the chunk counter.
bt::PeerManager::getPeers
QList< Peer::Ptr > getPeers() const
bt::PeerManager::loadPeerList
void loadPeerList(const QString &file)