]> git.mxchange.org Git - flightgear.git/commitdiff
Initial MP support in the launcher.
authorJames Turner <zakalawe@mac.com>
Fri, 8 Jul 2016 08:36:42 +0000 (09:36 +0100)
committerRoland Haeder <roland@mxchange.org>
Thu, 22 Sep 2016 21:27:47 +0000 (23:27 +0200)
src/GUI/Launcher.ui
src/GUI/QtLauncher.cxx
src/GUI/QtLauncher_private.hxx

index 5203700f600728cd189d1d847e585d48cf9ce690..211442851759866f94d28fc0747ed0539ad462d1 100644 (file)
        <property name="bottomMargin">
         <number>8</number>
        </property>
-       <item row="8" column="0">
+       <item row="9" column="0">
         <widget class="QPushButton" name="restoreDefaultsButton">
          <property name="text">
           <string>Restore Defaults...</string>
          </item>
         </layout>
        </item>
-       <item row="7" column="0" colspan="2">
+       <item row="8" column="0" colspan="2">
         <widget class="QGroupBox" name="groupBox_2">
          <property name="title">
           <string>Additional options</string>
          </layout>
         </widget>
        </item>
-       <item row="6" column="0">
+       <item row="7" column="0">
         <spacer name="verticalSpacer">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
          </property>
         </spacer>
        </item>
+       <item row="6" column="0" colspan="2">
+        <widget class="QGroupBox" name="mpBox">
+         <property name="minimumSize">
+          <size>
+           <width>0</width>
+           <height>100</height>
+          </size>
+         </property>
+         <property name="title">
+          <string>Multi-player</string>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <layout class="QGridLayout" name="gridLayout" columnstretch="1,2,0">
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_9">
+            <property name="text">
+             <string>Callsign:</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLabel" name="label_10">
+            <property name="text">
+             <string>Server:</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLineEdit" name="mpCallsign">
+            <property name="maxLength">
+             <number>10</number>
+            </property>
+            <property name="placeholderText">
+             <string>G-FGFS</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="2">
+           <widget class="QLabel" name="label_11">
+            <property name="text">
+             <string>(Ten characters maximum)</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1" colspan="2">
+           <widget class="QComboBox" name="mpServerCombo"/>
+          </item>
+         </layout>
+        </widget>
+       </item>
       </layout>
      </widget>
     </widget>
index ef61d3277ee7be46d5304b6a7d4cf818ff544117..f4a164804878fb7e7e8a51aa5bdc9256231bb881 100644 (file)
@@ -67,6 +67,7 @@
 #include "PathsDialog.hxx"
 
 #include <Main/globals.hxx>
+#include <Main/fg_props.hxx>
 #include <Navaids/NavDataCache.hxx>
 #include <Navaids/navrecord.hxx>
 #include <Navaids/SHPParser.hxx>
@@ -75,6 +76,7 @@
 #include <Main/fg_init.hxx>
 #include <Viewer/WindowBuilder.hxx>
 #include <Network/HTTPClient.hxx>
+#include <Network/RemoteXMLRequest.hxx>
 
 using namespace flightgear;
 using namespace simgear::pkg;
@@ -495,7 +497,8 @@ QtLauncher::QtLauncher() :
     QDialog(),
     m_ui(NULL),
     m_subsystemIdleTimer(NULL),
-    m_inAppMode(false)
+    m_inAppMode(false),
+    m_doRestoreMPServer(false)
 {
     m_ui.reset(new Ui::Launcher);
     m_ui->setupUi(this);
@@ -627,6 +630,8 @@ QtLauncher::QtLauncher() :
 
     checkOfficialCatalogMessage();
     restoreSettings();
+
+    onRefreshMPServers();
 }
 
 QtLauncher::~QtLauncher()
@@ -719,6 +724,10 @@ void QtLauncher::restoreSettings()
     maybeRestoreAircraftSelection();
 
     m_ui->commandLineArgs->setPlainText(settings.value("additional-args").toString());
+
+    m_ui->mpCallsign->setText(settings.value("mp-callsign").toString());
+    // don't restore MP server here, we do it after a refresh
+    m_doRestoreMPServer = true;
 }
 
 void QtLauncher::delayedAircraftModelReset()
@@ -757,6 +766,9 @@ void QtLauncher::saveSettings()
     settings.setValue("additional-args", m_ui->commandLineArgs->toPlainText());
 
     m_ui->location->saveSettings();
+
+    settings.setValue("mp-callsign", m_ui->mpCallsign->text());
+    settings.setValue("mp-server", m_ui->mpServerCombo->currentData());
 }
 
 void QtLauncher::setEnableDisableOptionFromCheckbox(QCheckBox* cbox, QString name) const
@@ -831,6 +843,14 @@ void QtLauncher::onRun()
           m_recentAircraft.pop_back();
     }
 
