diff options
Diffstat (limited to 'examples/network/network-chat/client.cpp')
-rw-r--r-- | examples/network/network-chat/client.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/examples/network/network-chat/client.cpp b/examples/network/network-chat/client.cpp new file mode 100644 index 0000000000..d9f594e8ac --- /dev/null +++ b/examples/network/network-chat/client.cpp @@ -0,0 +1,139 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtNetwork> + +#include "client.h" +#include "connection.h" +#include "peermanager.h" + +Client::Client() +{ + peerManager = new PeerManager(this); + peerManager->setServerPort(server.serverPort()); + peerManager->startBroadcasting(); + + QObject::connect(peerManager, SIGNAL(newConnection(Connection*)), + this, SLOT(newConnection(Connection*))); + QObject::connect(&server, SIGNAL(newConnection(Connection*)), + this, SLOT(newConnection(Connection*))); +} + +void Client::sendMessage(const QString &message) +{ + if (message.isEmpty()) + return; + + QList<Connection *> connections = peers.values(); + foreach (Connection *connection, connections) + connection->sendMessage(message); +} + +QString Client::nickName() const +{ + return QString(peerManager->userName()) + '@' + QHostInfo::localHostName() + + ':' + QString::number(server.serverPort()); +} + +bool Client::hasConnection(const QHostAddress &senderIp, int senderPort) const +{ + if (senderPort == -1) + return peers.contains(senderIp); + + if (!peers.contains(senderIp)) + return false; + + QList<Connection *> connections = peers.values(senderIp); + foreach (Connection *connection, connections) { + if (connection->peerPort() == senderPort) + return true; + } + + return false; +} + +void Client::newConnection(Connection *connection) +{ + connection->setGreetingMessage(peerManager->userName()); + + connect(connection, SIGNAL(error(QAbstractSocket::SocketError)), + this, SLOT(connectionError(QAbstractSocket::SocketError))); + connect(connection, SIGNAL(disconnected()), this, SLOT(disconnected())); + connect(connection, SIGNAL(readyForUse()), this, SLOT(readyForUse())); +} + +void Client::readyForUse() +{ + Connection *connection = qobject_cast<Connection *>(sender()); + if (!connection || hasConnection(connection->peerAddress(), + connection->peerPort())) + return; + + connect(connection, SIGNAL(newMessage(QString,QString)), + this, SIGNAL(newMessage(QString,QString))); + + peers.insert(connection->peerAddress(), connection); + QString nick = connection->name(); + if (!nick.isEmpty()) + emit newParticipant(nick); +} + +void Client::disconnected() +{ + if (Connection *connection = qobject_cast<Connection *>(sender())) + removeConnection(connection); +} + +void Client::connectionError(QAbstractSocket::SocketError /* socketError */) +{ + if (Connection *connection = qobject_cast<Connection *>(sender())) + removeConnection(connection); +} + +void Client::removeConnection(Connection *connection) +{ + if (peers.contains(connection->peerAddress())) { + peers.remove(connection->peerAddress()); + QString nick = connection->name(); + if (!nick.isEmpty()) + emit participantLeft(nick); + } + connection->deleteLater(); +} |