Ref T259, Ref T243 use enum for client capabilities

This commit is contained in:
Klaus Basan
2018-03-08 18:46:02 +01:00
parent d7ac721d09
commit 32196f5e8e
6 changed files with 122 additions and 98 deletions

View File

@@ -38,37 +38,53 @@ namespace BlackMisc
return m_user.hasCallsign(); return m_user.hasCallsign();
} }
void CClient::setCapability(bool hasCapability, CClient::Capabilities capability) void CClient::addCapability(CClient::Capability capability)
{ {
m_capabilities.addValue(static_cast<int>(capability), hasCapability); Capabilities cap = this->getCapabilities();
cap |= capability;
this->setCapabilities(cap);
} }
void CClient::setCapabilities(const CPropertyIndexVariantMap &capabilities) void CClient::removeCapability(CClient::Capability capability)
{ {
m_capabilities = capabilities; Capabilities cap = this->getCapabilities();
cap &= ~capability;
this->setCapabilities(cap);
}
void CClient::setCapabilities(const Capabilities &capabilities)
{
m_capabilities = static_cast<int>(capabilities);
} }
QString CClient::getCapabilitiesAsString() const QString CClient::getCapabilitiesAsString() const
{ {
const Capabilities cap = this->getCapabilities();
QStringList sl; QStringList sl;
if (this->hasCapability(FsdAtisCanBeReceived)) sl << "ATIS"; if (cap.testFlag(FsdAtisCanBeReceived)) sl << "ATIS";
if (this->hasCapability(FsdWithInterimPositions)) sl << "interim pos."; if (cap.testFlag(FsdWithInterimPositions)) sl << "interim pos.";
if (this->hasCapability(FsdWithIcaoCodes)) sl << "ICAO"; if (cap.testFlag(FsdWithIcaoCodes)) sl << "ICAO";
if (this->hasCapability(FsdWithAircraftConfig)) sl << "aircraft config"; if (cap.testFlag(FsdWithAircraftConfig)) sl << "aircraft config";
if (sl.isEmpty()) return ""; if (cap.testFlag(FsdWithGroundFlag)) sl << "gnd.flag";
if (cap.testFlag(FsdModelString)) sl << "modelstring";
if (sl.isEmpty()) { return QStringLiteral(""); }
return sl.join(", "); return sl.join(", ");
} }
bool CClient::hasCapability(CClient::Capabilities capability) const bool CClient::hasCapability(Capability capability) const
{ {
if (m_capabilities.contains(capability)) return this->getCapabilities().testFlag(capability);
{ }
return m_capabilities.value(capability).toBool();
} bool CClient::hasAircraftPartsCapability() const
else {
{ return this->hasCapability(FsdWithAircraftConfig);
return false; }
}
bool CClient::hasGndFlagCapability() const
{
return this->hasCapability(FsdWithGroundFlag);
} }
void CClient::setUserCallsign(const Aviation::CCallsign &callsign) void CClient::setUserCallsign(const Aviation::CCallsign &callsign)
@@ -76,34 +92,29 @@ namespace BlackMisc
m_user.setCallsign(callsign); m_user.setCallsign(callsign);
} }
void CClient::setQueriedModelString(const QString &modelString)
{
m_modelString = modelString.trimmed();
if (!modelString.isEmpty()) { this->addCapability(CClient::FsdModelString); }
}
CVariant CClient::propertyByIndex(const CPropertyIndex &index) const CVariant CClient::propertyByIndex(const CPropertyIndex &index) const
{ {
if (index.isMyself()) { return CVariant::from(*this); } if (index.isMyself()) { return CVariant::from(*this); }
const ColumnIndex i = index.frontCasted<ColumnIndex>(); const ColumnIndex i = index.frontCasted<ColumnIndex>();
switch (i) switch (i)
{ {
case IndexCapabilities: case IndexCapabilities: return CVariant::fromValue(m_capabilities);
return CVariant::fromValue(m_capabilities); case IndexCapabilitiesString: return CVariant(this->getCapabilitiesAsString());
case IndexCapabilitiesString: case IndexCallsign: return this->getCallsign().propertyByIndex(index.copyFrontRemoved());
return CVariant(this->getCapabilitiesAsString()); case IndexUser: return this->getUser().propertyByIndex(index.copyFrontRemoved());
case IndexCallsign: case IndexModelString: return CVariant(m_modelString);
return this->getCallsign().propertyByIndex(index.copyFrontRemoved()); case IndexServer: return CVariant(m_server);
case IndexUser: case IndexVoiceCapabilities: return m_voiceCapabilities.propertyByIndex(index.copyFrontRemoved());
return this->getUser().propertyByIndex(index.copyFrontRemoved()); case IndexVoiceCapabilitiesPixmap: return CVariant::from(m_voiceCapabilities.toPixmap());
case IndexModelString: case IndexVoiceCapabilitiesIcon: return CVariant::fromValue(m_voiceCapabilities.toIcon());
return CVariant(m_modelString); case IndexVoiceCapabilitiesString: return CVariant(m_voiceCapabilities.toQString(true));
case IndexServer: default: return CValueObject::propertyByIndex(index);
return CVariant(m_server);
case IndexVoiceCapabilities:
return m_voiceCapabilities.propertyByIndex(index.copyFrontRemoved());
case IndexVoiceCapabilitiesPixmap:
return CVariant::from(m_voiceCapabilities.toPixmap());
case IndexVoiceCapabilitiesIcon:
return CVariant::fromValue(m_voiceCapabilities.toIcon());
case IndexVoiceCapabilitiesString:
return CVariant(m_voiceCapabilities.toQString(true));
default:
return CValueObject::propertyByIndex(index);
} }
} }
@@ -113,27 +124,13 @@ namespace BlackMisc
const ColumnIndex i = index.frontCasted<ColumnIndex>(); const ColumnIndex i = index.frontCasted<ColumnIndex>();
switch (i) switch (i)
{ {
case IndexCapabilities: case IndexCapabilities: m_capabilities = variant.toInt(); break;
m_capabilities = variant.value<CPropertyIndexVariantMap>(); case IndexModelString: m_modelString = variant.toQString(); break;
break; case IndexServer: m_server = variant.toQString(); break;
case IndexModelString: case IndexUser: m_user.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
m_modelString = variant.toQString(); case IndexCallsign: m_user.setCallsign(variant.value<BlackMisc::Aviation::CCallsign>()); break;
break; case IndexVoiceCapabilities: m_voiceCapabilities.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
case IndexServer: default: CValueObject::setPropertyByIndex(index, variant); break;
m_server = variant.toQString();
break;
case IndexUser:
m_user.setPropertyByIndex(index.copyFrontRemoved(), variant);
break;
case IndexCallsign:
m_user.setCallsign(variant.value<BlackMisc::Aviation::CCallsign>());
break;
case IndexVoiceCapabilities:
m_voiceCapabilities.setPropertyByIndex(index.copyFrontRemoved(), variant);
break;
default:
CValueObject::setPropertyByIndex(index, variant);
break;
} }
} }
} // namespace } // namespace