+    if (m_ui->mpBox->isChecked()) {
+        opt->addOption("callsign", m_ui->mpCallsign->text().toStdString());
+        QString host = m_ui->mpServerCombo->currentData().toString();
+        globals->get_props()->setStringValue("/sim/multiplay/txhost", host.toStdString());
+        int port = findMPServerPort(host.toStdString());
+        globals->get_props()->setIntValue("/sim/multiplay/txport", port);
+    }
+
     m_ui->location->setLocationOptions();
 
     // time of day
@@ -1257,6 +1277,86 @@ void QtLauncher::onOfficialCatalogMessageLink(QUrl link)
     checkOfficialCatalogMessage();
 }
 
+void QtLauncher::onRefreshMPServers()
+{
+    if (m_mpServerRequest.get()) {
+        return; // in-progress
+    }
+
+    string url(fgGetString("/sim/multiplay/serverlist-url",
+                           "http://liveries.flightgear.org/mpstatus/mpservers.xml"));
+
+    if (url.empty()) {
+        SG_LOG(SG_IO, SG_ALERT, "do_multiplayer.refreshserverlist: no URL given");
+        return;
+    }
+
+    SGPropertyNode *targetnode = fgGetNode("/sim/multiplay/server-list", true);
+    m_mpServerRequest.reset(new RemoteXMLRequest(url, targetnode));
+    m_mpServerRequest->done(this, &QtLauncher::onRefreshMPServersDone);
+    m_mpServerRequest->fail(this, &QtLauncher::onRefreshMPServersFailed);
+    globals->get_subsystem<FGHTTPClient>()->makeRequest(m_mpServerRequest);
+}
+
+void QtLauncher::onRefreshMPServersDone(simgear::HTTP::Request*)
+{
+    // parse the properties
+    SGPropertyNode *targetnode = fgGetNode("/sim/multiplay/server-list", true);
+
+
+    m_ui->mpServerCombo->clear();
+
+    for (int i=0; i<targetnode->nChildren(); ++i) {
+        SGPropertyNode* c = targetnode->getChild(i);
+        if (c->getName() != std::string("server")) {
+            continue;
+        }
+
+        QString name = QString::fromStdString(c->getStringValue("name"));
+        QString loc = QString::fromStdString(c->getStringValue("location"));
+        QString host = QString::fromStdString(c->getStringValue("hostname"));
+        m_ui->mpServerCombo->addItem(tr("%1 - %2").arg(name,loc), host);
+    }
+
+    if (m_doRestoreMPServer) {
+        QSettings settings;
+        int index = m_ui->mpServerCombo->findData(settings.value("mp-server"));
+        if (index >= 0) {
+            m_ui->mpServerCombo->setCurrentIndex(index);
+        }
+    }
+
+    m_mpServerRequest.clear();
+}
+
+void QtLauncher::onRefreshMPServersFailed(simgear::HTTP::Request*)
+{
+    qWarning() << "refreshing MP servers failed:" << QString::fromStdString(m_mpServerRequest->responseReason());
+    m_mpServerRequest.clear();
+}
+
+void QtLauncher::onMPServerEdited(QString text)
+{
+    // parse as server hostname + optional URL
+}
+
+int QtLauncher::findMPServerPort(const std::string& host)
+{
+    SGPropertyNode *targetnode = fgGetNode("/sim/multiplay/server-list", true);
+    for (int i=0; i<targetnode->nChildren(); ++i) {
+        SGPropertyNode* c = targetnode->getChild(i);
+        if (c->getName() != std::string("server")) {
+            continue;
+        }
+
+        if (c->getStringValue("hostname") == host) {
+            return c->getIntValue("port");
+        }
+    }
+
+    return 0;
+}
+
 simgear::pkg::PackageRef QtLauncher::packageForAircraftURI(QUrl uri) const
 {
     if (uri.scheme() != "package") {
index 3d9495c1fba991363fde45bdd56ac04508450077..f56daffea0e07d5a6adac3f044e503a2406baccd 100644 (file)
@@ -41,6 +41,7 @@ class AircraftProxyModel;
 class AircraftItemModel;
 class QCheckBox;
 class CatalogListModel;
+class RemoteXMLRequest;
 
 class QtLauncher : public QDialog
 {
@@ -96,6 +97,11 @@ private slots:
     void onRestoreDefaults();
 
     void onDownloadDirChanged();
+
+    void onRefreshMPServers();
+    void onMPServerEdited(QString text);
+
+
 private:
 
     /**
@@ -118,6 +124,10 @@ private:
     void checkOfficialCatalogMessage();
     void onOfficialCatalogMessageLink(QUrl link);
 
+    void onRefreshMPServersDone(simgear::HTTP::Request*);
+    void onRefreshMPServersFailed(simgear::HTTP::Request*);
+    int findMPServerPort(const std::string& host);
+
     // need to wait after a model reset before restoring selection and
     // scrolling, to give the view time it seems.
     void delayedAircraftModelReset();
@@ -133,6 +143,9 @@ private:
     bool m_inAppMode;
 
     int m_ratingFilters[4];
+
+    SGSharedPtr<RemoteXMLRequest> m_mpServerRequest;
+    bool m_doRestoreMPServer;
 };
 
 #endif // of FG_QTLAUNCHER_PRIVATE_HXX