swift
client.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "misc/network/client.h"
5 
6 #include <QPixmap>
7 #include <QString>
8 #include <QStringBuilder>
9 #include <QStringList>
10 
11 #include "misc/aviation/callsign.h"
12 #include "misc/iconlist.h"
14 #include "misc/propertyindexvariantmap.h" // needed for mixin::Index::apply
15 
16 SWIFT_DEFINE_VALUEOBJECT_MIXINS(swift::misc::network, CClient)
17 
18 namespace swift::misc::network
19 {
20  QString CClient::convertToQString(bool i18n) const
21  {
22  return m_user.toQString(i18n) % QStringLiteral(" capabilites: ") % this->getCapabilitiesAsString() %
23  QStringLiteral(" model: ") % m_modelString %
24  (m_server.isEmpty() ? QString() : QStringLiteral("server: ") % m_server);
25  }
26 
27  CClient::CClient(const aviation::CCallsign &callsign, const QString &modelString)
28  : m_user(CUser(callsign)), m_modelString(modelString.trimmed())
29  {}
30 
31  bool CClient::isValid() const { return m_user.hasCallsign(); }
32 
34  {
35  Capabilities cap = this->getCapabilities();
36  cap |= capability;
37  this->setCapabilities(cap);
38  }
39 
41  {
42  Capabilities cap = this->getCapabilities();
43  cap &= ~capability;
44  this->setCapabilities(cap);
45  }
46 
47  void CClient::setCapabilities(const Capabilities &capabilities) { m_capabilities = capabilities; }
48 
50  {
51  QStringList sl;
52  const Capabilities cap = this->getCapabilities();
53  if (cap.testFlag(FsdAtisCanBeReceived)) sl << "ATIS";
54  if (cap.testFlag(FsdWithInterimPositions)) sl << "interim pos.";
55  if (cap.testFlag(FsdWithIcaoCodes)) sl << "ICAO";
56  if (cap.testFlag(FsdWithAircraftConfig)) sl << "aircraft config";
57  if (cap.testFlag(FsdWithGroundFlag)) sl << "gnd.flag";
58  if (cap.testFlag(FsdModelString)) sl << "modelstring";
59  if (cap.testFlag(FsdWithVisualPositions)) sl << "visual pos.";
60  if (sl.isEmpty()) { return {}; }
61  return sl.join(", ");
62  }
63 
64  bool CClient::hasCapability(Capability capability) const { return this->getCapabilities().testFlag(capability); }
65 
67 
69 
70  bool CClient::setUserCallsign(const aviation::CCallsign &callsign) { return m_user.setCallsign(callsign); }
71 
72  void CClient::setQueriedModelString(const QString &modelString)
73  {
74  m_modelString = modelString.trimmed();
75  if (!modelString.isEmpty()) { this->addCapability(CClient::FsdModelString); }
76  }
77 
79  {
80  if (!m_swift) { return m_user.toIcon(); }
81 
82  return CIcons::Swift16;
83  }
84 
86  {
87  if (index.isMyself()) { return QVariant::fromValue(*this); }
88  const ColumnIndex i = index.frontCasted<ColumnIndex>();
89  switch (i)
90  {
91  case IndexCapabilities: return QVariant::fromValue(m_capabilities);
92  case IndexCapabilitiesString: return QVariant(this->getCapabilitiesAsString());
93  case IndexCallsign: return this->getCallsign().propertyByIndex(index.copyFrontRemoved());
94  case IndexUser: return this->getUser().propertyByIndex(index.copyFrontRemoved());
95  case IndexModelString: return QVariant(m_modelString);
96  case IndexServer: return QVariant(m_server);
97  case IndexVoiceCapabilities: return m_voiceCapabilities.propertyByIndex(index.copyFrontRemoved());
98  case IndexVoiceCapabilitiesPixmap: return QVariant::fromValue(CIcon(m_voiceCapabilities.toIcon()).toPixmap());
99  case IndexVoiceCapabilitiesIcon: return QVariant::fromValue(CIcon(m_voiceCapabilities.toIcon()));
100  case IndexVoiceCapabilitiesString: return QVariant(m_voiceCapabilities.toQString(true));
101  default: break;
102  }
103  return CValueObject::propertyByIndex(index);
104  }
105 
106  void CClient::setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
107  {
108  if (index.isMyself())
109  {
110  (*this) = variant.value<CClient>();
111  return;
112  }
113  const ColumnIndex i = index.frontCasted<ColumnIndex>();
114  switch (i)
115  {
116  case IndexCapabilities: m_capabilities = variant.toInt(); break;
117  case IndexModelString: m_modelString = variant.toString(); break;
118  case IndexServer: m_server = variant.toString(); break;
119  case IndexUser: m_user.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
120  case IndexCallsign: m_user.setCallsign(variant.value<swift::misc::aviation::CCallsign>()); break;
121  case IndexVoiceCapabilities: m_voiceCapabilities.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
122  default: CValueObject::setPropertyByIndex(index, variant); break;
123  }
124  }
125 } // namespace swift::misc::network
Value object for icons. An icon is stored in the global icon repository and identified by its index....
Definition: icon.h:39
QPixmap toPixmap() const
Corresponding pixmap.
Definition: icon.cpp:34
IconIndex
Index for each icon, allows to send them via DBus, efficiently store them, etc.
Definition: icons.h:32
Non-owning reference to a CPropertyIndex with a subset of its features.
Q_REQUIRED_RESULT CPropertyIndexRef copyFrontRemoved() const
Copy with first element removed.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: callsign.cpp:310
ColumnIndex
Base class enums.
Definition: mixinindex.h:44
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: mixinindex.h:160
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: mixinindex.h:167
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Another client software.
Definition: client.h:27
bool hasCapability(Capability capability) const
Has capability?
Definition: client.cpp:64
bool hasAircraftPartsCapability() const
Supports aircraft parts?
Definition: client.cpp:66
void addCapability(Capability capability)
Add capability.
Definition: client.cpp:33
CClient()=default
Default constructor.
bool hasGndFlagCapability() const
Supports gnd.flag?
Definition: client.cpp:68
Capabilities getCapabilities() const
Get capabilities.
Definition: client.h:77
void setQueriedModelString(const QString &modelString)
Set model.
Definition: client.cpp:72
void setCapabilities(const Capabilities &capabilities)
Set capabilities.
Definition: client.cpp:47
void setPropertyByIndex(swift::misc::CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: client.cpp:106
const CUser & getUser() const
User.
Definition: client.h:119
bool isValid() const
Is valid.
Definition: client.cpp:31
QVariant propertyByIndex(swift::misc::CPropertyIndexRef index) const
Property by index.
Definition: client.cpp:85
QString convertToQString(bool i18n=false) const
Cast as QString.
Definition: client.cpp:20
bool setUserCallsign(const swift::misc::aviation::CCallsign &callsign)
User's callsign.
Definition: client.cpp:70
void removeCapability(Capability capability)
Remove capability.
Definition: client.cpp:40
Capability
The Capabilities enum.
Definition: client.h:46
@ FsdWithVisualPositions
visual position updates
Definition: client.h:54
@ FsdWithAircraftConfig
Aircraft parts.
Definition: client.h:51
@ FsdWithIcaoCodes
basically means it is a pilot client handling ICAO code packages
Definition: client.h:49
@ FsdWithGroundFlag
supports gnd.
Definition: client.h:52
@ FsdModelString
model string can be queried
Definition: client.h:53
@ FsdWithInterimPositions
fast position updates
Definition: client.h:48
CIcons::IconIndex toIcon() const
As icon, not implemented by all classes.
Definition: client.cpp:78
const aviation::CCallsign & getCallsign() const
Callsign used with other client.
Definition: client.h:68
QString getCapabilitiesAsString() const
Get capabilities.
Definition: client.cpp:49
Value object encapsulating information of a user.
Definition: user.h:28
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: user.cpp:241
bool setCallsign(const aviation::CCallsign &callsign)
Set associated callsign.
Definition: user.cpp:62
CIcons::IconIndex toIcon() const
As icon, not implemented by all classes.
Definition: user.h:146
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: user.cpp:259
bool hasCallsign() const
Has associated callsign?
Definition: user.h:89
CIcons::IconIndex toIcon() const
As icon, not implemented by all classes.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67