mirror of https://github.com/qt/qtgrpc.git
93 lines
2.5 KiB
C++
93 lines
2.5 KiB
C++
// Copyright (C) 2024 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#ifndef CLIENTWORKER_H
|
|
#define CLIENTWORKER_H
|
|
|
|
#include "chatmessages.qpb.h"
|
|
#include "qtgrpcchat_client.grpc.qpb.h"
|
|
|
|
#include <QtQmlIntegration/QtQmlIntegration>
|
|
|
|
#include <QtCore/QDir>
|
|
#include <QtCore/QObject>
|
|
#include <QtCore/QUrl>
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <qqmlintegration.h>
|
|
|
|
// Export the Backend namespace to QML
|
|
namespace Backend {
|
|
Q_NAMESPACE
|
|
Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
|
|
enum class ChatState {
|
|
Disconnected = 0,
|
|
Connecting,
|
|
Connected,
|
|
Disconnecting,
|
|
};
|
|
Q_ENUM_NS(ChatState);
|
|
QML_FOREIGN_NAMESPACE(Backend)
|
|
QML_NAMED_ELEMENT(Backend)
|
|
}
|
|
|
|
// ClientWorker runs in a separate thread to offload expensive operations.
|
|
class ClientWorker : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
//! [client-2a]
|
|
explicit ClientWorker(QObject *parent = nullptr);
|
|
~ClientWorker() override;
|
|
|
|
//! [client-2a]
|
|
std::optional<QDir> getValidDownloadDir() const;
|
|
std::optional<chat::ChatMessage> createMessage() const;
|
|
|
|
signals:
|
|
void registerFinished(const QGrpcStatus &status);
|
|
void chatError(const QString &message);
|
|
void chatStreamFinished(const QGrpcStatus &status);
|
|
void chatStateChanged(Backend::ChatState state);
|
|
void chatStreamMessageReceived(const chat::ChatMessage &message);
|
|
void fileMessageSent(const chat::ChatMessage &fileMessage);
|
|
|
|
//! [client-2b]
|
|
public Q_SLOTS:
|
|
void registerUser(const chat::Credentials &credentials);
|
|
void login(const chat::Credentials &credentials);
|
|
void logout();
|
|
void sendFile(const QUrl &url);
|
|
void sendFiles(const QList<QUrl> &urls);
|
|
void sendMessage(const chat::ChatMessage &message);
|
|
//! [client-2b]
|
|
void setHostUri(const QUrl &hostUri);
|
|
|
|
private:
|
|
void setState(Backend::ChatState state);
|
|
void connectStream(const QGrpcCallOptions &opts);
|
|
bool initializeClient();
|
|
static QString toUniqueFilePath(const QString &filePath);
|
|
QUrl saveFileRequest(const chat::FileMessage &fileRequest) const;
|
|
|
|
private:
|
|
QUrl m_hostUri;
|
|
bool m_hostUriDirty = false;
|
|
std::unique_ptr<chat::QtGrpcChat::Client> m_client;
|
|
|
|
std::unique_ptr<QGrpcBidiStream> m_chatStream;
|
|
Backend::ChatState m_chatState = {};
|
|
chat::ChatMessage m_chatResponse;
|
|
QList<QUrl> m_fileRequestBuffer;
|
|
|
|
chat::Credentials m_userCredentials;
|
|
|
|
Q_DISABLE_COPY_MOVE(ClientWorker)
|
|
};
|
|
|
|
|
|
Q_DECLARE_METATYPE(ClientWorker)
|
|
|
|
#endif // CLIENTWORKER_H
|