aboutsummaryrefslogtreecommitdiffstats
path: root/src/logreceiver.cpp
blob: 7cec06374d78ba6ee1682ff95a2e09cfefc0a207 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/****************************************************************************
**
** Copyright (C) 2016 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QmlLive tool.
**
** $QT_BEGIN_LICENSE:GPL-QTAS$
** Commercial License Usage
** Licensees holding valid commercial Qt Automotive Suite 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.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
** SPDX-License-Identifier: GPL-3.0
**
****************************************************************************/

#include <QUdpSocket>
#include <QStringList>
#include <QUrl>
#include "logreceiver.h"

/*!
 * \class LogReceiver
 * \brief Connects to a port and waits for log messages sent via udp
 * \inmodule qmllive
 *
 * \sa Logger, RemoteLogger
 */

/*!
 * Standard constructor using \a parent as parent
 */
LogReceiver::LogReceiver(QObject *parent) :
    QObject(parent),
    m_socket(new QUdpSocket(this))
{
    setPort(45454);
    connect(m_socket, &QAbstractSocket::readyRead, this, &LogReceiver::processPendingDatagrams);
}

/*!
 * Sets the \a port on which we wait for incoming logs
 */
void LogReceiver::setPort(int port)
{
    m_port = port;
}

/*!
 * Sets the \a address on which we wait for incoming logs
 */
void LogReceiver::setAddress(const QString &address)
{
    m_address = QHostAddress(address);
}

/*!
 * Binds the socket to the address and port using UDP
 */
void LogReceiver::connectToServer()
{
    m_socket->disconnectFromHost();
    m_socket->bind(m_address, m_port, QUdpSocket::ShareAddress);
}

/*!
 * The port on which we wait for incoming logs
 */
int LogReceiver::port() const
{
    return m_port;
}

/*!
 * The address on which we wait for incoming logs
 */
QString LogReceiver::address() const
{
    return m_address.toString();
}

void LogReceiver::processPendingDatagrams()
{
    while (m_socket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(m_socket->pendingDatagramSize());
        m_socket->readDatagram(datagram.data(), datagram.size());

        QStringList data = QString::fromUtf8(datagram).split("%%%");
        if (data.count() != 5) {
            qWarning("Invalid Log package received");
            return;
        }

        emit message(data.at(0).toInt(), data.at(1), QUrl(data.at(2)) ,data.at(3).toInt(), data.at(4).toInt());
    }
}


/*!
  \fn LogReceiver::message(int type, const QString &msg, const QUrl &url, int line, int column)

  This signal is emitted whenever a datagram arrives on the socket.

  The \a type is the type of the message. The \a msg is the message content of the log entry. The \a
  url is the source of the document emitting the log. And \a line and \a column
  is the position in the source code.
*/