DiagramDesigner/diagramCommunication/source/uiCommunicationBus.cpp

190 lines
5.7 KiB
C++
Raw Normal View History

2025-12-12 17:46:37 +08:00
// UiCommunicationBus.cpp
#include "uiCommunicationBus.h"
#include "communicationManager.h"
#include "dataProcessor.h"
#include <QJsonDocument>
#include <QDebug>
#include <QJsonObject>
#include <QJsonArray>
UiCommunicationBus* UiCommunicationBus::instance()
{
static UiCommunicationBus* instance = nullptr;
static QMutex mutex;
if (!instance) {
QMutexLocker locker(&mutex);
if (!instance) {
instance = new UiCommunicationBus;
}
}
return instance;
}
UiCommunicationBus::UiCommunicationBus(QObject* parent)
: QObject(parent)
{
// 连接到CommunicationManager
CommunicationManager* comm = CommunicationManager::instance();
// 连接HTTP信号
connect(comm, &CommunicationManager::httpDataReceived,
this, &UiCommunicationBus::onHttpDataReceived);
// 连接WebSocket信号
connect(comm, &CommunicationManager::websocketDataReceived,
this, &UiCommunicationBus::onWebSocketDataReceived);
// 连接DataProcessor信号
DataProcessor* processor = DataProcessor::instance();
connect(processor, &DataProcessor::httpProcessed,
this, [this](const QString& dataType, const QVariant& data) {
if(dataType == "recommend"){
// 推荐列表请求将数据分发回订阅ui
broadcastToUis(dataType, data);
}
emit httpDataProcessed(dataType,data);
});
connect(processor, &DataProcessor::websocketProcessed,
this, [this](const QVariant& data) {
emit websocketDataProcessed(data);
});
qDebug() << "UiCommunicationBus initialized";
}
void UiCommunicationBus::sendHttpRequest(const QString& endpoint, const QVariant& data)
{
CommunicationManager* comm = CommunicationManager::instance();
QJsonDocument doc = QJsonDocument::fromVariant(data);
bool success = comm->sendHttpRequest(endpoint, doc.toJson());
if (success) {
qDebug() << "HTTP请求已发送:" << endpoint;
} else {
qWarning() << "HTTP请求发送失败:" << endpoint;
}
}
void UiCommunicationBus::sendHttpRequestNoReply(const QString& endpoint, const QVariant& data)
{
CommunicationManager* comm = CommunicationManager::instance();
QJsonDocument doc = QJsonDocument::fromVariant(data);
comm->sendHttpRequest(endpoint, doc.toJson());
qDebug() << "无回复HTTP请求已发送:" << endpoint;
}
void UiCommunicationBus::onHttpDataReceived(const QByteArray& data)
{
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qWarning() << "HTTP响应解析失败:" << error.errorString();
return;
}
QVariant response = doc.toVariant();
if (response.typeId() == QMetaType::QVariantMap) {
QVariantMap responseMap = response.toMap();
DataProcessor* processor = DataProcessor::instance();
QString state = responseMap.value("msg").toString();
if(state == "success"){
if(responseMap.contains("payload")){
processor->processData(responseMap.value("payload"));
}
}
}
qDebug() << "HTTP响应已处理";
}
void UiCommunicationBus::onWebSocketDataReceived(const QByteArray& data)
{
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qWarning() << "WebSocket数据解析失败:" << error.errorString();
return;
}
QVariant response = doc.toVariant();
if (response.typeId() == QMetaType::QVariantMap) {
QVariantMap responseMap = response.toMap();
DataProcessor* processor = DataProcessor::instance();
QString state = responseMap.value("msg").toString();
if(state == "success"){
if(responseMap.contains("payload")){
processor->processData(responseMap.value("payload"),1);
}
}
}
qDebug() << "WebSocket数据已处理";
}
void UiCommunicationBus::sendToUi(const QString& uiId, const QString& action, const QVariant& data)
{
QMutexLocker locker(&m_mutex);
if (!m_uiObjects.contains(uiId)) {
qWarning() << "UI未注册:" << uiId;
return;
}
QObject* uiObject = m_uiObjects[uiId];
// 尝试调用通用的消息处理槽
bool success = QMetaObject::invokeMethod(uiObject, "onMessage",
Qt::QueuedConnection,
Q_ARG(QString, action),
Q_ARG(QVariant, data));
if (!success) {
qWarning() << "调用UI消息处理失败:" << uiId << "action:" << action;
}
}
void UiCommunicationBus::broadcastToUis(const QString& action, const QVariant& data)
{
QMutexLocker locker(&m_mutex);
for (auto it = m_uiObjects.begin(); it != m_uiObjects.end(); ++it) {
QObject* uiObject = it.value();
2025-12-15 14:38:17 +08:00
QMetaObject::invokeMethod(uiObject, "onReceiveHttpData",
2025-12-12 17:46:37 +08:00
Q_ARG(QString, action),
Q_ARG(QVariant, data));
}
qDebug() << "消息广播:" << action << "接收者:" << m_uiObjects.size();
}
void UiCommunicationBus::registerUi(const QString& uiId, QObject* uiObject)
{
if (uiId.isEmpty() || !uiObject) {
qWarning() << "注册UI失败: 参数无效";
return;
}
QMutexLocker locker(&m_mutex);
m_uiObjects[uiId] = uiObject;
qDebug() << "UI已注册:" << uiId;
}
void UiCommunicationBus::unregisterUi(const QString& uiId)
{
QMutexLocker locker(&m_mutex);
m_uiObjects.remove(uiId);
qDebug() << "UI已注销:" << uiId;
}