/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** All rights reserved. ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #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(int socketDescriptor) { PeerWireClient *client = new PeerWireClient(ConnectionManager::instance()->clientId(), this); if (client->setSocketDescriptor(socketDescriptor)) { if (ConnectionManager::instance()->canAddConnection() && !clients.isEmpty()) { connect(client, SIGNAL(infoHashReceived(QByteArray)), this, SLOT(processInfoHash(QByteArray))); connect(client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(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()); foreach (TorrentClient *client, clients) { if (client->state() >= TorrentClient::Searching && client->infoHash() == infoHash) { peer->disconnect(peer, 0, this, 0); client->setupIncomingConnection(peer); return; } } removeClient(); }