90 lines
2.2 KiB
C++
90 lines
2.2 KiB
C++
// Copyright (C) 2017 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#include "chatclient.h"
|
|
|
|
#include <QMetaEnum>
|
|
#include <QMetaObject>
|
|
|
|
#include <QBluetoothServiceInfo>
|
|
|
|
using namespace Qt::StringLiterals;
|
|
|
|
ChatClient::ChatClient(QObject *parent)
|
|
: QObject(parent)
|
|
{
|
|
}
|
|
|
|
ChatClient::~ChatClient()
|
|
{
|
|
stopClient();
|
|
}
|
|
|
|
//! [startClient]
|
|
void ChatClient::startClient(const QBluetoothServiceInfo &remoteService)
|
|
{
|
|
if (socket)
|
|
return;
|
|
|
|
// Connect to service
|
|
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
|
|
qDebug() << "Create socket";
|
|
socket->connectToService(remoteService);
|
|
qDebug() << "ConnectToService done";
|
|
|
|
connect(socket, &QBluetoothSocket::readyRead, this, &ChatClient::readSocket);
|
|
connect(socket, &QBluetoothSocket::connected, this, QOverload<>::of(&ChatClient::connected));
|
|
connect(socket, &QBluetoothSocket::disconnected, this, &ChatClient::disconnected);
|
|
connect(socket, &QBluetoothSocket::errorOccurred, this, &ChatClient::onSocketErrorOccurred);
|
|
}
|
|
//! [startClient]
|
|
|
|
//! [stopClient]
|
|
void ChatClient::stopClient()
|
|
{
|
|
delete socket;
|
|
socket = nullptr;
|
|
}
|
|
//! [stopClient]
|
|
|
|
//! [readSocket]
|
|
void ChatClient::readSocket()
|
|
{
|
|
if (!socket)
|
|
return;
|
|
|
|
while (socket->canReadLine()) {
|
|
QByteArray line = socket->readLine().trimmed();
|
|
emit messageReceived(socket->peerName(),
|
|
QString::fromUtf8(line.constData(), line.length()));
|
|
}
|
|
}
|
|
//! [readSocket]
|
|
|
|
//! [sendMessage]
|
|
void ChatClient::sendMessage(const QString &message)
|
|
{
|
|
QByteArray text = message.toUtf8() + '\n';
|
|
socket->write(text);
|
|
}
|
|
//! [sendMessage]
|
|
|
|
void ChatClient::onSocketErrorOccurred(QBluetoothSocket::SocketError error)
|
|
{
|
|
if (error == QBluetoothSocket::SocketError::NoSocketError)
|
|
return;
|
|
|
|
QMetaEnum metaEnum = QMetaEnum::fromType<QBluetoothSocket::SocketError>();
|
|
QString errorString = socket->peerName() + ' '_L1
|
|
+ metaEnum.valueToKey(static_cast<int>(error)) + " occurred"_L1;
|
|
|
|
emit socketErrorOccurred(errorString);
|
|
}
|
|
|
|
//! [connected]
|
|
void ChatClient::connected()
|
|
{
|
|
emit connected(socket->peerName());
|
|
}
|
|
//! [connected]
|