6 #include <QDBusConnection>
7 #include <QElapsedTimer>
11 #include <QStringBuilder>
40 using namespace swift::misc::aviation;
41 using namespace swift::misc::simulation;
43 using namespace swift::core::context;
47 CCoreFacade::CCoreFacade(
const CCoreFacadeConfig &config, QObject *parent) : QObject(parent), m_config(config)
60 if (dBusAddress.isEmpty())
65 if (!CContextApplicationProxy::isContextResponsive(dBusAddress, connectMsg))
68 u
"Cannot connect DBus at '" % dBusAddress % u
"', reason: " % connectMsg);
79 void CCoreFacade::init()
81 if (m_initalized || m_shuttingDown) {
return; }
89 m_launcherSetup.setProperty(CLauncherSetup::IndexDBusAddress, dbusAddress);
96 this->initDBusConnection(dbusAddress);
97 if (!m_dbusConnection.isConnected())
99 const QString e = m_dbusConnection.lastError().message();
100 SWIFT_VERIFY_X(
false,
"CRuntime::init DBus problem", e.toUtf8().constData());
105 times.insert(
"DBus", time.restart());
117 default: qFatal(
"Invalid application context mode");
122 m_logHistorySource->
initialize(m_dataLinkDBus);
137 if (m_contextApplication) { m_contextApplication->deleteLater(); }
138 m_contextApplication = IContextApplication::create(
this, m_config.
getMode(), m_dbusServer, m_dbusConnection);
139 times.insert(
"Application", time.restart());
141 if (m_contextAudio) { m_contextAudio->deleteLater(); }
142 m_contextAudio = qobject_cast<CContextAudioBase *>(
143 IContextAudio::create(
this, m_config.
getMode(), m_dbusServer, m_dbusConnection));
144 times.insert(
"Audio", time.restart());
146 if (m_contextOwnAircraft) { m_contextOwnAircraft->deleteLater(); }
147 m_contextOwnAircraft = IContextOwnAircraft::create(
this, m_config.
getMode(), m_dbusServer, m_dbusConnection);
148 times.insert(
"Own aircraft", time.restart());
150 if (m_contextSimulator) { m_contextSimulator->deleteLater(); }
151 m_contextSimulator = IContextSimulator::create(
this, m_config.
getMode(), m_dbusServer, m_dbusConnection);
152 times.insert(
"Simulator", time.restart());
155 if (m_contextNetwork) { m_contextNetwork->deleteLater(); }
156 m_contextNetwork = IContextNetwork::create(
this, m_config.
getMode(), m_dbusServer, m_dbusConnection);
157 times.insert(
"Network", time.restart());
165 Q_ASSERT(!m_contextNetwork ||
170 this->initPostSetup(times);
171 times.insert(
"Post setup", time.restart());
186 bool handled =
false;
207 void CCoreFacade::initDBusServer(
const QString &dBusAddress)
209 Q_ASSERT(!dBusAddress.isEmpty());
210 if (m_dbusServer) { m_dbusServer->deleteLater(); }
212 CLogMessage(
this).
info(u
"DBus server on address: '%1'") << dBusAddress;
222 times.insert(
"Post setup, connects first", time.restart());
233 Q_ASSERT_X(this->
getCContextNetwork()->airspace(), Q_FUNC_INFO,
"No airspace object");
235 c = connect(m_contextNetwork, &IContextNetwork::textMessagesReceived, this->
getCContextSimulator(),
236 &CContextSimulator::xCtxTextMessagesReceived, Qt::QueuedConnection);
241 c = connect(m_contextNetwork, &IContextNetwork::readyForModelMatching, this->
getCContextSimulator(),
242 &CContextSimulator::xCtxAddedRemoteAircraftReadyForModelMatching, Qt::QueuedConnection);
245 &CContextSimulator::xCtxRemovedRemoteAircraft, Qt::QueuedConnection);
247 c = connect(m_contextNetwork, &IContextNetwork::changedRemoteAircraftModel,
249 Qt::QueuedConnection);
251 c = connect(m_contextNetwork, &IContextNetwork::changedRemoteAircraftEnabled,
253 Qt::QueuedConnection);
255 c = connect(m_contextNetwork, &IContextNetwork::connectionStatusChanged, this->
getCContextSimulator(),
256 &CContextSimulator::xCtxNetworkConnectionStatusChanged, Qt::QueuedConnection);
258 c = connect(this->
getCContextNetwork()->airspace(), &CAirspaceMonitor::requestedNewAircraft,
260 Qt::QueuedConnection);
264 Qt::QueuedConnection);
268 Qt::QueuedConnection);
278 c = connect(m_contextOwnAircraft, &IContextOwnAircraft::changedAircraftCockpit,
281 c = connect(m_contextOwnAircraft, &IContextOwnAircraft::changedSelcal, this->
getCContextSimulator(),
282 &CContextSimulator::xCtxUpdateSimulatorSelcalFromContext);
308 times.insert(
"Post setup, sim.connects", time.restart());
315 Q_ASSERT(m_contextApplication);
316 c = connect(m_contextNetwork, &IContextNetwork::connectionStatusChanged, this->
getCContextAudioBase(),
317 &CContextAudio::xCtxNetworkConnectionStatusChanged, Qt::QueuedConnection);
319 times.insert(
"Post setup, connects audio", time.restart());
337 if (!m_initalized) {
return; }
338 if (m_shuttingDown) {
return; }
339 m_shuttingDown =
true;
346 m_logHistory =
nullptr;
347 delete m_logHistorySource;
348 m_logHistorySource =
nullptr;
349 delete m_dataLinkDBus;
350 m_dataLinkDBus =
nullptr;
363 m_contextAudio =
nullptr;
377 QDBusConnection defaultConnection(
"default");
390 QDBusConnection defaultConnection(
"default");
399 QDBusConnection defaultConnection(
"default");
400 m_contextOwnAircraft =
408 QDBusConnection defaultConnection(
"default");
409 m_contextApplication =
414 void CCoreFacade::initDBusConnection(
const QString &address)
416 if (m_initDBusConnection) {
return; }
419 QDBusConnection::disconnectFromBus(m_dbusConnection.name());
420 m_dbusConnection = QDBusConnection::sessionBus();
424 QDBusConnection::disconnectFromBus(m_dbusConnection.name());
425 m_dbusConnection = QDBusConnection::systemBus();
430 QDBusConnection::disconnectFromPeer(name);
431 m_dbusConnection = QDBusConnection::connectToPeer(address, name);
462 "Cannot downcast to local object");
469 "Cannot downcast to local object");
476 "Cannot downcast to local object");
483 "Cannot downcast to local object");
490 "Cannot downcast to local object");
497 "Cannot downcast to local object");
504 "Cannot downcast to local object");
511 "Cannot downcast to local object");
518 "Cannot downcast to local object");
525 "Cannot downcast to local object");
Configuration object for the contexts.
bool hasDBusAddress() const
DBus address?
bool requiresDBusSever() const
Requires server (at least one in server)?
ContextMode getMode() const
Mode.
bool requiresDBusConnection() const
Requires DBus connection (at least one remote)?
@ NotUsed
during shutdown or not used at all
@ Local
context runs in same process
@ Remote
context runs in a different process.
@ LocalInDBusServer
context runs in same process.
QString getDBusAddress() const
DBus address.
context::CContextSimulator * getCContextSimulator()
Context for simulator.
void gracefulShutdown()
Clean up (will be connected to signal QCoreApplication::aboutToQuit)
context::IContextAudio * getIContextAudio()
Context for audio.
context::IContextOwnAircraft * getIContextOwnAircraft()
Context for own aircraft.
context::IContextApplication * getIContextApplication()
Context for application.
QString getDBusAddress() const
DBus address if any.
context::IContextNetwork * getIContextNetwork()
Context for network.
bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)
Parse command line in all contexts.
context::CContextAudio * getCContextAudio()
Context for audio.
context::IContextSimulator * getIContextSimulator()
Context for simulator.
context::CContextApplication * getCContextApplication()
Context for application.
swift::misc::CStatusMessage tryToReconnectWithDBus()
In case connection between DBus parties is lost, try to reconnect.
context::CContextNetwork * getCContextNetwork()
Context for network.
context::CContextOwnAircraft * getCContextOwnAircraft()
Context for own aircraft.
static void registerMetadata()
Register metadata.
context::CContextAudioBase * getCContextAudioBase()
Context for audio.
Audio context base class.
void gracefulShutdown()
Graceful shutdown.
Audio context implementation.
Network context implementation.
void gracefulShutdown()
Gracefully shut down, e.g. for thread safety.
void setSimulationEnvironmentProvider(swift::misc::simulation::ISimulationEnvironmentProvider *provider)
Set the provider.
Own aircraft context implementation. Central instance of data for.
Network simulator concrete implementation.
void gracefulShutdown()
Gracefully shut down, e.g. for plugin unloading.
Application context interface.
bool isUsingImplementingObject() const
Using local implementing object?
virtual bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)=0
Parse a given command line.
virtual swift::misc::CStatusMessage disconnectFromNetwork()=0
Disconnect from network.
const QString & getDBusAddress() const
Destructor.
void removeAllObjects()
Remove all objects added with addObject.
static const QString & systemBusAddress()
Address denoting a system bus server.
static const QString & sessionBusAddress()
Address denoting a session bus server.
static const QString & p2pConnectionName()
P2P connection name.
static const QString & coreServiceName()
Default service name.
Value object encapsulating information identifying a component of a modular distributed swift process...
Records all log messages to a list that persists for the lifetime of the application.
Allows distributed insertion of log messages into a central CLogHistory.
Class for emitting a log message.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
Streamable status message, e.g.
constexpr static auto SeverityError
Status severities.
constexpr static auto SeverityInfo
Status severities.
A transport mechanism using signals and slots distributed by DBus.
void initializeRemote(const QDBusConnection &connection, const QString &service)
Initialize on client side.
void initializeLocal(CDBusServer *server=nullptr)
Initialize on server side.
void initialize(IDataLink *)
Publish using the given transport mechanism.
void initialize(IDataLink *)
Publish using the given transport mechanism.
Aircraft model (used by another pilot, my models on disk)
Core data traits (aka cached values) and classes.
Backend services of the swift project, like dealing with the network or the simulators.
void registerMetadata()
Register all relevant metadata in swift::core.
Free functions in swift::misc.
void registerMetadata()
Register all relevant metadata in Misc.
QString qmapToString(const QMap< K, V > &map)
A map converted to string.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.