#include "ConnectionManager.h" #include "Logger.h" #include #include 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::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); } }