250 lines
9.4 KiB
C++

#include "ConnectionManager.h"
#include "Logger.h"
#include <QCoreApplication>
#include <QJsonDocument>
ConnectionManager::ConnectionManager(int inPort,
const QString &inPluginUUID,
const QString &inRegisterEvent,
const QString &inInfo,
BasePlugin* inPlugin,
QObject *parent)
: QObject{parent},
mPort(inPort),
mPluginUUID(inPluginUUID),
mRegisterEvent(inRegisterEvent),
mPlugin(inPlugin)
{
if (inPlugin) {
inPlugin->SetConnectionManager(this);
}
}
ConnectionManager::~ConnectionManager()
{
mWebsocketClient->abort();
delete mWebsocketClient;
mWebsocketClient = nullptr;
}
void ConnectionManager::Run()
{
if (!mWebsocketClient) {
mWebsocketClient = new QWebSocket();
connect(mWebsocketClient, &QWebSocket::connected, this, &ConnectionManager::OnConnected);
connect(mWebsocketClient, &QWebSocket::disconnected, this, &ConnectionManager::OnDisonnected);
connect(mWebsocketClient, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, &ConnectionManager::OnError);
connect(mWebsocketClient, &QWebSocket::textMessageReceived, this, &ConnectionManager::OnMessage);
QString urlString = QString("ws://127.0.0.1:%1").arg(mPort);
mWebsocketClient->open(QUrl(urlString));
}
}
void ConnectionManager::SetTitle(const QString &inTitle,
const QString &inContext,
mSDKTarget inTarget,
int inState)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventSetTitle;
jsonObject[mSDKCommonContext] = inContext;
QJsonObject payload;
payload[mSDKPayloadTarget] = inTarget;
payload[mSDKPayloadTitle] = inTitle;
if (inState >= 0) {
payload[mSDKPayloadState] = inState;
}
jsonObject[mSDKCommonPayload] = payload;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::SetImage(const QString &inBase64ImageString,
const QString &inContext,
mSDKTarget inTarget,
int inState)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventSetImage;
jsonObject[mSDKCommonContext] = inContext;
QJsonObject payload;
payload[mSDKPayloadTarget] = inTarget;
const QString prefix = "data:image/png;base64,";
if (inBase64ImageString.isEmpty() || inBase64ImageString.startsWith(prefix)) {
payload[mSDKPayloadImage] = inBase64ImageString;
} else {
payload[mSDKPayloadImage] = "data:image/png;base64," + inBase64ImageString;
}
if (inState >= 0) {
payload[mSDKPayloadState] = inState;
}
jsonObject[mSDKCommonPayload] = payload;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::ShowAlertForContext(const QString &inContext)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventShowAlert;
jsonObject[mSDKCommonContext] = inContext;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::ShowOKForContext(const QString &inContext)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventShowOK;
jsonObject[mSDKCommonContext] = inContext;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::SetSettings(const QJsonObject &inPayload,
const QString &inContext)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventSetSettings;
jsonObject[mSDKCommonContext] = inContext;
jsonObject[mSDKCommonPayload] = inPayload;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::GetGlobalSettings()
{
QJsonObject jsonObject{{mSDKCommonEvent, mSDKEventGetGlobalSettings}, {mSDKCommonContext, mPluginUUID}};
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::SetGlobalSettings(const QJsonObject &inPayload)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventSetGlobalSettings;
jsonObject[mSDKCommonContext] = mPluginUUID;
jsonObject[mSDKCommonPayload] = inPayload;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::SetState(int inState, const QString &inContext)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventSetState;
jsonObject[mSDKCommonContext] = inContext;
QJsonObject payload;
payload[mSDKPayloadState] = inState;
jsonObject[mSDKCommonPayload] = payload;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::SendToPropertyInspector(const QString &inAction,
const QString &inContext,
const QJsonObject &inPayload)
{
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventSendToPropertyInspector;
jsonObject[mSDKCommonContext] = inContext;
jsonObject[mSDKCommonAction] = inAction;
jsonObject[mSDKCommonPayload] = inPayload;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::SwitchToProfile(const QString &inDeviceID, const QString &inProfileName)
{
if (!inDeviceID.isEmpty()) {
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventSwitchToProfile;
jsonObject[mSDKCommonContext] = mPluginUUID;
jsonObject[mSDKCommonDevice] = inDeviceID;
if (!inProfileName.isEmpty()) {
QJsonObject payload;
payload[mSDKPayloadProfile] = inProfileName;
jsonObject[mSDKCommonPayload] = payload;
}
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
}
void ConnectionManager::LogMessage(const QString &inMessage)
{
if (!inMessage.isEmpty()) {
QJsonObject jsonObject;
jsonObject[mSDKCommonEvent] = mSDKEventLogMessage;
QJsonObject payload;
payload[mSDKPayloadMessage] = inMessage;
jsonObject[mSDKCommonPayload] = payload;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
}
void ConnectionManager::OnConnected()
{
// Register plugin with Software
QJsonObject jsonObject;
jsonObject["event"] = mRegisterEvent;
jsonObject["uuid"] = mPluginUUID;
SendMessage(QJsonDocument(jsonObject).toJson(QJsonDocument::Compact));
}
void ConnectionManager::OnDisonnected()
{
QString messageString = "Socket disconnected: " + mWebsocketClient->errorString();
Logger::LogToFile(messageString);
qApp->quit();
this->deleteLater();
}
void ConnectionManager::OnError(QAbstractSocket::SocketError error)
{
QString errorString = "Socket error: " + mWebsocketClient->errorString();
Logger::LogToFile(errorString);
}
void ConnectionManager::OnMessage(const QString &message)
{
Logger::LogToServer("OnMessage: " + message);
try {
QJsonObject receivedJson = QJsonDocument::fromJson(message.toUtf8()).object();
QString event = receivedJson.value(mSDKCommonEvent).toString();
QString context = receivedJson.value(mSDKCommonContext).toString();
QString action = receivedJson.value(mSDKCommonAction).toString();
QString deviceID = receivedJson.value(mSDKCommonDevice).toString();
QJsonObject payload = receivedJson.value(mSDKCommonPayload).toObject();
if (event == mSDKEventKeyDown) {
mPlugin->KeyDownForAction(action, context, payload, deviceID);
} else if (event == mSDKEventKeyUp) {
mPlugin->KeyUpForAction(action, context, payload, deviceID);
} else if (event == mSDKEventWillAppear) {
mPlugin->WillAppearForAction(action, context, payload, deviceID);
} else if (event == mSDKEventWillDisappear) {
mPlugin->WillDisappearForAction(action, context, payload, deviceID);
} else if (event == mSDKEventDidReceiveSettings) {
mPlugin->DidReceiveSettings(action, context, payload, deviceID);
} else if (event == mSDKEventDidReceiveGlobalSettings) {
mPlugin->DidReceiveGlobalSettings(payload);
} else if (event == mSDKEventDeviceDidConnect) {
QJsonObject deviceInfo = receivedJson.value(mSDKCommonDeviceInfo).toObject();
mPlugin->DeviceDidConnect(deviceID, deviceInfo);
} else if (event == mSDKEventDeviceDidDisconnect) {
mPlugin->DeviceDidDisconnect(deviceID);
} else if (event == mSDKEventSendToPlugin) {
mPlugin->SendToPlugin(action, context, payload, deviceID);
} else if (event == mSDKEventSystemDidWakeUp) {
mPlugin->SystemDidWakeUp();
} else if (event == mSDKEventDialDown) {
mPlugin->DialDownForAction(action, context, payload, deviceID);
} else if (event == mSDKEventDialDown) {
mPlugin->DialUpForAction(action, context, payload, deviceID);
} else if (event == mSDKEventDialRotate) {
mPlugin->DialRotateForAction(action, context, payload, deviceID);
}
} catch (...) {
}
}
void ConnectionManager::SendMessage(const QString &message)
{
if (mWebsocketClient) {
mWebsocketClient->sendTextMessage(message);
}
}