DiagramDesigner/diagramCommunication/include/uiCommunicationBus.h

124 lines
4.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// uiCommunicationBus.h
#pragma once
#include "export.hpp"
#include <QObject>
#include <QMap>
#include <QVariant>
#include <QMutex>
// UI通信总线
class DIAGRAM_DESIGNER_PUBLIC UiCommunicationBus : public QObject
{
Q_OBJECT
public:
static UiCommunicationBus* instance();
// 发送HTTP请求
void sendHttpRequest(const QString& endpoint, const QVariant& data = QVariant(),const QString& method = "GET",const QVariantMap& = QVariantMap());
// 发送HTTP请求无回复
void sendHttpRequestNoReply(const QString& endpoint, const QVariant& data = QVariant());
// 向UI发送数据
void sendToUi(const QString& uiId, const QString& action, const QVariant& data);
// 广播到所有UI
void broadcastToUis(const QString& action, const QVariant& data);
// 注册/注销UI
void registerUi(const QString& uiId, QObject* uiObject);
void unregisterUi(const QString& uiId);
QMap<QString,QList<QPair<QString,QString>>>& getTempRequestMap() {return _tempRequest;}
void insertTempRequest(QString page,QList<QPair<QString,QString>> lst){
if(!_tempRequest.contains(page)){
_tempRequest.insert(page,lst);
}
}
QMap<QString,QPair<QString,QList<QPair<QString,QString>>>>& getSesstionMap() {return _session;}
void insertSesstionMap(QString id,QMap<QString,QString> targetMap){ //从临时列表移除,插入到会话列表
QStringList sortedTargetList; //排序后的target列表
for(auto it = targetMap.begin();it != targetMap.end();++it){
sortedTargetList.append(it.key());
}
sortedTargetList.sort();
auto it = _tempRequest.begin();
while (it != _tempRequest.end())
{
const QString& page = it.key();
QList<QPair<QString, QString>>& tempList = it.value();
// 提取当前 tempList 中所有 first 元素组成的列表
QStringList firstElements;
firstElements.reserve(tempList.size());
for (const auto& pair : tempList)
{
firstElements.append(pair.first);
}
// 先进行简单检查:如果元素数量不同,肯定不匹配
if (firstElements.size() != sortedTargetList.size())
{
++it;
continue;
}
// 排序 firstElements
QStringList sortedFirstElements = firstElements;
sortedFirstElements.sort();
// 比较排序后的列表
if (sortedFirstElements == sortedTargetList)
{
// 匹配成功
// 检查 _session 中是否已有此 page
if (!_session.contains(page))
{
QList<QPair<QString, QString>> newList;
for (const auto& item : tempList) { //如果订阅不成功,从候选列表中移除 todo:记录错误target
auto it = targetMap.find(item.first);
if (it != targetMap.end()) {
if (it.value() != "1001") {
continue; // 跳过
}
}
newList.append(item);
}
tempList = newList;
// _session 中没有此 page可以插入
_session[page] = qMakePair(id, tempList);
}
// 无论 _session 中是否有此 page都从 _tempRequest 删除 *********同一个page中只存在一个会话******
it = _tempRequest.erase(it);
}
else
{
++it;
}
}
}
signals:
void httpDataProcessed(const QString& type,const QVariant& data); //发送分拣过的数据给外部
void websocketDataProcessed(const QVariant& data);
private:
UiCommunicationBus(QObject* parent = nullptr);
// 处理HTTP响应
void onHttpDataReceived(const QByteArray& data);
// 处理WebSocket数据
void onWebSocketDataReceived(const QByteArray& data);
// UI注册表
QMap<QString, QObject*> m_uiObjects;
mutable QMutex m_mutex;
QMap<QString,QList<QPair<QString,QString>>> _tempRequest; //临时请求队列,一个QList为一次会话 <图名<节点名,状态>>
QMap<QString,QPair<QString,QList<QPair<QString,QString>>>> _session; //会话队列 <图名<会话id<节点名,状态>>>
};