/* Copyright (C) 2015 * swift project Community / Contributors * * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, * including this file, may be copied, modified, propagated, or distributed except according to the terms * contained in the LICENSE file. */ #include "SimConnectsettingscomponent.h" #include "SimConnectsettingscomponent.h" #include "ui_SimConnectsettingscomponent.h" #include "blackgui/guiapplication.h" #include "blackcore/context/contextapplication.h" #include "blackcore/context/contextsimulator.h" #include "blackmisc/network/networkutils.h" #include "blackmisc/simulation/fsx/SimConnectutilities.h" #include "blackmisc/logmessage.h" #include "blackconfig/buildconfig.h" #include #include #include #include #include #include using namespace BlackConfig; using namespace BlackMisc; using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation::Fsx; using namespace BlackMisc::Network; namespace BlackSimPlugin { namespace FsxCommon { CSimConnectSettingsComponent::CSimConnectSettingsComponent(QWidget *parent) : QFrame(parent), ui(new Ui::CSimConnectSettingsComponent) { ui->setupUi(this); connect(ui->pb_OpenSwiftSimConnectCfg, &QPushButton::clicked, this, &CSimConnectSettingsComponent::openSwiftSimConnectCfgFile); connect(ui->pb_DeleteSwiftSimConnectCfg, &QPushButton::clicked, this, &CSimConnectSettingsComponent::deleteSwiftSimConnectCfgFile); connect(ui->pb_ExistsSimConnectCfg, &QPushButton::clicked, this, &CSimConnectSettingsComponent::checkSwiftSimConnectCfgFile); connect(ui->pb_SaveSwiftSimConnectCfg, &QPushButton::clicked, this, &CSimConnectSettingsComponent::saveSimConnectCfgFile); connect(ui->pb_OpenUserCfgFile, &QPushButton::clicked, this, &CSimConnectSettingsComponent::openUserSimConnectCfgFile); connect(ui->pb_TestConnection, &QPushButton::clicked, this, &CSimConnectSettingsComponent::testSwiftSimConnectConnection); connect(ui->pb_SaveAsSimConnectIni, &QPushButton::clicked, this, &CSimConnectSettingsComponent::saveSimConnectIniFileDialog); this->setSimConnectInfo(); } CSimConnectSettingsComponent::~CSimConnectSettingsComponent() { // void } void CSimConnectSettingsComponent::openSwiftSimConnectCfgFile() { if (!CSimConnectUtilities::hasSwiftLocalSimConnectCfgFile()) { return; } const QFileInfo info(CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename()); QDesktopServices::openUrl(QUrl::fromLocalFile(info.absoluteFilePath())); } void CSimConnectSettingsComponent::openUserSimConnectCfgFile() { if (!CSimConnectUtilities::hasUserSimConnectCfgFile()) { return; } const QFileInfo info(CSimConnectUtilities::getUserSimConnectCfgFilename()); QDesktopServices::openUrl(QUrl::fromLocalFile(info.absoluteFilePath())); } void CSimConnectSettingsComponent::deleteSwiftSimConnectCfgFile() { const QString fileName = CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename(); QFile file(fileName); const bool result = file.exists() && file.remove(); if (result) { QMessageBox::information(qApp->activeWindow(), tr("File deleted"), tr("File %1 deleted successfully.").arg(fileName)); } this->checkSwiftSimConnectCfgFile(); } void CSimConnectSettingsComponent::checkSwiftSimConnectCfgFile() { // this works for local files only const QString fileName = CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename(); const QFile file(fileName); ui->le_ExistsSimConnectCfg->setText(file.exists() ? fileName : "no file"); // only works for local file (which the SimConnect file normally is) if (!CSimConnectUtilities::hasSwiftLocalSimConnectCfgFile()) { return; } const QSharedPointer settings = CSimConnectUtilities::simConnectFileAsSettings(); if (!settings) { return; } const QString address = CSimConnectUtilities::ipAddress(settings.data()); const int port = CSimConnectUtilities::ipPort(settings.data()); if (!address.isEmpty()) { ui->le_Address->setText(address); } if (port > 0) { ui->le_Port->setText(QString::number(port)); } } void CSimConnectSettingsComponent::testSwiftSimConnectConnection() { const QString address = ui->le_Address->text().trimmed(); const QString port = ui->le_Port->text().trimmed(); if (address.isEmpty() || port.isEmpty()) { QMessageBox::warning(qApp->activeWindow(), tr("Connection invalid"), tr("Address and/or port not specified!")); return; } if (!CNetworkUtils::isValidIPv4Address(address)) { QMessageBox::warning(qApp->activeWindow(), tr("Connection invalid"), tr("Wrong IPv4 address!")); return; } if (!CNetworkUtils::isValidPort(port)) { QMessageBox::warning(qApp->activeWindow(), tr("Connection invalid"), tr("Invalid port!")); return; } const int p = port.toInt(); QString msg; if (!CNetworkUtils::canConnect(address, p, msg)) { QMessageBox::warning(qApp->activeWindow(), tr("Connection invalid"), msg); return; } QMessageBox::information(qApp->activeWindow(), tr("Connection successful"), tr("Connected to %1:%2.").arg(address, port)); } void CSimConnectSettingsComponent::saveSimConnectCfgFile() { QString address = ui->le_Address->text().trimmed(); QString port = ui->le_Port->text().trimmed(); if (address.isEmpty() || port.isEmpty()) { QMessageBox::warning(qApp->activeWindow(), tr("Connection invalid"), tr("Address and/or port not specified!")); return; } if (!CNetworkUtils::isValidIPv4Address(address)) { QMessageBox::warning(qApp->activeWindow(), tr("Connection invalid"), tr("Wrong IPv4 address!")); return; } if (!CNetworkUtils::isValidPort(port)) { QMessageBox::warning(qApp->activeWindow(), tr("Connection invalid"), tr("Invalid port!")); return; } const int p = port.toInt(); QString fileName; if (sGui->getIContextSimulator()) { const BlackMisc::Simulation::CSimulatorInternals internals(sGui->getIContextSimulator()->getSimulatorInternals()); fileName = internals.getStringValue("fsx/SimConnectCfgFilename"); } if (fileName.isEmpty()) { fileName = CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename(); } if (fileName.isEmpty()) { QMessageBox::warning(qApp->activeWindow(), tr("Failed writing SimConnect.cfg"), tr("No file name specified!")); return; } if (sGui->getIContextApplication()->writeToFile(fileName, CSimConnectUtilities::simConnectCfg(address, p))) { QMessageBox::information(qApp->activeWindow(), tr("File saved"), tr("File '%1' saved.").arg(fileName)); this->checkSwiftSimConnectCfgFile(); } else { QMessageBox::warning(qApp->activeWindow(), tr("Failed writing SimConnect.cfg"), tr("Failed writing '%1'!").arg(fileName)); } } void CSimConnectSettingsComponent::saveSimConnectIniFileDialog() { const QString iniFile = ui->pte_SimConnectIni->toPlainText(); const QString dir = CSimConnectUtilities::getSimConnectIniFileDirectory(m_simulator); bool madeDir = false; QDir d(dir); if (!d.exists()) { d.mkdir(dir); madeDir = true; } const QString defaultFileName = CFileUtils::appendFilePaths(dir, CSimConnectUtilities::simConnectIniFilename()); const QString fileName = QFileDialog::getSaveFileName(this, tr("Save SimConnect.ini"), defaultFileName, tr("FSX/P3D ini files (*.ini)")); if (!fileName.isEmpty()) { const bool written = CFileUtils::writeStringToFile(iniFile, fileName); if (!written && madeDir) { d.removeRecursively(); } // clean up own created dir if (written) { CLogMessage(this).info("Written '%1'") << fileName; } } // always refresh info, as the dialog can also be used to delete the file this->setSimConnectInfo(); } void CSimConnectSettingsComponent::setSimConnectInfo() { if (CBuildConfig::isCompiledWithP3DSupport() && CBuildConfig::buildWordSize() == 64) { ui->lbl_SimConnectInfo->setText("Static linking P3Dv4 x64"); m_simulator = CSimulatorInfo(CSimulatorInfo::P3D); } else { const CWinDllUtils::DLLInfo SimConnectInfo = CSimConnectUtilities::simConnectDllInfo(); ui->lbl_SimConnectInfo->setText(SimConnectInfo.summary()); m_simulator = CSimulatorInfo(CSimulatorInfo::FSX); } ui->le_UserCfgFile->setText(CSimConnectUtilities::hasUserSimConnectCfgFile() ? CSimConnectUtilities::getUserSimConnectCfgFilename() : ""); const QString iniFiles = CSimConnectUtilities::getSimConnectIniFiles().join("\n"); ui->pte_SimConnectIniFiles->setPlainText(iniFiles); this->checkSwiftSimConnectCfgFile(); } } // ns } // ns