[XSwiftBus] Add hasMultiplayerPlanesAquired() DBus API

This function will return whether X-Plane multiplayer planes have been acquired by XSwiftBus or if not, who else acquired them.
This commit is contained in:
Roland Rossgotterer
2018-11-24 19:00:49 +01:00
committed by Klaus Basan
parent 55c2e2e559
commit 49bd38d722
5 changed files with 83 additions and 12 deletions

View File

@@ -19,6 +19,8 @@
#include "XPLMGraphics.h"
#include <XPLM/XPLMProcessing.h>
#include <XPLM/XPLMUtilities.h>
#include <XPLM/XPLMPlanes.h>
#include <XPLM/XPLMPlugin.h>
#include <cassert>
#include <cstring>
#include <cmath>
@@ -83,25 +85,50 @@ namespace XSwiftBus
{
if (! s_legacyDataOK) { return false; }
auto err = XPMPMultiplayerInit(preferences, preferences);
if (*err) { cleanup(); return false; }
m_initialized = true;
if (! m_initialized)
{
auto err = XPMPMultiplayerInit(preferences, preferences);
if (*err) { cleanup(); }
else { m_initialized = true; }
}
err = XPMPMultiplayerEnable();
if (*err) { cleanup(); return false; }
m_enabled = true;
return m_initialized;
}
XPMPLoadPlanesIfNecessary();
return true;
bool CTraffic::acquireMultiplayerPlanes(std::string *owner)
{
if (! m_enabledMultiplayer)
{
auto err = XPMPMultiplayerEnable();
if (*err)
{
cleanup();
}
else
{
m_enabledMultiplayer = true;
XPMPLoadPlanesIfNecessary();
}
}
int totalAircraft;
int activeAircraft;
XPLMPluginID controller;
XPLMCountAircraft(&totalAircraft, &activeAircraft, &controller);
char pluginName[256];
XPLMGetPluginInfo(controller, pluginName, nullptr, nullptr, nullptr);
*owner = std::string(pluginName);
return m_enabledMultiplayer;
}
void CTraffic::cleanup()
{
removeAllPlanes();
if (m_enabled)
if (m_enabledMultiplayer)
{
m_enabled = false;
m_enabledMultiplayer = false;
XPMPMultiplayerDisable();
}
@@ -474,7 +501,20 @@ namespace XSwiftBus
}
else if (message.getInterfaceName() == XSWIFTBUS_TRAFFIC_INTERFACENAME)
{
if (message.getMethodName() == "initialize")
if (message.getMethodName() == "acquireMultiplayerPlanes")
{
queueDBusCall([ = ]()
{
std::string owner;
bool acquired = acquireMultiplayerPlanes(&owner);
CDBusMessage reply = CDBusMessage::createReply(sender, serial);
reply.beginArgumentWrite();
reply.appendArgument(acquired);
reply.appendArgument(owner);
sendDBusMessage(reply);
});
}
else if (message.getMethodName() == "initialize")
{
sendDBusReply(sender, serial, initialize());
}