// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "connectionmanager.h" #include "peerwireclient.h" #include "ratecontroller.h" #include "torrentclient.h" #include "torrentserver.h" Q_GLOBAL_STATIC(TorrentServer, torrentServer) TorrentServer *TorrentServer::instance() { return torrentServer(); } void TorrentServer::addClient(TorrentClient *client) { clients << client; } void TorrentServer::removeClient(TorrentClient *client) { clients.removeAll(client); } void TorrentServer::incomingConnection(qintptr socketDescriptor) { PeerWireClient *client = new PeerWireClient(ConnectionManager::instance()->clientId(), this); if (client->setSocketDescriptor(socketDescriptor)) { if (ConnectionManager::instance()->canAddConnection() && !clients.isEmpty()) { connect(client, &PeerWireClient::infoHashReceived, this, &TorrentServer::processInfoHash); connect(client, &PeerWireClient::errorOccurred, this, QOverload<>::of(&TorrentServer::removeClient)); RateController::instance()->addSocket(client); ConnectionManager::instance()->addConnection(client); return; } } client->abort(); delete client; } void TorrentServer::removeClient() { PeerWireClient *peer = qobject_cast(sender()); RateController::instance()->removeSocket(peer); ConnectionManager::instance()->removeConnection(peer); peer->deleteLater(); } void TorrentServer::processInfoHash(const QByteArray &infoHash) { PeerWireClient *peer = qobject_cast(sender()); for (TorrentClient *client : std::as_const(clients)) { if (client->state() >= TorrentClient::Searching && client->infoHash() == infoHash) { peer->disconnect(peer, nullptr, this, nullptr); client->setupIncomingConnection(peer); return; } } removeClient(); }