View File

@@ -12,18 +12,16 @@
#ifndef BLACKMISC_NETWORK_CLIENT_H #ifndef BLACKMISC_NETWORK_CLIENT_H
#define BLACKMISC_NETWORK_CLIENT_H #define BLACKMISC_NETWORK_CLIENT_H
#include "user.h"
#include "voicecapabilities.h"
#include "blackmisc/simulation/aircraftmodel.h"
#include "blackmisc/aviation/callsign.h" #include "blackmisc/aviation/callsign.h"
#include "blackmisc/blackmiscexport.h" #include "blackmisc/blackmiscexport.h"
#include "blackmisc/icon.h" #include "blackmisc/icon.h"
#include "blackmisc/metaclass.h" #include "blackmisc/metaclass.h"
#include "blackmisc/network/user.h"
#include "blackmisc/network/voicecapabilities.h"
#include "blackmisc/propertyindex.h" #include "blackmisc/propertyindex.h"
#include "blackmisc/propertyindexvariantmap.h"
#include "blackmisc/simulation/aircraftmodel.h"
#include "blackmisc/valueobject.h" #include "blackmisc/valueobject.h"
#include "blackmisc/variant.h" #include "blackmisc/variant.h"
#include <QMetaType> #include <QMetaType>
#include <QString> #include <QString>
@@ -51,25 +49,29 @@ namespace BlackMisc
}; };
//! The Capabilities enum //! The Capabilities enum
enum Capabilities enum Capability
{ {
FsdWithInterimPositions = CPropertyIndex::GlobalIndexClientCapabilities, //!< interim positions None = 0,
FsdWithIcaoCodes, //!< basically means it is a pilot client handling ICAO code pacakages FsdWithInterimPositions = 1 << 0,
FsdAtisCanBeReceived, //!< ATIS FsdWithIcaoCodes = 1 << 1, //!< basically means it is a pilot client handling ICAO code packages
FsdWithAircraftConfig //!< Aircraft parts FsdAtisCanBeReceived = 1 << 2, //!< ATIS
FsdWithAircraftConfig = 1 << 3, //!< Aircraft parts
FsdWithGroundFlag = 1 << 4, //!< supports gnd. flag (in position)
FsdModelString = 1 << 5
}; };
Q_DECLARE_FLAGS(Capabilities, Capability)
//! Default constructor. //! Default constructor.
CClient() = default; CClient() = default;
//! Construct by callsign and optional model string //! Construct by callsign and optional model string
CClient(const BlackMisc::Aviation::CCallsign &callsign, const QString &modelString = {}); CClient(const Aviation::CCallsign &callsign, const QString &modelString = {});
//! Constructor. //! Constructor.
CClient(const CUser &user) : m_user(user) {} CClient(const CUser &user) : m_user(user) {}
//! Callsign used with other client //! Callsign used with other client
const BlackMisc::Aviation::CCallsign &getCallsign() const { return m_user.getCallsign(); } const Aviation::CCallsign &getCallsign() const { return m_user.getCallsign(); }
//! ATC client //! ATC client
bool isAtc() const { return getCallsign().isAtcAlikeCallsign(); } bool isAtc() const { return getCallsign().isAtcAlikeCallsign(); }
@@ -78,19 +80,28 @@ namespace BlackMisc
bool isValid() const; bool isValid() const;
//! Get capabilities //! Get capabilities
CPropertyIndexVariantMap getCapabilities() const { return m_capabilities; } Capabilities getCapabilities() const { return static_cast<Capabilities>(m_capabilities); }
//! Set capability
void setCapability(bool hasCapability, Capabilities capability);
//! Set capabilities //! Set capabilities
void setCapabilities(const CPropertyIndexVariantMap &capabilities); void setCapabilities(const Capabilities &capabilities);
//! Get capabilities //! Get capabilities
QString getCapabilitiesAsString() const; QString getCapabilitiesAsString() const;
//! Has capability? //! Has capability?
bool hasCapability(Capabilities capability) const; bool hasCapability(Capability capability) const;
//! Supports aircraft parts?
bool hasAircraftPartsCapability() const;
//! Supports gnd.flag?
bool hasGndFlagCapability() const;
//! Add capability
void addCapability(Capability capability);
//! Remove capability
void removeCapability(Capability capability);
//! Get voice capabilities //! Get voice capabilities
const CVoiceCapabilities &getVoiceCapabilities() const { return m_voiceCapabilities;} const CVoiceCapabilities &getVoiceCapabilities() const { return m_voiceCapabilities;}
@@ -126,7 +137,7 @@ namespace BlackMisc
bool hasQueriedModelString() const { return !m_modelString.isEmpty(); } bool hasQueriedModelString() const { return !m_modelString.isEmpty(); }
//! Set model //! Set model
void setQueriedModelString(const QString &modelString) { m_modelString = modelString.trimmed(); } void setQueriedModelString(const QString &modelString);
//! \copydoc BlackMisc::Mixin::Icon::toIcon() //! \copydoc BlackMisc::Mixin::Icon::toIcon()
CIcon toIcon() const { return m_user.toIcon(); } CIcon toIcon() const { return m_user.toIcon(); }
@@ -142,7 +153,7 @@ namespace BlackMisc
private: private:
CUser m_user; CUser m_user;
CPropertyIndexVariantMap m_capabilities; int m_capabilities = static_cast<int>(None);
QString m_modelString; QString m_modelString;
QString m_server; QString m_server;
CVoiceCapabilities m_voiceCapabilities; CVoiceCapabilities m_voiceCapabilities;
@@ -151,7 +162,7 @@ namespace BlackMisc
CClient, CClient,
BLACK_METAMEMBER(user), BLACK_METAMEMBER(user),
BLACK_METAMEMBER(modelString), BLACK_METAMEMBER(modelString),
BLACK_METAMEMBER(capabilities, 0, DisabledForComparison | DisabledForJson), BLACK_METAMEMBER(capabilities),
BLACK_METAMEMBER(server), BLACK_METAMEMBER(server),
BLACK_METAMEMBER(voiceCapabilities) BLACK_METAMEMBER(voiceCapabilities)
); );

