Ref T261, correct implementation of client provider

* made the interface a "real" interface and provided implementation as CCLientProvider
* aligned some function names with networl context
* network context "impl" also implements ICLientProvider
This commit is contained in:
Klaus Basan
2018-05-04 22:13:02 +02:00
committed by Roland Winklmeier
parent 3031e5b648
commit 5bf21c2937
19 changed files with 185 additions and 65 deletions

View File

@@ -50,7 +50,6 @@ namespace BlackMisc
Capabilities cap = this->getCapabilities();
cap &= ~capability;
this->setCapabilities(cap);
}
void CClient::setCapabilities(const Capabilities &capabilities)
@@ -60,8 +59,8 @@ namespace BlackMisc
QString CClient::getCapabilitiesAsString() const
{
const Capabilities cap = this->getCapabilities();
QStringList sl;
const Capabilities cap = this->getCapabilities();
if (cap.testFlag(FsdAtisCanBeReceived)) sl << "ATIS";
if (cap.testFlag(FsdWithInterimPositions)) sl << "interim pos.";
if (cap.testFlag(FsdWithIcaoCodes)) sl << "ICAO";

View File

@@ -52,12 +52,12 @@ namespace BlackMisc
enum Capability
{
None = 0,
FsdWithInterimPositions = 1 << 0,
FsdWithInterimPositions = 1 << 0, //!< fast position updates
FsdWithIcaoCodes = 1 << 1, //!< basically means it is a pilot client handling ICAO code packages
FsdAtisCanBeReceived = 1 << 2, //!< ATIS
FsdWithAircraftConfig = 1 << 3, //!< Aircraft parts
FsdWithGroundFlag = 1 << 4, //!< supports gnd. flag (in position)
FsdModelString = 1 << 5
FsdModelString = 1 << 5 //!< model string can be queried
};
Q_DECLARE_FLAGS(Capabilities, Capability)
@@ -171,5 +171,6 @@ namespace BlackMisc
} // namespace
Q_DECLARE_METATYPE(BlackMisc::Network::CClient)
Q_DECLARE_METATYPE(BlackMisc::Network::CClient::Capability)
#endif // guard

View File

