summaryrefslogtreecommitdiffstats
path: root/libqdb/protocol/qdbtransport.cpp
blob: d95432b24404a9927c733e9ede20001fb7da2552 (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
/******************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the Qt Debug Bridge.
**
** $QT_BEGIN_LICENSE:COMM$
**
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** $QT_END_LICENSE$
**
******************************************************************************/
#include "qdbtransport.h"

#include "protocol/protocol.h"

#include <QtCore/qdatastream.h>
#include <QtCore/qdebug.h>
#include <QtCore/qloggingcategory.h>

Q_LOGGING_CATEGORY(transportC, "transport");

QdbTransport::QdbTransport(QIODevice *io)
    : m_io{io}
{

}

QdbTransport::~QdbTransport()
{

}

bool QdbTransport::open()
{
    connect(m_io.get(), &QIODevice::readyRead, this, &QdbTransport::messageAvailable, Qt::QueuedConnection);
    return m_io->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
}

bool QdbTransport::send(const QdbMessage &message)
{
    int messageSize = qdbHeaderSize + message.data().size();
    QByteArray buf{messageSize, '\0'};
    QDataStream stream{&buf, QIODevice::WriteOnly};
    stream << message;

    int count = m_io->write(buf.constData(), messageSize);
    if (count != messageSize) {
        qCritical() << "QdbTransport::send() could not write entire message of" << messageSize << ", only wrote" << count;
        return false;
    }

    qCDebug(transportC) << "TX:" << message;
    return true;
}

QdbMessage QdbTransport::receive()
{
    QByteArray buf{qdbMessageSize, '\0'};
    int count = m_io->read(buf.data(), buf.size());
    if (count < qdbHeaderSize) {
        qDebug() << "QdbTransport::receive() could only read" << count << "out of package header's" << qdbHeaderSize;
        return QdbMessage{QdbMessage::Invalid, 0, 0};
    }
    QDataStream stream{buf};
    QdbMessage message;
    stream >> message;
    qCDebug(transportC) << "RX:" << message;

    return message;
}