View File

@@ -17,5 +17,16 @@ namespace BlackMisc
CClientList::CClientList(const CSequence &other) : CSequence<CClient>(other) CClientList::CClientList(const CSequence &other) : CSequence<CClient>(other)
{ } { }
bool CClientList::hasCapability(const Aviation::CCallsign &callsign, CClient::Capability capability) const
{
return this->getCapabilities(callsign).testFlag(capability);
}
CClient::Capabilities CClientList::getCapabilities(const Aviation::CCallsign &callsign) const
{
if (this->isEmpty()) { return static_cast<CClient::Capabilities>(CClient::None); }
return this->findFirstByCallsign(callsign).getCapabilities();
}
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -27,8 +27,8 @@ namespace BlackMisc
//! Value object encapsulating a list of voice rooms. //! Value object encapsulating a list of voice rooms.
class BLACKMISC_EXPORT CClientList : class BLACKMISC_EXPORT CClientList :
public CSequence<CClient>, public CSequence<CClient>,
public BlackMisc::Aviation::ICallsignObjectList<CClient, CClientList>, public Aviation::ICallsignObjectList<CClient, CClientList>,
public BlackMisc::Mixin::MetaType<CClientList> public Mixin::MetaType<CClientList>
{ {
public: public:
BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CClientList) BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CClientList)
@@ -38,6 +38,12 @@ namespace BlackMisc
//! Construct from a base class object. //! Construct from a base class object.
CClientList(const CSequence &other); CClientList(const CSequence &other);
//! Has client for callsign the given capability?
bool hasCapability(const Aviation::CCallsign &callsign, CClient::Capability capability) const;
//! Capabilities of client for callsign
CClient::Capabilities getCapabilities(const Aviation::CCallsign &callsign) const;
}; };
} //namespace } //namespace
} // namespace } // namespace