@@ -16,41 +16,48 @@ namespace BlackMisc
{
namespace Network
{
CClientList IClientProvider::getClients() const
CClientList CClientProvider::getClients() const
{
QReadLocker l(&m_lockClient);
return m_clients;
}
void IClientProvider::setClients(const CClientList &clients)
void CClientProvider::setClients(const CClientList &clients)
{
QWriteLocker l(&m_lockClient);
m_clients = clients;
}
void IClientProvider::clearClients()
void CClientProvider::clearClients()
{
QWriteLocker l(&m_lockClient);
m_clients.clear();
}
CClientList IClientProvider::getClientsForCallsigns(const CCallsignSet &callsigns) const
CClientList CClientProvider::getClientsForCallsigns(const CCallsignSet &callsigns) const
{
return this->getClients().findByCallsigns(callsigns);
}
CClient IClientProvider::getClientOrDefaultForCallsign(const CCallsign &callsign) const
CClient CClientProvider::getClientOrDefaultForCallsign(const CCallsign &callsign) const
{
const CClientList clients(this->getClients());
return clients.findFirstByCallsign(callsign);
}
bool IClientProvider::hasClientInfo(const CCallsign &callsign) const
bool CClientProvider::setOtherClient(const CClient &client)
{
QWriteLocker l(&m_lockClient);
m_clients.replaceOrAddObjectByCallsign(client);
return true;
}
bool CClientProvider::hasClientInfo(const CCallsign &callsign) const
{
return this->getClients().containsCallsign(callsign);
}
bool IClientProvider::addNewClient(const CClient &client)
bool CClientProvider::addNewClient(const CClient &client)
{
const CCallsign callsign = client.getCallsign();
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "invalid callsign");
@@ -60,7 +67,7 @@ namespace BlackMisc
return true;
}
int IClientProvider::updateOrAddClient(const CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues)
int CClientProvider::updateOrAddClient(const CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues)
{
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Missing callsign");
int c = 0;
@@ -78,13 +85,13 @@ namespace BlackMisc
return c;
}
int IClientProvider::removeClient(const CCallsign &callsign)
int CClientProvider::removeClient(const CCallsign &callsign)
{
QWriteLocker l(&m_lockClient);
return m_clients.removeByCallsign(callsign);
}
bool IClientProvider::autoAdjustCientGndCapability(const CAircraftSituation &situation)
bool CClientProvider::autoAdjustCientGndCapability(const CAircraftSituation &situation)
{
if (situation.getCallsign().isEmpty()) { return false; } // no callsign
if (!situation.isOnGround()) { return false; } // nothing to adjust

View File

@@ -28,43 +28,67 @@ namespace BlackMisc
public:
//! Get other clients
//! \threadsafe
CClientList getClients() const;
virtual CClientList getClients() const = 0;
//! Set other clients
//! \threadsafe
void setClients(const CClientList &clients);
virtual void setClients(const CClientList &clients) = 0;
//! Set other clients
//! \threadsafe
void clearClients();
virtual void clearClients() = 0;
//! Returns a list of other clients corresponding to the given callsigns
//! \threadsafe
BlackMisc::Network::CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const;
virtual CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const = 0;
//! Other client for the given callsigns
//! \threadsafe
BlackMisc::Network::CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const;
virtual CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const = 0;
//! Client info for given callsign?
//! \threadsafe
bool hasClientInfo(const Aviation::CCallsign &callsign) const;
virtual bool hasClientInfo(const Aviation::CCallsign &callsign) const = 0;
//! Add a new client, if existing nothing will be added
//! \threadsafe
bool addNewClient(const CClient &client);
virtual bool addNewClient(const CClient &client) = 0;
//! Set client for its callsign
//! \threadsafe
virtual bool setOtherClient(const BlackMisc::Network::CClient &client) = 0;
//! Update or add a client
//! \threadsafe
int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues = true);
virtual int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues = true) = 0;
//! Remove client
//! \threadsafe
int removeClient(const Aviation::CCallsign &callsign);
virtual int removeClient(const Aviation::CCallsign &callsign) = 0;
//! Adjust gnd.flag capability from situation
//! \threadsafe
bool autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation);
virtual bool autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation) = 0;
};
//! Direct in memory access to client (network client) data
class BLACKMISC_EXPORT CClientProvider : public IClientProvider
{
public:
//! \ingroup clientprovider
//! @{
virtual CClientList getClients() const override;
virtual void setClients(const CClientList &clients) override;
virtual void clearClients() override;
virtual CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const override;
virtual CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const override;
virtual bool hasClientInfo(const Aviation::CCallsign &callsign) const override;
virtual bool addNewClient(const CClient &client) override;
virtual bool setOtherClient(const BlackMisc::Network::CClient &client) override;
virtual int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues = true) override;
virtual int removeClient(const Aviation::CCallsign &callsign) override;
virtual bool autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation) override;
//! @}
private:
CClientList m_clients;
@@ -75,35 +99,35 @@ namespace BlackMisc
class BLACKMISC_EXPORT CClientAware : public IProviderAware<IClientProvider>
{
public:
//! \copydoc IClientProvider::getClients
//! \copydoc CClientProvider::getClients
CClientList getClients() const;
//! \copydoc IClientProvider::setClients
//! \copydoc CClientProvider::setClients
void setClients(const CClientList &clients);
//! \copydoc IClientProvider::clearClients
//! \copydoc CClientProvider::clearClients
void clearClients();
//! \copydoc IClientProvider::getClientsForCallsigns
//! \copydoc CClientProvider::getClientsForCallsigns
BlackMisc::Network::CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const;
//! \copydoc IClientProvider::getClientOrDefaultForCallsign
//! \copydoc CClientProvider::getClientOrDefaultForCallsign
BlackMisc::Network::CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const;
//! \copydoc IClientProvider::hasClientInfo
//! \copydoc CClientProvider::hasClientInfo
bool hasClientInfo(const Aviation::CCallsign &callsign) const;
//! \copydoc IClientProvider::addNewClient
//! \copydoc CClientProvider::addNewClient
bool addNewClient(const CClient &client);
//! \copydoc IClientProvider::updateOrAddClient
//! \copydoc CClientProvider::updateOrAddClient
int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues);
//! \copydoc IClientProvider::removeClient
//! \copydoc CClientProvider::removeClient
int removeClient(const Aviation::CCallsign &callsign);
//! Provider
void setClientProvider(IClientProvider *provider) { this->setProvider(provider); }
void setClientProvider(CClientProvider *provider) { this->setProvider(provider); }
protected:
//! Default constructor
@@ -114,7 +138,7 @@ namespace BlackMisc
};
//! Client provider dummy for testing
class BLACKMISC_EXPORT CClientProviderDummy: public IClientProvider
class BLACKMISC_EXPORT CClientProviderDummy: public CClientProvider
{
public:
//! Dummy instance

View File

@@ -18,6 +18,7 @@ namespace BlackMisc
{
CAuthenticatedUser::registerMetadata();
CClient::registerMetadata();
qDBusRegisterMetaType<CClient::Capability>();
CClientList::registerMetadata();
CEcosystem::registerMetadata();
CEcosystemList::registerMetadata();