diff options
Diffstat (limited to 'examples/network/multistreamclient')
-rw-r--r-- | examples/network/multistreamclient/chatconsumer.cpp | 93 | ||||
-rw-r--r-- | examples/network/multistreamclient/chatconsumer.h | 79 | ||||
-rw-r--r-- | examples/network/multistreamclient/client.cpp | 219 | ||||
-rw-r--r-- | examples/network/multistreamclient/client.h | 92 | ||||
-rw-r--r-- | examples/network/multistreamclient/consumer.h | 75 | ||||
-rw-r--r-- | examples/network/multistreamclient/main.cpp | 60 | ||||
-rw-r--r-- | examples/network/multistreamclient/movieconsumer.cpp | 83 | ||||
-rw-r--r-- | examples/network/multistreamclient/movieconsumer.h | 74 | ||||
-rw-r--r-- | examples/network/multistreamclient/multistreamclient.pro | 16 | ||||
-rw-r--r-- | examples/network/multistreamclient/timeconsumer.cpp | 94 | ||||
-rw-r--r-- | examples/network/multistreamclient/timeconsumer.h | 79 |
11 files changed, 964 insertions, 0 deletions
diff --git a/examples/network/multistreamclient/chatconsumer.cpp b/examples/network/multistreamclient/chatconsumer.cpp new file mode 100644 index 0000000000..723ecfaa23 --- /dev/null +++ b/examples/network/multistreamclient/chatconsumer.cpp @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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 "chatconsumer.h" +#include <QWidget> +#include <QTextEdit> +#include <QLineEdit> +#include <QVBoxLayout> +#include <QString> + +ChatConsumer::ChatConsumer(QObject *parent) + : Consumer(parent) +{ + frameWidget = new QWidget; + frameWidget->setFocusPolicy(Qt::TabFocus); + + textEdit = new QTextEdit; + textEdit->setFocusPolicy(Qt::NoFocus); + textEdit->setReadOnly(true); + + lineEdit = new QLineEdit; + frameWidget->setFocusProxy(lineEdit); + + connect(lineEdit, &QLineEdit::returnPressed, this, &ChatConsumer::returnPressed); + + QVBoxLayout *layout = new QVBoxLayout(frameWidget); + layout->setContentsMargins( 0, 0, 0, 0); + layout->addWidget(textEdit); + layout->addWidget(lineEdit); +} + +QWidget *ChatConsumer::widget() +{ + return frameWidget; +} + +void ChatConsumer::readDatagram(const QByteArray &ba) +{ + textEdit->append(QString::fromUtf8(ba)); +} + +void ChatConsumer::returnPressed() +{ + emit writeDatagram(lineEdit->text().toUtf8()); + lineEdit->clear(); +} diff --git a/examples/network/multistreamclient/chatconsumer.h b/examples/network/multistreamclient/chatconsumer.h new file mode 100644 index 0000000000..9e12f99359 --- /dev/null +++ b/examples/network/multistreamclient/chatconsumer.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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$ +** +****************************************************************************/ + +#ifndef CHATCONSUMER_H +#define CHATCONSUMER_H + +#include "consumer.h" + +QT_BEGIN_NAMESPACE +class QTextEdit; +class QLineEdit; +QT_END_NAMESPACE + +class ChatConsumer : public Consumer +{ + Q_OBJECT +public: + explicit ChatConsumer(QObject *parent = nullptr); + + QWidget *widget() Q_DECL_OVERRIDE; + void readDatagram(const QByteArray &ba) Q_DECL_OVERRIDE; + +private slots: + void returnPressed(); + +private: + QWidget *frameWidget; + QTextEdit *textEdit; + QLineEdit *lineEdit; +}; + +#endif diff --git a/examples/network/multistreamclient/client.cpp b/examples/network/multistreamclient/client.cpp new file mode 100644 index 0000000000..112fb2e1a0 --- /dev/null +++ b/examples/network/multistreamclient/client.cpp @@ -0,0 +1,219 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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 <QtWidgets> +#include <QtNetwork> + +#include "client.h" +#include "movieconsumer.h" +#include "timeconsumer.h" +#include "chatconsumer.h" + +#include "../shared/sctpchannels.h" + +Client::Client(QWidget *parent) + : QDialog(parent) + , consumers(SctpChannels::NumberOfChannels) +{ + setWindowTitle(tr("Multi-stream Client")); + + sctpSocket = new QSctpSocket(this); + + QLabel *hostLabel = new QLabel(tr("&Server name:")); + QLabel *portLabel = new QLabel(tr("S&erver port:")); + + hostCombo = new QComboBox; + hostCombo->setEditable(true); + // find out name of this machine + QString name = QHostInfo::localHostName(); + if (!name.isEmpty()) { + hostCombo->addItem(name); + QString domain = QHostInfo::localDomainName(); + if (!domain.isEmpty()) + hostCombo->addItem(name + QChar('.') + domain); + } + if (name != QString("localhost")) + hostCombo->addItem(QString("localhost")); + // find out IP addresses of this machine + QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); + // add non-localhost addresses + for (int i = 0; i < ipAddressesList.size(); ++i) { + if (!ipAddressesList.at(i).isLoopback()) + hostCombo->addItem(ipAddressesList.at(i).toString()); + } + // add localhost addresses + for (int i = 0; i < ipAddressesList.size(); ++i) { + if (ipAddressesList.at(i).isLoopback()) + hostCombo->addItem(ipAddressesList.at(i).toString()); + } + + portLineEdit = new QLineEdit; + portLineEdit->setValidator(new QIntValidator(1, 65535, this)); + + hostLabel->setBuddy(hostCombo); + portLabel->setBuddy(portLineEdit); + + connectButton = new QPushButton(tr("Connect")); + connectButton->setDefault(true); + connectButton->setEnabled(false); + + QPushButton *quitButton = new QPushButton(tr("Quit")); + quitButton->setAutoDefault(false); + + QDialogButtonBox *buttonBox = new QDialogButtonBox; + buttonBox->addButton(connectButton, QDialogButtonBox::ActionRole); + buttonBox->addButton(quitButton, QDialogButtonBox::AcceptRole); + + QLabel *movieLabel = new QLabel(tr("Movie stream:")); + consumers[SctpChannels::Movie] = new MovieConsumer(this); + QLabel *timeLabel = new QLabel(tr("Time stream:")); + consumers[SctpChannels::Time] = new TimeConsumer(this); + QLabel *chatLabel = new QLabel(tr("&Chat:")); + consumers[SctpChannels::Chat] = new ChatConsumer(this); + chatLabel->setBuddy(consumers[SctpChannels::Chat]->widget()); + + connect(hostCombo, &QComboBox::editTextChanged, this, &Client::enableConnectButton); + connect(portLineEdit, &QLineEdit::textChanged, this, &Client::enableConnectButton); + connect(connectButton, &QPushButton::clicked, this, &Client::requestConnect); + connect(buttonBox, &QDialogButtonBox::accepted, this, &Client::accept); + connect(sctpSocket, &QSctpSocket::connected, this, &Client::connected); + connect(sctpSocket, &QSctpSocket::disconnected, this, &Client::disconnected); + connect(sctpSocket, &QSctpSocket::channelReadyRead, this, &Client::readDatagram); + connect(sctpSocket, SIGNAL(error(QAbstractSocket::SocketError)), + this, SLOT(displayError(QAbstractSocket::SocketError))); + connect(consumers[SctpChannels::Time], &Consumer::writeDatagram, this, &Client::writeDatagram); + connect(consumers[SctpChannels::Chat], &Consumer::writeDatagram, this, &Client::writeDatagram); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(hostLabel, 0, 0); + mainLayout->addWidget(hostCombo, 0, 1); + mainLayout->addWidget(portLabel, 1, 0); + mainLayout->addWidget(portLineEdit, 1, 1); + mainLayout->addWidget(buttonBox, 2, 0, 1, 2); + mainLayout->addWidget(movieLabel, 3, 0); + mainLayout->addWidget(timeLabel, 3, 1); + mainLayout->addWidget(consumers[SctpChannels::Movie]->widget(), 4, 0); + mainLayout->addWidget(consumers[SctpChannels::Time]->widget(), 4, 1); + mainLayout->addWidget(chatLabel, 5, 0); + mainLayout->addWidget(consumers[SctpChannels::Chat]->widget(), 6, 0, 1, 2); + setLayout(mainLayout); + + portLineEdit->setFocus(); +} + +Client::~Client() +{ + delete sctpSocket; +} + +void Client::connected() +{ + consumers[SctpChannels::Chat]->widget()->setFocus(); +} + +void Client::disconnected() +{ + for (Consumer *consumer : consumers) + consumer->serverDisconnected(); + + sctpSocket->close(); +} + +void Client::requestConnect() +{ + connectButton->setEnabled(false); + sctpSocket->abort(); + sctpSocket->connectToHost(hostCombo->currentText(), + portLineEdit->text().toInt()); +} + +void Client::readDatagram(int channel) +{ + sctpSocket->setCurrentReadChannel(channel); + consumers[channel]->readDatagram(sctpSocket->readDatagram().data()); +} + +void Client::displayError(QAbstractSocket::SocketError socketError) +{ + switch (socketError) { + case QAbstractSocket::HostNotFoundError: + QMessageBox::information(this, tr("Multi-stream Client"), + tr("The host was not found. Please check the " + "host name and port settings.")); + break; + case QAbstractSocket::ConnectionRefusedError: + QMessageBox::information(this, tr("Multi-stream Client"), + tr("The connection was refused by the peer. " + "Make sure the multi-stream server is running, " + "and check that the host name and port " + "settings are correct.")); + break; + default: + QMessageBox::information(this, tr("Multi-stream Client"), + tr("The following error occurred: %1.") + .arg(sctpSocket->errorString())); + } + + enableConnectButton(); +} + +void Client::enableConnectButton() +{ + connectButton->setEnabled(!hostCombo->currentText().isEmpty() && + !portLineEdit->text().isEmpty()); +} + +void Client::writeDatagram(const QByteArray &ba) +{ + if (sctpSocket->isValid() && sctpSocket->state() == QAbstractSocket::ConnectedState) { + sctpSocket->setCurrentWriteChannel(consumers.indexOf(static_cast<Consumer *>(sender()))); + sctpSocket->writeDatagram(ba); + } +} diff --git a/examples/network/multistreamclient/client.h b/examples/network/multistreamclient/client.h new file mode 100644 index 0000000000..c22a245eba --- /dev/null +++ b/examples/network/multistreamclient/client.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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$ +** +****************************************************************************/ + +#ifndef CLIENT_H +#define CLIENT_H + +#include <QDialog> +#include <QVector> +#include <QSctpSocket> + +QT_BEGIN_NAMESPACE +class QComboBox; +class QLineEdit; +class QPushButton; +class QByteArray; +QT_END_NAMESPACE + +class Consumer; + +class Client : public QDialog +{ + Q_OBJECT +public: + explicit Client(QWidget *parent = nullptr); + virtual ~Client(); + +private slots: + void connected(); + void disconnected(); + void requestConnect(); + void readDatagram(int channel); + void displayError(QAbstractSocket::SocketError socketError); + void enableConnectButton(); + void writeDatagram(const QByteArray &ba); + +private: + QVector<Consumer *> consumers; + QSctpSocket *sctpSocket; + + QComboBox *hostCombo; + QLineEdit *portLineEdit; + QPushButton *connectButton; +}; + +#endif diff --git a/examples/network/multistreamclient/consumer.h b/examples/network/multistreamclient/consumer.h new file mode 100644 index 0000000000..d70f8d67bf --- /dev/null +++ b/examples/network/multistreamclient/consumer.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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$ +** +****************************************************************************/ + +#ifndef CONSUMER_H +#define CONSUMER_H + +#include <QObject> +#include <QByteArray> + +QT_BEGIN_NAMESPACE +class QWidget; +QT_END_NAMESPACE + +class Consumer : public QObject +{ + Q_OBJECT +public: + explicit inline Consumer(QObject *parent = nullptr) : QObject(parent) { } + + virtual QWidget *widget() = 0; + virtual void readDatagram(const QByteArray &ba) = 0; + virtual void serverDisconnected() { } + +signals: + void writeDatagram(const QByteArray &ba); +}; + +#endif diff --git a/examples/network/multistreamclient/main.cpp b/examples/network/multistreamclient/main.cpp new file mode 100644 index 0000000000..b903214710 --- /dev/null +++ b/examples/network/multistreamclient/main.cpp @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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 <QApplication> +#include "client.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + Client client; + + return (client.exec() == QDialog::Accepted) ? 0 : -1; +} diff --git a/examples/network/multistreamclient/movieconsumer.cpp b/examples/network/multistreamclient/movieconsumer.cpp new file mode 100644 index 0000000000..ff5610a0b9 --- /dev/null +++ b/examples/network/multistreamclient/movieconsumer.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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 "movieconsumer.h" +#include <QLabel> +#include <QDataStream> +#include <QImage> +#include <QPixmap> + +MovieConsumer::MovieConsumer(QObject *parent) + : Consumer(parent) +{ + label = new QLabel; + label->setFrameStyle(QFrame::Box | QFrame::Raised); + label->setFixedSize(128 + label->frameWidth() * 2, + 64 + label->frameWidth() * 2); +} + +QWidget *MovieConsumer::widget() +{ + return label; +} + +void MovieConsumer::readDatagram(const QByteArray &ba) +{ + QDataStream ds(ba); + QImage image; + + ds >> image; + label->setPixmap(QPixmap::fromImage(image)); +} + +void MovieConsumer::serverDisconnected() +{ + label->setPixmap(QPixmap()); +} diff --git a/examples/network/multistreamclient/movieconsumer.h b/examples/network/multistreamclient/movieconsumer.h new file mode 100644 index 0000000000..74321a8505 --- /dev/null +++ b/examples/network/multistreamclient/movieconsumer.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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$ +** +****************************************************************************/ + +#ifndef MOVIECONSUMER_H +#define MOVIECONSUMER_H + +#include "consumer.h" + +QT_BEGIN_NAMESPACE +class QLabel; +QT_END_NAMESPACE + +class MovieConsumer : public Consumer +{ + Q_OBJECT +public: + explicit MovieConsumer(QObject *parent = nullptr); + + QWidget *widget() Q_DECL_OVERRIDE; + void readDatagram(const QByteArray &ba) Q_DECL_OVERRIDE; + void serverDisconnected() Q_DECL_OVERRIDE; + +private: + QLabel *label; +}; + +#endif diff --git a/examples/network/multistreamclient/multistreamclient.pro b/examples/network/multistreamclient/multistreamclient.pro new file mode 100644 index 0000000000..ed887ab53e --- /dev/null +++ b/examples/network/multistreamclient/multistreamclient.pro @@ -0,0 +1,16 @@ +QT += network widgets + +HEADERS = client.h \ + consumer.h \ + movieconsumer.h \ + timeconsumer.h \ + chatconsumer.h +SOURCES = client.cpp \ + movieconsumer.cpp \ + timeconsumer.cpp \ + chatconsumer.cpp \ + main.cpp + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/network/multistreamclient +INSTALLS += target diff --git a/examples/network/multistreamclient/timeconsumer.cpp b/examples/network/multistreamclient/timeconsumer.cpp new file mode 100644 index 0000000000..6543e53cfc --- /dev/null +++ b/examples/network/multistreamclient/timeconsumer.cpp @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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 "timeconsumer.h" +#include <QLCDNumber> +#include <QString> +#include <QDataStream> +#include <QTimer> + +TimeConsumer::TimeConsumer(QObject *parent) + : Consumer(parent) +{ + lcdNumber = new QLCDNumber(8); + + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &TimeConsumer::timerTick); + timer->start(100); + + serverDisconnected(); +} + +QWidget *TimeConsumer::widget() +{ + return lcdNumber; +} + +void TimeConsumer::readDatagram(const QByteArray &ba) +{ + QDataStream ds(ba); + + ds >> lastTime; + lcdNumber->display(lastTime.toString("hh:mm:ss")); +} + +void TimeConsumer::timerTick() +{ + QByteArray buf; + QDataStream ds(&buf, QIODevice::WriteOnly); + + ds << lastTime; + emit writeDatagram(buf); +} + +void TimeConsumer::serverDisconnected() +{ + lcdNumber->display(QLatin1String("--:--:--")); +} diff --git a/examples/network/multistreamclient/timeconsumer.h b/examples/network/multistreamclient/timeconsumer.h new file mode 100644 index 0000000000..3faa4a6b1a --- /dev/null +++ b/examples/network/multistreamclient/timeconsumer.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 The Qt Company Ltd 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$ +** +****************************************************************************/ + +#ifndef TIMECONSUMER_H +#define TIMECONSUMER_H + +#include "consumer.h" +#include <QTime> + +QT_BEGIN_NAMESPACE +class QLCDNumber; +QT_END_NAMESPACE + +class TimeConsumer : public Consumer +{ + Q_OBJECT +public: + explicit TimeConsumer(QObject *parent = nullptr); + + QWidget *widget() Q_DECL_OVERRIDE; + void readDatagram(const QByteArray &ba) Q_DECL_OVERRIDE; + void serverDisconnected() Q_DECL_OVERRIDE; + +private slots: + void timerTick(); + +private: + QTime lastTime; + QLCDNumber *lcdNumber; +}; + +#endif |