View File

@@ -115,15 +115,14 @@ namespace BlackMisc
GlobalIndexCCoordinateGeodetic = 5200, GlobalIndexCCoordinateGeodetic = 5200,
GlobalIndexCElevationPlane = 5300, GlobalIndexCElevationPlane = 5300,
GlobalIndexCClient = 6000, GlobalIndexCClient = 6000,
GlobalIndexClientCapabilities = 6100, //!< used with map key GlobalIndexCUser = 6100,
GlobalIndexCUser = 6200, GlobalIndexCAuthenticatedUser = 6200,
GlobalIndexCAuthenticatedUser = 6300, GlobalIndexCRole = 6300,
GlobalIndexCRole = 6400, GlobalIndexCServer = 6400,
GlobalIndexCServer = 6500, GlobalIndexCFsdSetup = 6500,
GlobalIndexCFsdSetup = 6600, GlobalIndexCUrl = 6600,
GlobalIndexCUrl = 6700, GlobalIndexCUrlLog = 6700,
GlobalIndexCUrlLog = 6800, GlobalIndexCRemoteFile = 6800,
GlobalIndexCRemoteFile = 6900,
GlobalIndexCEcosystem = 7000, GlobalIndexCEcosystem = 7000,
GlobalIndexCRawFsdMessage = 7100, GlobalIndexCRawFsdMessage = 7100,
GlobalIndexCAircraftModel = 8000, GlobalIndexCAircraftModel = 8000,

View File

@@ -119,16 +119,16 @@ namespace BlackMisc
CClientList CTesting::getClients(int number) CClientList CTesting::getClients(int number)
{ {
BlackMisc::Network::CClientList list; CClientList list;
for (int i = 0; i < number; i++) for (int i = 0; i < number; i++)
{ {
CCallsign cs(QString("DXX%1").arg(i)); const CCallsign cs(QString("DXX%1").arg(i));
QString rn = QString("Joe Doe%1").arg(i); const QString rn = QString("Joe Doe%1").arg(i);
CUser user(QString::number(i), rn, cs); CUser user(QString::number(i), rn, cs);
user.setCallsign(cs); user.setCallsign(cs);
CClient client(user); CClient client(user);
client.setCapability(true, CClient::FsdWithInterimPositions); client.addCapability(CClient::FsdWithInterimPositions);
client.setCapability(true, CClient::FsdWithIcaoCodes); client.addCapability(CClient::FsdWithIcaoCodes);
const QString myFooModel = QString("fooModel %1").arg(i); const QString myFooModel = QString("fooModel %1").arg(i);
client.setQueriedModelString(myFooModel); client.setQueriedModelString(myFooModel);
list.push_back(client); list.push_back(client);