diff options
author | BogDan Vatra <bogdan@kde.org> | 2019-06-11 16:33:57 +0300 |
---|---|---|
committer | BogDan Vatra <bogdan@kde.org> | 2019-06-12 16:11:46 +0300 |
commit | b8a71125f038b5a52d034b804d32ecddd9e19286 (patch) | |
tree | dc4803701dc042baa827a97e89ce72c2734c5cf2 /examples/remoteobjects/websockets/common | |
parent | 0e0b5ca1c2075e1a31cecccc82e8deef1f0eb992 (diff) |
Add WebSockets example
Change-Id: I5626b8a835c3b2d717e30b482678b95e20f26d38
Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
Diffstat (limited to 'examples/remoteobjects/websockets/common')
3 files changed, 192 insertions, 0 deletions
diff --git a/examples/remoteobjects/websockets/common/common.pri b/examples/remoteobjects/websockets/common/common.pri new file mode 100644 index 0000000..48389af --- /dev/null +++ b/examples/remoteobjects/websockets/common/common.pri @@ -0,0 +1,9 @@ +CONFIG -= app_bundle + +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/websocketiodevice.h + +SOURCES += \ + $$PWD/websocketiodevice.cpp diff --git a/examples/remoteobjects/websockets/common/websocketiodevice.cpp b/examples/remoteobjects/websockets/common/websocketiodevice.cpp new file mode 100644 index 0000000..4c3e917 --- /dev/null +++ b/examples/remoteobjects/websockets/common/websocketiodevice.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Ford Motor Company +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtRemoteObjects module 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 "websocketiodevice.h" + +#include <QWebSocket> + +WebSocketIoDevice::WebSocketIoDevice(QWebSocket *webSocket, QObject *parent) + : QIODevice(parent) + , m_socket(webSocket) +{ + open(QIODevice::ReadWrite); + connect(webSocket, &QWebSocket::disconnected, this, &WebSocketIoDevice::disconnected); + connect(webSocket, &QWebSocket::binaryMessageReceived, this, [this](const QByteArray &message){ + m_buffer.append(message); + emit readyRead(); + }); + connect(webSocket, &QWebSocket::bytesWritten, this, &WebSocketIoDevice::bytesWritten); +} + +qint64 WebSocketIoDevice::bytesAvailable() const +{ + return QIODevice::bytesAvailable() + m_buffer.size(); +} + +bool WebSocketIoDevice::isSequential() const +{ + return true; +} + +void WebSocketIoDevice::close() +{ + if (m_socket) + m_socket->close(); +} + +qint64 WebSocketIoDevice::readData(char *data, qint64 maxlen) +{ + auto sz = std::min(int(maxlen), m_buffer.size()); + if (sz <= 0) + return sz; + memcpy(data, m_buffer.constData(), size_t(sz)); + m_buffer.remove(0, sz); + return sz; +} + +qint64 WebSocketIoDevice::writeData(const char *data, qint64 len) +{ + if (m_socket) + return m_socket->sendBinaryMessage(QByteArray{data, int(len)}); + return -1; +} diff --git a/examples/remoteobjects/websockets/common/websocketiodevice.h b/examples/remoteobjects/websockets/common/websocketiodevice.h new file mode 100644 index 0000000..0e5609c --- /dev/null +++ b/examples/remoteobjects/websockets/common/websocketiodevice.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Ford Motor Company +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtRemoteObjects module 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 WEBSOCKETIODEVICE_H +#define WEBSOCKETIODEVICE_H + +#include <QBuffer> +#include <QIODevice> +#include <QPointer> + +class QWebSocket; + +class WebSocketIoDevice : public QIODevice +{ + Q_OBJECT +public: + WebSocketIoDevice(QWebSocket *webSocket, QObject *parent = nullptr); + +signals: + void disconnected(); + + // QIODevice interface +public: + qint64 bytesAvailable() const override; + bool isSequential() const override; + void close() override; + +protected: + qint64 readData(char *data, qint64 maxlen) override; + qint64 writeData(const char *data, qint64 len) override; + +private: + QPointer<QWebSocket> m_socket; + QByteArray m_buffer; +}; + +#endif // WEBSOCKETIODEVICE_H |