diff --git a/src/blackgui/models/serverlistmodel.cpp b/src/blackgui/models/serverlistmodel.cpp index 2687faa96..bb0ed559f 100644 --- a/src/blackgui/models/serverlistmodel.cpp +++ b/src/blackgui/models/serverlistmodel.cpp @@ -21,7 +21,7 @@ namespace BlackGui namespace Models { CServerListModel::CServerListModel(QObject *parent) : - CListModelBase("ModelServerList", parent) + CListModelBase("ServerListModel", parent) { this->m_columns.addColumn(CColumn::standardString("name", CServer::IndexName)); this->m_columns.addColumn(CColumn::standardString("description", CServer::IndexDescription)); @@ -31,12 +31,12 @@ namespace BlackGui this->m_columns.addColumn(CColumn::standardString("userid", { CServer::IndexUser, CUser::IndexId})); // force strings for translation in resource files - (void)QT_TRANSLATE_NOOP("ModelServerList", "name"); - (void)QT_TRANSLATE_NOOP("ModelServerList", "description"); - (void)QT_TRANSLATE_NOOP("ModelServerList", "address"); - (void)QT_TRANSLATE_NOOP("ModelServerList", "port"); - (void)QT_TRANSLATE_NOOP("ModelServerList", "realname"); - (void)QT_TRANSLATE_NOOP("ModelServerList", "userid"); + (void)QT_TRANSLATE_NOOP("ServerListModel", "name"); + (void)QT_TRANSLATE_NOOP("ServerListModel", "description"); + (void)QT_TRANSLATE_NOOP("ServerListModel", "address"); + (void)QT_TRANSLATE_NOOP("ServerListModel", "port"); + (void)QT_TRANSLATE_NOOP("ServerListModel", "realname"); + (void)QT_TRANSLATE_NOOP("ServerListModel", "userid"); } } // class diff --git a/src/blackgui/models/serverlistmodel.h b/src/blackgui/models/serverlistmodel.h index 0e0fb87e2..8e5eef7c5 100644 --- a/src/blackgui/models/serverlistmodel.h +++ b/src/blackgui/models/serverlistmodel.h @@ -25,10 +25,9 @@ namespace BlackGui namespace Models { //! Server list model - class BLACKGUI_EXPORT CServerListModel : public CListModelBase + class BLACKGUI_EXPORT CServerListModel : public CListModelBase { public: - //! Constructor explicit CServerListModel(QObject *parent = nullptr); diff --git a/src/blackmisc/network/server.cpp b/src/blackmisc/network/server.cpp index 7b612b924..da96d69bc 100644 --- a/src/blackmisc/network/server.cpp +++ b/src/blackmisc/network/server.cpp @@ -13,6 +13,7 @@ #include "blackmisc/logcategorylist.h" #include "blackmisc/propertyindex.h" #include "blackmisc/statusmessage.h" +#include "blackmisc/comparefunctions.h" #include "blackmisc/variant.h" #include @@ -28,12 +29,17 @@ namespace BlackMisc QString CServer::convertToQString(bool i18n) const { QString s(this->m_name); - s.append(" ").append(this->m_description); - s.append(" ").append(this->m_address); - s.append(" ").append(QString::number(this->m_port)); - s.append(" ").append(this->m_user.toQString(i18n)); - s.append(" ").append(boolToYesNo(this->m_isAcceptingConnections)); - s.append(" ").append(this->m_fsdSetup.toQString(i18n)); + s.append(' ').append(this->m_description); + s.append(' ').append(this->m_address); + s.append(' ').append(QString::number(this->m_port)); + s.append(' ').append(this->m_user.toQString(i18n)); + s.append(' ').append(boolToYesNo(this->m_isAcceptingConnections)); + s.append(' ').append(this->m_fsdSetup.toQString(i18n)); + + if (this->isConnected()) + { + s.append(" connected: ").append(this->getFormattedUtcTimestampHms()); + } return s; } @@ -65,6 +71,11 @@ namespace BlackMisc return m_port > 0 && !m_address.isEmpty(); } + bool CServer::isConnected() const + { + return this->m_timestampMSecsSinceEpoch >= 0; + } + CStatusMessageList CServer::validate() const { static const CLogCategoryList cats(CLogCategoryList(this).join({ CLogCategory::validation()})); @@ -79,10 +90,19 @@ namespace BlackMisc return msgs; } + QString CServer::getServerSessionId() const + { + if (!this->isConnected()) { return ""; } + const QString session("%1 %2:%3 %4 %5"); + return session.arg(this->getName(), this->getAddress()).arg(this->getPort()).arg(this->getUser().getRealName(), this->getFormattedUtcTimestampHms()); + } + CVariant CServer::propertyByIndex(const BlackMisc::CPropertyIndex &index) const { if (index.isMyself()) { return CVariant::from(*this); } - ColumnIndex i = index.frontCasted(); + if (ITimestampBased::canHandleIndex(index)) { return ITimestampBased::propertyByIndex(index); } + + const ColumnIndex i = index.frontCasted(); switch (i) { case IndexAddress: @@ -107,7 +127,9 @@ namespace BlackMisc void CServer::setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant) { if (index.isMyself()) { (*this) = variant.to(); return; } - ColumnIndex i = index.frontCasted(); + if (ITimestampBased::canHandleIndex(index)) { ITimestampBased::setPropertyByIndex(index, variant); return; } + + const ColumnIndex i = index.frontCasted(); switch (i) { case IndexAddress: @@ -136,5 +158,33 @@ namespace BlackMisc break; } } + + int CServer::comparePropertyByIndex(const CPropertyIndex &index, const CServer &compareValue) const + { + if (index.isMyself()) { return this->getName().compare(compareValue.getName()); } + if (ITimestampBased::canHandleIndex(index)) { return ITimestampBased::comparePropertyByIndex(index, compareValue);} + const ColumnIndex i = index.frontCasted(); + switch (i) + { + case IndexAddress: + return this->getAddress().compare(compareValue.getAddress(), Qt::CaseInsensitive); + case IndexDescription: + return this->getDescription().compare(compareValue.getDescription(), Qt::CaseInsensitive); + case IndexFsdSetup: + return this->getFsdSetup().toQString().compare(compareValue.getFsdSetup().toQString()); + case IndexName: + return this->getName().compare(compareValue.getName(), Qt::CaseInsensitive); + case IndexIsAcceptingConnections: + return Compare::compare(this->isAcceptingConnections(), compareValue.isAcceptingConnections()); + case IndexPort: + return Compare::compare(this->getPort(), compareValue.getPort()); + case IndexUser: + return this->getUser().comparePropertyByIndex(index.copyFrontRemoved(), compareValue.getUser()); + default: + break; + } + Q_ASSERT_X(false, Q_FUNC_INFO, "No compare function"); + return 0; + } } // namespace } // namespace diff --git a/src/blackmisc/network/server.h b/src/blackmisc/network/server.h index 31111c34e..cfb800141 100644 --- a/src/blackmisc/network/server.h +++ b/src/blackmisc/network/server.h @@ -18,6 +18,7 @@ #include "blackmisc/network/fsdsetup.h" #include "blackmisc/propertyindex.h" #include "blackmisc/statusmessagelist.h" +#include "blackmisc/timestampbased.h" #include "blackmisc/valueobject.h" #include "blackmisc/variant.h" @@ -29,7 +30,9 @@ namespace BlackMisc namespace Network { //! Value object encapsulating information of a server - class BLACKMISC_EXPORT CServer : public CValueObject + class BLACKMISC_EXPORT CServer : + public CValueObject, + public BlackMisc::ITimestampBased { public: //! Properties by index @@ -89,10 +92,10 @@ namespace BlackMisc //! Set port void setPort(int port) { m_port = port; } - //! Server is accepting connections (allows to disable server temporarily) + //! Server is accepting connections (allows to disable server temporarily or generally) bool isAcceptingConnections() const { return m_isAcceptingConnections; } - //! Set whether server is accepting connections (allows to disable server temporarily) + //! Set whether server is accepting connections (allows to disable server temporarily or generally) void setIsAcceptingConnections(bool value) { m_isAcceptingConnections = value; } //! Is valid for login? @@ -107,15 +110,33 @@ namespace BlackMisc //! Set setup void setFsdSetup(const CFsdSetup &setup) { this->m_fsdSetup = setup; } + //! Connected since + QDateTime getConnectedSince() const { return this->getUtcTimestamp(); } + + //! Mark as connected since now + void setConnectedSinceNow() { this->setCurrentUtcTime(); } + + //! Mark as diconnected + void markAsDisconnected() { this->setTimestampToNull(); } + + //! Is connected? + bool isConnected() const; + //! Validate, provide details about issues BlackMisc::CStatusMessageList validate() const; + //! Identifying a session, if not connected empty + QString getServerSessionId() const; + //! \copydoc BlackMisc::Mixin::Index::propertyByIndex CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const; //! \copydoc BlackMisc::Mixin::Index::setPropertyByIndex void setPropertyByIndex(const BlackMisc::CPropertyIndex &index, const CVariant &variant); + //! Compare by index + int comparePropertyByIndex(const CPropertyIndex &index, const CServer &compareValue) const; + //! \copydoc BlackMisc::Mixin::String::toQString() QString convertToQString(bool i18n = false) const; @@ -126,7 +147,7 @@ namespace BlackMisc int m_port = -1; CUser m_user; CFsdSetup m_fsdSetup; - bool m_isAcceptingConnections = true; //!< temp. disable server + bool m_isAcceptingConnections = true; //!< disable server for connections BLACK_METACLASS( CServer, @@ -136,7 +157,8 @@ namespace BlackMisc BLACK_METAMEMBER(port), BLACK_METAMEMBER(user), BLACK_METAMEMBER(fsdSetup), - BLACK_METAMEMBER(isAcceptingConnections) + BLACK_METAMEMBER(isAcceptingConnections), + BLACK_METAMEMBER(timestampMSecsSinceEpoch, 0, DisabledForJson | DisabledForComparison) ); }; } // namespace diff --git a/src/blackmisc/timestampbased.cpp b/src/blackmisc/timestampbased.cpp index 951b7d230..2ea238134 100644 --- a/src/blackmisc/timestampbased.cpp +++ b/src/blackmisc/timestampbased.cpp @@ -30,9 +30,15 @@ namespace BlackMisc QDateTime ITimestampBased::getUtcTimestamp() const { + if (this->m_timestampMSecsSinceEpoch < 0) { return QDateTime(); } return QDateTime::fromMSecsSinceEpoch(this->m_timestampMSecsSinceEpoch, Qt::UTC); } + void ITimestampBased::setTimestampToNull() + { + this->m_timestampMSecsSinceEpoch = -1; + } + void ITimestampBased::setByYearMonthDayHourMinute(const QString &yyyyMMddhhmmsszzz) { // yyyy MM dd hh mm ss zzz diff --git a/src/blackmisc/timestampbased.h b/src/blackmisc/timestampbased.h index 51ad95cfe..4cd1fad35 100644 --- a/src/blackmisc/timestampbased.h +++ b/src/blackmisc/timestampbased.h @@ -44,6 +44,9 @@ namespace BlackMisc //! Timestamp as ms value qint64 getMSecsSinceEpoch() const { return m_timestampMSecsSinceEpoch; } + //! Set to null + void setTimestampToNull(); + //! Timestamp as ms value void setMSecsSinceEpoch(qint64 mSecsSinceEpoch) { m_timestampMSecsSinceEpoch = mSecsSinceEpoch; } diff --git a/src/blackmisc/timestampobjectlist.cpp b/src/blackmisc/timestampobjectlist.cpp index df82ef0d6..a54538921 100644 --- a/src/blackmisc/timestampobjectlist.cpp +++ b/src/blackmisc/timestampobjectlist.cpp @@ -20,6 +20,7 @@ #include "blackmisc/simulation/distributorlist.h" #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/distributorlist.h" +#include "blackmisc/simulation/matchingstatistics.h" #include "blackmisc/statusmessagelist.h" #include "blackmisc/timestampobjectlist.h" #include "blackmisc/predicates.h" @@ -225,19 +226,20 @@ namespace BlackMisc // see here for the reason of thess forward instantiations // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html //! \cond PRIVATE - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; - template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; + template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList; //! \endcond } // namespace